<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國際加速解決方案。 廣告
                # Coroutine [TOC] 從`4.0`版本開始`Swoole`提供了完整的**協程(Coroutine)+通道(Channel)**特性,帶來全新的`CSP`編程模型。應用層可使用完全同步的編程方式,底層自動實現異步`IO`。 ~~~ go(function () { $redis = new Swoole\Coroutine\Redis(); $redis->connect('127.0.0.1', 6379); $val = $redis->get('key'); }); ~~~ > `4.0.0`或更高版本僅支持`PHP7` > `4.0.1`版本開始去除了`--enable-coroutine`編譯選項,改為[動態配置](enable\_coroutine.md) 協程可以理解為純用戶態的線程,其通過**協作**而不是搶占來進行切換。相對于進程或者線程,協程所有的操作都可以在用戶態完成,創建和切換的消耗更低。`Swoole`可以為每一個請求創建對應的協程,根據`IO`的狀態來合理的調度協程,這會帶來了以下優勢: 1. 開發者可以無感知的用同步的代碼編寫方式達到異步IO的效果和性能,避免了傳統異步回調所帶來的離散的代碼邏輯和陷入多層回調中導致代碼無法維護 2. 同時由于底層封裝了協程,所以對比傳統的`PHP`層協程框架,開發者不需要使用`yield`關鍵詞來標識一個協程`IO`操作,所以不再需要對`yield`的語義進行深入理解以及對每一級的調用都修改為`yield`,這極大的提高了開發效率 可以滿足大部分開發者的需求。對于私有協議,開發者可以使用協程的`TCP`或者`UDP`接口去方便的封裝。 ## 環境要求 * PHP版本要求:**\>= 7.0** * 基于`Server`、`Http\Server`、`WebSocket\Server`進行開發,底層在`onRequet`,`onReceive`,`onConnect`等事件回調之前自動創建一個協程,在回調函數中使用協程`API` * 使用`Coroutine::create`或`go`方法創建協程,在創建的協程中使用協程`API` ## 相關配置 在`Server`的`set`方法中增加了一個配置參數`max_coroutine`,用于配置一個`Worker`進程最多同時處理的協程數目。因為隨著`Worker`進程處理的協程數目的增加,其占用的內存也會增加,為了避免超出php的`memory_limit`限制,請根據實際業務的壓測結果設置該值,默認為`3000`。 ## 使用示例 ~~~ $http = new swoole_http_server("127.0.0.1", 9501); $http->on("request", function ($request, $response) { $client = new Swoole\Coroutine\Client(SWOOLE_SOCK_TCP); $client->connect("127.0.0.1", 8888, 0.5); //調用connect將觸發協程切換 $client->send("hello world from swoole"); //調用recv將觸發協程切換 $ret = $client->recv(); $response->header("Content-Type", "text/plain"); $response->end($ret); $client->close(); }); $http->start(); ~~~ 當代碼執行到`connect()和recv()`函數時,底層會觸發進行協程切換,此時可以去處理其他的事件或者接受新的請求。當此客戶端`連接`成功或者后端服務`回包`后,底層會恢復協程上下文,代碼邏輯繼續從切換點開始恢復執行。開發者整個過程不需要關心整個切換過程。 ## 注意事項 1. 全局變量:協程使得原有的異步邏輯同步化,但是在協程的切換是隱式發生的,所以在協程切換的前后不能保證全局變量以及`static`變量的一致性。 2. 與`xdebug`、`xhprof`、`blackfire`等`zend`擴展不兼容,例如不能使用`xhprof`對協程`server`進行性能分析采樣。 ## 協程組件 1. TCP/UDP Client:`Swoole\Coroutine\Client` 2. HTTP/WebSocket Client:`Swoole\Coroutine\HTTP\Client` 3. HTTP2 Client:`Swoole\Coroutine\HTTP2\Client` 4. Redis Client:`Swoole\Coroutine\Redis` 5. Mysql Client:`Swoole\Coroutine\MySQL` 6. PostgreSQL Client:`Swoole\Coroutine\PostgreSQL` * 在協程`Server`中需要使用協程版`Client`,可以實現全異步`Server` * 其他程序中可以使用`go`關鍵詞手工創建協程 * 同時`Swoole`提供了協程工具集:`Swoole\Coroutine`,提供了獲取當前協程`id`,反射調用等能力。
                  <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>

                              哎呀哎呀视频在线观看