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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 異步回調程序內存管理 異步回調程序與同步阻塞程序的內存管理方式不同,異步程序是基于回調鏈引用計數實現內存的管理。本文會用一個最簡單的實例講解異步程序的內存管理。 實例程序 ---- ```php $serv = new Swoole\Http\Server("127.0.0.1", 9502); $serv->on('Request', function($request, $response) { $cli = new Swoole\Http\Client('127.0.0.1', 80); $cli->post('/dump.php', array("key" => 'value'), function ($cli) use ($request, $response) { $response->end("<h1>{$cli->body}</h1>"); $cli->close(); }); }); $serv->start(); ``` onRequest ---- * 請求到來這時會觸發`onRequest`回調函數,可以得到`$request`和`$response`對象 * 在`onRequest`回調函數中,創建了一個`Http\Client`,并發起一次`POST`請求 * 然后`onRequest`函數結束并返回 這時按照正常的`PHP`函數調用流程,`$request`和`$response`對象會被銷毀。但在上述程序中,`$request`和`$response`對象被使用了`use`語法,綁定到了匿名函數上,因此這2個對象的引用計數會被加`1`。`onRequest`函數返回時就不會真正銷毀這2個對象了。 #### 引用鏈依賴 ``` request/response -> post(Closure 回調函數) -> $cli(HttpClient對象) -> post($cli->connect) ``` `$cli`對象,是在`onRequest`函數創建的局部變量,按照正常邏輯`$cli`對象在`onRequest`函數退出時也應該被銷毀。但`Swoole`底層有一個特殊的邏輯,**所有異步客戶端對象在發起連接時底層會自動增加一次引用計數,在連接關閉時減少一次引用計數**,因此`$cli`對象也不會銷毀,`POST`請求中的匿名函數對象也不會銷毀。 Http響應 ---- * 創建的`$cli`對象,接收到來自服務器端的響應,或者連接超時、響應超時,這時會回調指定的匿名函數,調用`end`向客戶端發送響應 * 回調函數中調用了`$cli->close`這時切斷連接,`$cli`的引用計數減一。這時匿名函數退出底層會自動銷毀`$cli`、`$request`、`$response` 3個對象 #### 引用鏈解除 ``` cli->close -> Closure 銷毀 -> $cli 銷毀 -> request/response 銷毀 ``` 多層嵌套 ---- 如果`Http\Client`的回調函數中調用了其他的異步客戶端,如`Swoole\Redis`,對象會繼續傳讀引用,形成一個異步調用鏈。當調用鏈的最后一個對象銷毀時會向著調用鏈頭部逐個遞減引用計數,最終銷毀對象。 ```php $serv = new Swoole\Http\Server("127.0.0.1", 9502); $serv->on('Request', function($request, $response) { $cli = new Swoole\Http\Client('127.0.0.1', 80); //發起連接,$cli 引用計數增加 $cli->post('/dump.php', array("key" => 'value'), function ($cli) use ($request, $response) { $redis = new Swoole\Redis; //發起連接,$redis 引用計數增加 $redis->connect('127.0.0.1', 6379, function ($redis, $result) use ($request, $response, $cli) { $redis->get('test_key', function ($redis, $result) use ($request, $response, $cli) { $response->end("<h1>{$result}</h1>"); //關閉連接,$cli 引用計數減少 $cli->close(); //關閉連接,$redis 引用計數減少 $redis->close(); }); }); }); }); $serv->start(); ``` * 這里`$response`和`$request`對象被`POST`匿名函數、`Redis->connect`匿名函數、`Redis->get`匿名函數引用,因此需要等到這3個函數執行后,引用計數減少為`0`,才會真正的銷毀 * `$cli`和`$redis`對象在發起`TCP`連接時,會被`Swoole`底層增加引用計數。只有`$cli->close()`和`$redis->close`被調用,或者遠端服務器關閉連接,觸發`$cli->onClose`和`$redis->onClose`,`$cli`和`$redis`這`2`個對象的,引用計數才會減少,函數退出時會銷毀 * `POST`匿名函數、`Redis->connect`匿名函數、`Redis->get`匿名函數,`3`個對象依附于`$cli`和`$redis`對象,當`$cli`和`$redis`對象銷毀時,這`3`個對象也會被銷毀 * `POST`匿名函數、`Redis->connect`匿名函數、`Redis->get`匿名函數,匿名函數銷毀時通過`use`語法引用的`$response`和`$request`對象也會銷毀
                  <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>

                              哎呀哎呀视频在线观看