国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

PHP幾種回調(diào)寫法

PHP里通過匿名函數(shù)寫回調(diào)是最方便的,但是除了匿名函數(shù)方式的回調(diào),PHP還有其它的回調(diào)寫法。以下是PHP幾種回調(diào)寫法的示例。

1、匿名函數(shù)回調(diào)

<?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");

// 匿名函數(shù)回調(diào)
$http_worker->onMessage = function(TcpConnection $connection, Request $data)
{
    // 向?yàn)g覽器發(fā)送hello world
    $connection->send('hello world');
};

Worker::runAll();

2、普通函數(shù)回調(diào)

<?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");

// 匿名函數(shù)回調(diào)
$http_worker->onMessage = 'on_message';

// 普通函數(shù)
function on_message(TcpConnection $connection, Request $request)
{
    // 向?yàn)g覽器發(fā)送hello world
    $connection->send('hello world');
}

Worker::runAll();

3、類方法作為回調(diào)

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");

// 創(chuàng)建一個(gè)對象
$my_object = new MyClass();

// 調(diào)用類的方法
$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();

注意:
以上的代碼結(jié)構(gòu)不允許在構(gòu)造函數(shù)里初始化資源(MySQL連接、Redis連接、Memcache連接等),因?yàn)?code>$my_object = new MyClass();運(yùn)行在主進(jìn)程。以MySQL為例,在主進(jìn)程初始化的MySQL連接等資源會被子進(jìn)程繼承,每個(gè)子進(jìn)程都可以操作這個(gè)數(shù)據(jù)庫連接,但是這些連接在MySQL服務(wù)端對應(yīng)的是同一個(gè)連接,會發(fā)生不可預(yù)期的錯誤,例如mysql gone away 錯誤。

以上代碼結(jié)構(gòu)如果需要在類的構(gòu)造函數(shù)里初始化資源,可以采用以下寫法。
MyClass.php

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
class MyClass{
    protected $db = null;
    public function __construct(){
        // 假設(shè)數(shù)據(jù)庫連接類是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';

    // 創(chuàng)建一個(gè)對象
    $my_object = new MyClass();

    // 調(diào)用類的方法
    $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();

上面代碼結(jié)構(gòu)中onWorkerStart運(yùn)行時(shí)已經(jīng)是屬于子進(jìn)程,等于每個(gè)子進(jìn)程各自建立自己的MySQL連接,所以不會有共享連接的問題。
這樣還有一個(gè)好處就是支持業(yè)務(wù)代碼reload。由于MyClass.php是在子進(jìn)程載入的,根據(jù)reload規(guī)則業(yè)務(wù)更改MyClass.php后直接reload即可生效。

4、類的靜態(tài)方法作為回調(diào)

靜態(tài)類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");

// 調(diào)用類的靜態(tài)方法。
$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();

注意:根據(jù)PHP的運(yùn)行機(jī)制,如果沒用調(diào)用new 則不會調(diào)用構(gòu)造函數(shù),另外靜態(tài)類的方法里面不允許使用$this。

編輯于2024-03-13 17:37:19 完善本頁 +發(fā)起討論
贊助商