PHP-এর কয়েকটি কলব্যাক লেখার পদ্ধতি
PHP-তে অ্যানোনিমাস ফাংশনের মাধ্যমে কলব্যাক লেখা সবচেয়ে সুবিধাজনক, তবে অ্যানোনিমাস ফাংশন পদ্ধতির কলব্যাক ছাড়াও PHP-তে অন্যান্য কলব্যাক লেখার পদ্ধতি রয়েছে। নিচে PHP-এর কয়েকটি কলব্যাক লেখার উদাহরণ দেওয়া হলো।
1. অ্যানোনিমাস ফাংশন কলব্যাক
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$http_worker = new Worker("http://0.0.0.0:2345");
// অ্যানোনিমাস ফাংশন কলব্যাক
$http_worker->onMessage = function(TcpConnection $connection, Request $data)
{
// ব্রাউজারে hello world পাঠান
$connection->send('hello world');
};
Worker::runAll();
2. সাধারণ ফাংশন কলব্যাক
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
$http_worker = new Worker("http://0.0.0.0:2345");
// অ্যানোনিমাস ফাংশন কলব্যাক
$http_worker->onMessage = 'on_message';
// সাধারণ ফাংশন
function on_message(TcpConnection $connection, Request $request)
{
// ব্রাউজারে hello world পাঠান
$connection->send('hello world');
}
Worker::runAll();
3. ক্লাসের পদ্ধতি হিসেবে কলব্যাক
MyClass.php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
class MyClass{
public function __construct(){}
public function onWorkerStart(Worker $worker){}
public function onConnect(TcpConnection $connection){}
public function onMessage(TcpConnection $connection, $message) {}
public function onClose(TcpConnection $connection){}
public function onWorkerStop(Worker $worker){}
}
শুরু করার স্ক্রিপ্ট start.php
<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
// MyClass লোড করা
require_once __DIR__.'/MyClass.php';
$worker = new Worker("websocket://0.0.0.0:2346");
// একটি অবজেক্ট তৈরি করা
$my_object = new MyClass();
// ক্লাসের পদ্ধতি কল করা
$worker->onWorkerStart = array($my_object, 'onWorkerStart');
$worker->onConnect = array($my_object, 'onConnect');
$worker->onMessage = array($my_object, 'onMessage');
$worker->onClose = array($my_object, 'onClose');
$worker->onWorkerStop = array($my_object, 'onWorkerStop');
Worker::runAll();
দ্রষ্টব্য:
উপরের কোডের কাঠামোতে কনস্ট্রাক্টরে রিসোর্স (MySQL সংযোগ, Redis সংযোগ, Memcache সংযোগ ইত্যাদি) ইনিশিয়ালাইজ করা অনুমোদিত নয়, কারণ $my_object = new MyClass(); মূল প্রক্রিয়ায় চলে। MySQL-এর উদাহরণ হিসাবে, মূল প্রক্রিয়ায় ইনিশিয়ালাইজ করা MySQL সংযোগের মতো রিসোর্সগুলি উপপ্রক্রিয়ায় উত্তরাধিকারী হবে, প্রতিটি উপপ্রক্রিয়া এই ডাটাবেস সংযোগে কাজ করতে পারবে, কিন্তু এই সংযোগ MySQL সার্ভারের অনুরূপ একটি সংযোগ হবে, যা প্রত্যাশিত ত্রুটির মধ্যে নিয়ে যেতে পারে, যেমন mysql gone away ত্রুটি।
উপরের কোডের কাঠামোতে যদি ক্লাসের কনস্ট্রাক্টরে রিসোর্স ইনিশিয়ালাইজ করতে প্রয়োজন হয়, তাহলে নিচের লেখার শৈলী গ্রহণ করা যেতে পারে।
MyClass.php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
class MyClass{
protected $db = null;
public function __construct(){
// ধরুন ডাটাবেস সংযোগের ক্লাস MyDbClass
$db = new MyDbClass();
}
public function onWorkerStart(Worker $worker){}
public function onConnect(TcpConnection $connection){}
public function onMessage(TcpConnection $connection, $message) {}
public function onClose(TcpConnection $connection){}
public function onWorkerStop(Worker $worker){}
}
শুরু করার স্ক্রিপ্ট start.php
<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker("websocket://0.0.0.0:2346");
// onWorkerStart-এ ক্লাস ইনিশিয়ালাইজ করা
$worker->onWorkerStart = function($worker) {
// MyClass লোড করা
require_once __DIR__.'/MyClass.php';
// একটি অবজেক্ট তৈরি করা
$my_object = new MyClass();
// ক্লাসের পদ্ধতি কল করা
$worker->onConnect = array($my_object, 'onConnect');
$worker->onMessage = array($my_object, 'onMessage');
$worker->onClose = array($my_object, 'onClose');
$worker->onWorkerStop = array($my_object, 'onWorkerStop');
};
Worker::runAll();
উপরের কোডের কাঠামোতে onWorkerStart চলাকালীন সময় ইতিমধ্যে উপপ্রক্রিয়ার অন্তর্গত, যার অর্থ প্রতিটি উপপ্রক্রিয়া নিজস্ব MySQL সংযোগ স্থাপন করে, তাই কোনো শেয়ার্ড সংযোগের সমস্যা হবে না।
এছাড়াও এর একটি সুবিধা হল ব্যবসার কোড রিলোড সমর্থন করে। যেহেতু MyClass.php উপপ্রক্রিয়ায় লোড হয়, রিলোডের নিয়ম অনুযায়ী ব্যবসায় পরিবর্তন হলে MyClass.php পরে সরাসরি রিলোড করলেই কার্যকর হবে।
4. ক্লাসের স্ট্যাটিক পদ্ধতি হিসেবে কলব্যাক
স্ট্যাটিক ক্লাস MyClass.php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
class MyClass{
public static function onWorkerStart(Worker $worker){}
public static function onConnect(TcpConnection $connection){}
public static function onMessage(TcpConnection $connection, $message) {}
public static function onClose(TcpConnection $connection){}
public static function onWorkerStop(Worker $worker){}
}
শুরু করার স্ক্রিপ্ট start.php
<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
// MyClass লোড করা
require_once __DIR__.'/MyClass.php';
$worker = new Worker("websocket://0.0.0.0:2346");
// ক্লাসের স্ট্যাটিক পদ্ধতি কল করা।
$worker->onWorkerStart = array('MyClass', 'onWorkerStart');
$worker->onConnect = array('MyClass', 'onConnect');
$worker->onMessage = array('MyClass', 'onMessage');
$worker->onClose = array('MyClass', 'onClose');
$worker->onWorkerStop = array('MyClass', 'onWorkerStop');
// যদি ক্লাসের নাম স্পেস থাকে তবে এমন ধরনের লেখার হবে
// $worker->onWorkerStart = array('your\namesapce\MyClass', 'onWorkerStart');
// $worker->onConnect = array('your\namesapce\MyClass', 'onConnect');
// $worker->onMessage = array('your\namesapce\MyClass', 'onMessage');
// $worker->onClose = array('your\namesapce\MyClass', 'onClose');
// $worker->onWorkerStop = array('your\namesapce\MyClass', 'onWorkerStop');
Worker::runAll();
দ্রষ্টব্য: PHP-এর চলমান মেকানিজম অনুযায়ী, যদি new ব্যবহার করে কল না করা হয় তবে কনস্ট্রাক্টর কল হবে না, এবং আরও এটাই যে স্ট্যাটিক ক্লাসের পদ্ধতি ভিতরে $this ব্যবহার করা অনির্বাচিত।