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 की कार्यप्रणाली के अनुसार, यदि नेविज़न का उपयोग नहीं किया गया है, तो कंस्ट्रक्टर नहीं बुलाया जाएगा, इसके अलावा स्थिर क्लास की विधियों में $this का उपयोग अनुमत नहीं है।