<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # PHP的幾種回調寫法 # PHP幾種回調寫法 PHP里通過匿名函數寫回調是最方便的,但是除了匿名函數方式的回調,PHP還有其它的回調寫法。以下是PHP幾種回調寫法的示例。 ## 1、匿名函數回調 ```php <?php use Workerman\Worker; require_once __DIR__ . '/Workerman/Autoloader.php'; $http_worker = new Worker("http://0.0.0.0:2345"); // 匿名函數回調 $http_worker->onMessage = function($connection, $data) { // 向瀏覽器發送hello world $connection->send('hello world'); }; Worker::runAll(); ``` ## 2、普通函數回調 ```php <?php use Workerman\Worker; require_once __DIR__ . '/Workerman/Autoloader.php'; $http_worker = new Worker("http://0.0.0.0:2345"); // 匿名函數回調 $http_worker->onMessage = 'on_message'; // 普通函數 function on_mesage($connection, $data) { // 向瀏覽器發送hello world $connection->send('hello world'); } Worker::runAll(); ``` ## 3、類方法作為回調 MyClass.php ```php class MyClass{ public function __construct(){} public function onWorkerStart($worker){} public function onConnect($connection){} public function onMessage($connection, $message) {} public function onClose($connection){} public function onWorkerStop($connection){} } ``` 啟動腳本 start.php ```php <?php use Workerman\Worker; require_once __DIR__ . '/Workerman/Autoloader.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 ```php class MyClass{ protected $db = null; public function __construct(){ // 假設數據庫連接類是MyDbClass $db = new MyDbClass(); } public function onWorkerStart($worker){} public function onConnect($connection){} public function onMessage($connection, $message) {} public function onClose($connection){} public function onWorkerStop($connection){} } ``` 啟動腳本 start.php ```php <?php use Workerman\Worker; require_once __DIR__ . '/Workerman/Autoloader.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連接,所以不會有共享連接的問題。 這樣還有一個好處就是支持業務代碼reload。由于MyClass.php是在子進程載入的,根據reload規則業務更改MyClass.php后直接reload即可生效。 ## 4、類的靜態方法作為回調 靜態類MyClass.php ```php class MyClass{ public static function onWorkerStart($worker){} public static function onConnect($connection){} public static function onMessage($connection, $message) {} public static function onClose($connection){} public static function onWorkerStop($connection){} } ``` 啟動腳本 start.php ```php <?php use Workerman\Worker; require_once __DIR__ . '/Workerman/Autoloader.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```。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看