निर्माणकर्ता कार्यक्षमता __construct
विवरण:
Worker::__construct([string $listen , array $context])
एक Worker कंटेनर उदाहरण प्रारंभ करें, इसमें कुछ विशेषताओं और कॉलबैक इंटरफेस को सेट किया जा सकता है, विशेष कार्यक्षमता को पूरा करने के लिए।
पैरामीटर
$listen (वैकल्पिक पैरामीटर, अनुपस्थित होने पर कोई पोर्ट नहीं सुनता)
अगर $listen पैरामीटर सेट किया गया है, तो यह socket सुनने के लिए कार्यान्वित किया जाएगा।
$listen का फॉर्मेट <प्रोटोकॉल>://<सुनने का पता>
<प्रोटोकॉल> निम्नलिखित फॉर्मेट हो सकता है:
tcp: उदाहरण के लिए tcp://0.0.0.0:8686
udp: उदाहरण के लिए udp://0.0.0.0:8686
unix: उदाहरण के लिए unix:///tmp/my_file (Workerman>=3.2.7 की आवश्यकता)
http: उदाहरण के लिए http://0.0.0.0:80
websocket: उदाहरण के लिए websocket://0.0.0.0:8686
text: उदाहरण के लिए text://0.0.0.0:8686 (text Workerman का अंतर्निहित टेक्स्ट प्रोटोकॉल है, telnet के साथ संगत है, अधिक जानकारी के लिए कृपया परिशिष्ट टेक्स्ट प्रोटोकॉल अनुभाग देखें)
और अन्य कस्टम प्रोटोकॉल, कृपया इस मैनुअल के अनुकूलन संचार प्रोटोकॉल अनुभाग को देखें।
<सुनने का पता> निम्नलिखित फॉर्मेट हो सकता है:
यदि यह unix सॉकेट है, तो पता स्थानीय डिस्क पाथ होगा।
गैर-unix सॉकेट के लिए, पता फॉर्मेट <स्थानीय ip>:<पोर्ट संख्या> होगा।
<स्थानीय ip> को 0.0.0.0 के रूप में सेट किया जा सकता है, जो स्थानीय सभी नेटवर्क इंटरफेस को सुनता है, जिसमें स्थानीय ip, बाहरी ip और स्थानीय लूपबैक 127.0.0.1 शामिल हैं।
यदि <स्थानीय ip> 127.0.0.1 है, तो यह स्थानीय लूपबैक को सुनता है, केवल स्थानीय पहुंच संभव है, बाहरी पहुंच असंभव है।
यदि <स्थानीय ip> स्थानीय नेटवर्क ip है, जैसे 192.168.xx.xx, तो यह केवल स्थानीय नेटवर्क ip को सुनता है, इससे बाहरी उपयोगकर्ता पहुंच नहीं बना सकते।
यदि <स्थानीय ip> का सेट किया गया मान स्थानीय ip का हिस्सा नहीं है, तो यह सुनने में सक्षम नहीं होगा, और Cannot assign requested address त्रुटि प्रदर्शित करेगा।
नोट: <पोर्ट संख्या> 65535 से अधिक नहीं होनी चाहिए। <पोर्ट संख्या> यदि 1024 से कम है, तो सुनने के लिए root अनुमति की आवश्यकता है। सुनने वाला पोर्ट स्थानीय रूप से अप्रयुक्त होना चाहिए, अन्यथा यह सुनने में असमर्थ होगा, और Address already in use त्रुटि प्रदर्शित करेगा।
$context
एक ऐरे। सॉकेट के संदर्भ विकल्पों को संचारित करने के लिए, सॉकेट संदर्भ विकल्प देखें।
उदाहरण
Worker को http कंटेनर के रूप में सुनने के लिए http अनुरोधों को संभालना
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8686');
$worker->onMessage = function(TcpConnection $connection, Request $request)
{
$connection->send("hello");
};
// वर्कर चलाएँ
Worker::runAll();
Worker को websocket कंटेनर के रूप में सुनने के लिए websocket अनुरोधों को संभालना
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('websocket://0.0.0.0:8686');
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send("hello");
};
// वर्कर चलाएँ
Worker::runAll();
Worker को tcp कंटेनर के रूप में सुनने के लिए tcp अनुरोधों को संभालना
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('tcp://0.0.0.0:8686');
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send("hello");
};
// वर्कर चलाएँ
Worker::runAll();
Worker को udp कंटेनर के रूप में सुनने के लिए udp अनुरोधों को संभालना
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('udp://0.0.0.0:8686');
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send("hello");
};
// वर्कर चलाएँ
Worker::runAll();
Worker unix domain सॉकेट को सुनता है (Workerman संस्करण>=3.2.7 की आवश्यकता)
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('unix:///tmp/my.sock');
$worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send("hello");
};
// वर्कर चलाएँ
Worker::runAll();
कोई सुनवाई नहीं करने वाले Worker कंटेनर, कुछ समय-समय पर कार्य करने के लिए
use \Workerman\Worker;
use \Workerman\Timer;
require_once __DIR__ . '/vendor/autoload.php';
$task = new Worker();
$task->onWorkerStart = function($task)
{
// हर 2.5 सेकंड में एक बार कार्य करें
$time_interval = 2.5;
Timer::add($time_interval, function()
{
echo "task run\n";
});
};
// वर्कर चलाएँ
Worker::runAll();
Worker कस्टम प्रोटोकॉल के पोर्ट को सुनता है
अंतिम निर्देशिका संरचना
├── Protocols // यह Protocols निर्देशिका बनाने के लिए है
│ └── MyTextProtocol.php // यह कस्टम प्रोटोकॉल फ़ाइल बनाने के लिए है
├── test.php // यह test स्क्रिप्ट बनाने के लिए है
└── Workerman // Workerman स्रोत निर्देशिका, इसमें कोड को न छेड़ें
- Protocols निर्देशिका बनाएँ और एक प्रोटोकॉल फ़ाइल बनाएँ
Protocols/MyTextProtocol.php(उपरोक्त निर्देशिका संरचना को संदर्भित करें)
// उपयोगकर्ता द्वारा परिभाषित प्रोटोकॉल नामस्थान को Protocols में एकीकृत करना
namespace Protocols;
// साधारण टेक्स्ट प्रोटोकॉल, प्रोटोकॉल का फॉर्मेट टेक्स्ट+न्यूलाइन है
class MyTextProtocol
{
// पैकेट फ़ंक्शन, वर्तमान पैकेट की लंबाई लौटाते हुए
public static function input($recv_buffer)
{
// न्यूलाइन का पता लगाएँ
$pos = strpos($recv_buffer, "\n");
// यदि कोई न्यूलाइन नहीं मिली, तो इसका मतलब है कि यह एक पूर्ण पैकेट नहीं है, 0 वापस करें और डेटा की प्रतीक्षा जारी रखें
if($pos === false)
{
return 0;
}
// न्यूलाइन पाई गई, वर्तमान पैकेट की लंबाई लौटाएँ, जिसमें न्यूलाइन भी शामिल है
return $pos+1;
}
// जब एक पूर्ण पैकेट प्राप्त होता है, तो इसे decode के माध्यम से स्वचालित रूप से डिकोड किया जाएगा, यहाँ केवल न्यूलाइन को trim किया गया है
public static function decode($recv_buffer)
{
return trim($recv_buffer);
}
// क्लाइंट को डेटा भेजने से पहले स्वचालित रूप से encode के माध्यम से इसे एन्कोड किया जाएगा, और फिर क्लाइंट को भेजा जाएगा, यहाँ न्यूलाइन जोड़ी गई है
public static function encode($data)
{
return $data."\n";
}
}
- MyTextProtocol प्रोटोकॉल का उपयोग करके अनुरोधों को सुनें और संभालें
उपरोक्त अंतिम निर्देशिका संरचना का पालन करते हुए test.php फ़ाइल बनाएँ।
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// #### MyTextProtocol वर्कर ####
$text_worker = new Worker("MyTextProtocol://0.0.0.0:5678");
/*
* एक पूर्ण डेटा (अंत में न्यूलाइन शामिल) प्राप्त होने पर, स्वचालित रूप से MyTextProtocol::decode('प्राप्त डेटा') निष्पादित करें
* परिणाम को $data के माध्यम से onMessage कॉलबैक में भेजा जाएगा
*/
$text_worker->onMessage = function(TcpConnection $connection, $data)
{
var_dump($data);
/*
* क्लाइंट को डेटा भेजते समय, स्वचालित रूप से MyTextProtocol::encode('hello world') को प्रोटोकॉल एन्कोडिंग के लिए कॉल किया जाएगा,
* और फिर इसे क्लाइंट को भेजा जाएगा
*/
$connection->send("hello world");
};
// सभी वर्कर्स चलाएँ
Worker::runAll();
- परीक्षण
टर्मिनल खोलें, test.php所在目录 पर जाएँ, php test.php start चलाएँ।
php test.php start
Workerman[test.php] DEBUG मोड में शुरू
----------------------- WORKERMAN -----------------------------
Workerman संस्करण:3.2.7 PHP संस्करण:5.4.37
------------------------ वर्कर -------------------------------
उपयोगकर्ता वर्कर सुनें प्रक्रियाएं स्थिति
root none myTextProtocol://0.0.0.0:5678 1 [OK]
----------------------------------------------------------------
बंद करने के लिए Ctrl-C दबाएँ। प्रारंभ सफल।
टर्मिनल खोलें, telnet का उपयोग करके परीक्षण करें (linux सिस्टम के telnet का उपयोग करने की सलाह दी जाती है)
मान लें कि यह स्थानीय परीक्षण है,
टर्मिनल पर telnet 127.0.0.1 5678 चलाएँ
फिर hi टाइप करें और एंटर दबाएँ।
आप डेटा hello world\n प्राप्त करेंगे।
telnet 127.0.0.1 5678
Trying 127.0.0.1...
127.0.0.1 से जुड़ा।
Escape character है '^]'。
hi
hello world