सहकारी
सहकारी एक हल्का उपयोगकर्ता-स्तरीय समवर्ती तंत्र है जो थ्रेड से भी अधिक हल्का होता है, जो प्रक्रिया में बहु-कार्य अनुसूची को लागू करता है। यह सहकारी के बीच स्विचिंग को नियंत्रित करने के लिए हैंग और पुनर्प्रारंभ करने का मैनुअल नियंत्रण करता है, जिससे प्रक्रिया के संदर्भ स्विचिंग के ओवरहेड से बचा जाता है।
workerman एक सामान्य सहकारी इंटरफेस प्रदान करता है, जो अंतर्गत Swoole/Swow/Fiber ड्राइवर्स के साथ स्वचालित रूप से संगत होता है।
संकेत
इस सुविधा के लिए workerman>=5.1.0 की आवश्यकता है।
ध्यान दें
- सहकारी केवल
SwooleSwowFiberड्राइवर का समर्थन करता है - यदि
Fiberड्राइवर का उपयोग करते समयcomposer require revolt/event-loopस्थापित करना आवश्यक है SwooleयाSwowड्राइवर PHP अवरोधक फ़ंक्शन को स्वचालित रूप से सहकारी में परिवर्तित कर सकते हैं, जिससे मूल समकालिक कोड का असमकालिक निष्पादन किया जा सके- लेकिन
FiberSwooleऔरSwowकी तरह खुद से सहकारी नहीं बना सकता, PHP के अंतर्निहित अवरोधक फंक्शंस का सामना करने पर यह पूरे प्रक्रिया को अवरुद्ध कर देगा, और सहकारी स्विचिंग नहीं होगी - जब
SwooleSwowFiberड्राइवर का उपयोग किया जाता है,workermanहर बारonWorkerStartonMessageonConnectonCloseआदि पर callbacks चलाते समय एक सहकारी बनाने के लिए स्वचालित रूप से प्रक्रिया करेगा - आप
$worker->eventLoop=xxx;का उपयोग करके विभिन्नworkerके लिए विभिन्न सहकारी ड्राइवर सेट कर सकते हैं
<?php
use Workerman\Connection\TcpConnection;
use Workerman\Coroutine;
use Workerman\Events\Swoole;
use Workerman\Events\Fiber;
use Workerman\Protocols\Http\Request;
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker1 = new Worker('http://0.0.0.0:8001');
$worker1->eventLoop = Swoole::class; // Swoole सहकारी का उपयोग करें
$worker1->onMessage = function (TcpConnection $connection, Request $request) {
Coroutine::create(function () {
echo file_get_contents("http://www.example.com/event/notify");
});
$connection->send('ok');
};
$worker2 = new Worker('http://0.0.0.0:8001');
$worker2->eventLoop = Fiber::class; // अंतर्निहित Fiber सहकारी का उपयोग करें
$worker2->onMessage = function (TcpConnection $connection, Request $request) {
Coroutine::create(function () {
echo file_get_contents("http://www.example.com/event/notify");
});
$connection->send('ok');
};
Worker::runAll();
सहकारी द्वारा प्रदान किए गए इंटरफ़ेस
interface CoroutineInterface
{
/**
* सहकारी बनाएं और तुरंत निष्पादित करें
*/
public static function create(callable $callable, ...$data): CoroutineInterface;
/**
* सहकारी चलाना शुरू करें
*/
public function start(mixed ...$args): mixed;
/**
* सहकारी को फिर से शुरू करें
*/
public function resume(mixed ...$args): mixed;
/**
* सहकारी id प्राप्त करें
*/
public function id(): int;
/**
* सहकारी नष्ट होने पर callback सेट करें
*/
public static function defer(callable $callable): void;
/**
* वर्तमान सहकारी को रोकें
*/
public static function suspend(mixed $value = null): mixed;
/**
* वर्तमान सहकारी प्राप्त करें
*/
public static function getCurrent(): CoroutineInterface|Fiber|SwowCoroutine|static;
/**
* जांचें कि क्या वर्तमान में सहकारी माहौल है
*/
public static function isCoroutine(): bool;
}
सहकारी के बारे में
फायदे
PHP ने सहकारी को लागू करने के बाद, इसका सबसे बड़ा लाभ यह है कि आप समकालिक तरीके से असमकालिक कोड लिख सकते हैं, जिससे कॉलबैक इन्फिनिटी से बचा जाता है, और कोड की पठनीयता और रखरखाव में सुधार होता है।
सहकारी IO-केंद्रित व्यवसायों की लचीलापन को काफी बढ़ा सकता है, जिससे कम प्रक्रियाओं के साथ अधिक थ्रूपुट प्राप्त करना संभव होता है।
नुकसान
हालांकि सहकारी को लागू करने के बाद डेवलपर्स को हमेशा वैश्विक चर प्रदूषण, संसाधनों की प्रतिस्पर्धा, तीसरे पक्ष की लाइब्रेरी में बदलाव जैसे समस्याओं पर ध्यान देना होगा, जिससे विकास और रखरखाव की लागत बढ़ जाती है और मानसिक बोझ स्पष्ट रूप से बढ़ जाता है।
सहकारी को लागू करने से सहकारी निर्माण, अनुसूचना, विनाश, कनेक्शन पूल जैसी अतिरिक्त लागतें आती हैं।
काफी मात्रा में लोड परीक्षण डेटा के अनुसार, जब CPU का पूरा उपयोग किया जाता है, तो सहकारी को लागू करने के बाद अधिकतम प्रदर्शन अवरोधित IO की तुलना में लगभग 10%-20% गिर जाता है।