<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 編程須知 這個頻道內會詳細介紹異步編程與同步編程的不同之處以及需要注意的事項。 注意事項 ----- * 不要在代碼中執行`sleep`以及其他睡眠函數,這樣會導致整個進程阻塞 * `exit/die`是危險的,會導致`Worker`進程退出 * 可通過`register_shutdown_function`來捕獲致命錯誤,在進程異常退出時做一些清理工作,具體參考 [/wiki/page/305.html](https://wiki.swoole.com/wiki/page/305.html) * `PHP`代碼中如果有異常拋出,必須在回調函數中進行`try/catch`捕獲異常,否則會導致工作進程退出 * 不支持`set_exception_handler`,必須使用`try/catch`方式處理異常 * `Worker`進程不得共用同一個`Redis`或`MySQL`等網絡服務客戶端,`Redis/MySQL`創建連接的相關代碼可以放到`onWorkerStart`回調函數中,具體參考 [/wiki/page/325.html](https://wiki.swoole.com/wiki/page/325.html) 異步編程 ----- * 異步程序要求代碼中不得包含任何同步阻塞操作 * **異步與同步代碼不能混用,一旦應用程序使用了任何同步阻塞的代碼,程序即退化為同步模式** 協程編程 ---- 使用`Coroutine`特性,請認真閱讀 [協程編程須知](https://wiki.swoole.com/wiki/page/851.html) 類/函數重復定義 ---- 新手非常容易犯這個錯誤,由于`Swoole`是常駐內存的,所以加載類/函數定義的文件后不會釋放。因此引入類/函數的php文件時必須要使用`include_once`或`require_once`,否會發生`cannot redeclare function/class` 的致命錯誤。 內存管理 ---- PHP守護進程與普通Web程序的變量生命周期、內存管理方式完全不同。請參考 [swoole_server內存管理](https://wiki.swoole.com/wiki/page/p-zend_mm.html) 頁面。__編寫`swoole_server`或其他常駐進程時需要特別注意。__ 進程隔離 ---- 進程隔離也是很多新手經常遇到的問題。修改了全局變量的值,為什么不生效,原因就是全局變量在不同的進程,內存空間是隔離的,所以無效。所以使用`Swoole`開發`Server`程序需要了解`進程隔離`問題。 * 不同的進程中PHP變量不是共享,即使是全局變量,在A進程內修改了它的值,在B進程內是無效的 * 如果需要在不同的Worker進程內共享數據,可以用`Redis`、`MySQL`、`文件`、`Swoole\Table`、`APCu`、`shmget`等工具實現 * 不同進程的文件句柄是隔離的,所以在A進程創建的Socket連接或打開的文件,在B進程內是無效,即使是將它的fd發送到B進程也是不可用的 #### 實例: #### ```php $server = new Swoole\Http\Server('127.0.0.1', 9500); $i = 1; $server->on('Request', function ($request, $response) { global $i; $response->end($i++); }); $server->start(); ``` 在多進程的服務器中,`$i`變量雖然是全局變量(`global`),但由于進程隔離的原因。假設有`4`個工作進程,在`進程1`中進行`$i++`,實際上只有`進程1`中的`$i`變成`2`了,其他另外`3`個進程內`$i`變量的值還是`1`。 正確的做法是使用`Swoole`提供的`Swoole\Atomic`或`Swoole\Table`數據結構來保存數據。如上述代碼可以使用`Swoole\Atomic`實現。 ```php $server = new Swoole\Http\Server('127.0.0.1', 9500); $atomic = new Swoole\Atomic(1); $server->on('Request', function ($request, $response) use ($atomic) { $response->end($atomic->add(1)); }); $server->start(); ``` * `Swoole\Atomic`數據是建立在共享內存之上的,使用`add`方法加`1`時,在其他工作進程內也是有效的
                  <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>

                              哎呀哎呀视频在线观看