কনস্ট্রাক্টর __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-এর সাথে সামঞ্জস্যপূর্ণ, বিস্তারিত জানার জন্য সংযোজন Text প্রোটোকল অংশ দেখুন)
এবং অন্যান্য কাস্টম প্রোটোকল, এই ম্যানুয়ালের কমিউনিকেশন প্রোটোকল কাস্টমাইজেশন অংশ দেখুন।
<শুনতে ঠিকানা> নিচের ফরম্যাটে হতে পারে:
যদি 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 শুনবে, takže বাইরের ব্যবহারকারীরা অ্যাক্সেস করতে পারবে না।
<লোকাল ip> সেট করা মান যদি স্থানীয় ip এর অন্তর্ভুক্ত না হয় তবে এটি শোনার জন্য কার্যকর নয়, এবং Cannot assign requested address ত্রুটি বার্তা দেবে।
সতর্কতা: <পোর্ট নম্বর> 65535-এর চেয়ে বড় হতে পারে না। <পোর্ট নম্বর> যদি 1024 এর কম হয় তবে শুনতে root অধিকার প্রয়োজন। শনাক্ত পোর্টটি অবশ্যই লোকাল এ ব্যবহৃত না হওয়া উচিত, অন্যথায় শোনার জন্য কার্যকর হবে না এবং Address already in use ত্রুটি বার্তা প্রদর্শন করবে।
$context
একটি অ্যারে। socket-এর প্রসঙ্গ বিকল্প প্রেরণের জন্য ব্যবহৃত হয়, socket প্রসঙ্গ বিকল্প দেখুন।
উদাহরণ
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 চালানো
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 চালানো
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 চালানো
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 চালানো
Worker::runAll();
Worker UNIX ডোমেইন সোকেট শুনছে (ক要求 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 চালানো
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 চালানো
Worker::runAll();
Worker কাস্টম প্রোটোকল পোর্ট শুনছে
অবশেষে ডিরেক্টরি স্ট্রাকচার
├── Protocols // এটি নির্মাণ করার জন্য প্রোটোকলস ডিরেক্টরি
│ └── MyTextProtocol.php // এটি নির্মাণ করার জন্য কাস্টম প্রোটোকল ফাইল
├── test.php // এটি নির্মাণ করার জন্য টেস্ট স্ক্রিপ্ট
└── Workerman // Workerman সোর্স কোড ডিরেক্টরি, এর কোড পরিবর্তন করবেন না
- প্রোটোকলস ডিরেক্টরি তৈরি করুন এবং একটি প্রোটোকল ফাইল তৈরি করুন
Protocols/MyTextProtocol.php(উপরের ডিরেক্টরি স্ট্রাকচার অনুসরণ করুন)
// ব্যবহারকারীর কাস্টম প্রোটোকল নামকরণ স্থানীয়করণ প্রোটোকলস
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 মাধ্যমে স্বয়ংক্রিয়ভাবে অনুবাদ হয়, এখানে শুধু নতুন লাইন অক্ষর মুছে ফেলা হয়েছে
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 worker ####
$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所在目录তে প্রবেশ করুন, execute php test.php start
php test.php start
Workerman[test.php] DEBUG মোডে শুরু
----------------------- WORKERMAN -----------------------------
Workerman সংস্করণ:3.2.7 PHP সংস্করণ:5.4.37
------------------------ WORKERS -------------------------------
ব্যবহারকারী কর্মী শুনতে প্রক্রিয়াকরণ অবস্থা
root কোন myTextProtocol://0.0.0.0:5678 1 [OK]
----------------------------------------------------------------
Quit করার জন্য Ctrl-C চাপুন। শুরু সফল।
টার্মিনাল খুলুন, telnet ব্যবহার করে পরীক্ষা করুন(Linux সিস্টেমের telnet ব্যবহার করা পরামর্শ দেওয়া হয়)
মনে করুন এটি লোকাল পরীক্ষার জন্য,
টার্মিনালে execute telnet 127.0.0.1 5678
তারপর লিখুন hi এবং এন্টার করুন
আপনি ডেটা পাবে hello world\n
telnet 127.0.0.1 5678
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
hi
hello world