<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # swoole_server中內存管理機制 `swoole_server`啟動后內存管理的底層原理與普通php-cli程序一致。具體請參考`Zend VM`內存管理方面的文章。 局部變量 ---- 在事件回調函數返回后,所有局部對象和變量會全部回收,不需要`unset`。如果變量是一個資源類型,那么對應的資源也會被PHP底層釋放。 ```php function test() { $a = new Object; $b = fopen('/data/t.log', 'r+'); $c = new swoole_client(SWOOLE_SYNC); $d = new swoole_client(SWOOLE_SYNC); global $e; $e['client'] = $d; } ``` * $a, $b, $c 都是局部變量,當此函數`return`時,這3個變量會立即釋放,對應的內存會立即釋放,打開的IO資源文件句柄會立即關閉。 * $d 也是局部變量,但是`return`前將它保存到了全局變量$e,所以不會釋放。當執行`unset($e['client'])`時,并且沒有任何其他PHP變量仍然在引用$d變量,那么$d 就會被釋放。 全局變量 ---- 在PHP中,有3類全局變量。 * 使用`global`關鍵詞聲明的變量 * 使用`static`關鍵詞聲明的類靜態變量、函數靜態變量 * PHP的超全局變量,包括`$_GET`、`$_POST`、`$GLOBALS`等 全局變量和對象,類靜態變量,保存在swoole_server對象上的變量不會被釋放。需要程序員自行處理這些變量和對象的銷毀工作。 ```php class Test { static $array = array(); static $string = ''; } function onReceive($serv, $fd, $reactorId, $data) { Test::$array[] = $fd; Test::$string .= $data; } ``` * 在事件回調函數中需要特別注意非局部變量的array類型值,某些操作如 TestClass::$array[] = "string" 可能會造成內存泄漏,嚴重時可能發生爆內存,必要時應當注意清理大數組。 * 在事件回調函數中,非局部變量的字符串進行拼接操作是必須小心內存泄漏,如 TestClass::$string .= $data,可能會有內存泄漏,嚴重時可能發生爆內存。 解決方法 ---- * 同步阻塞并且請求響應式無狀態的Server程序可以設置`max_request`,當Worker進程/Task進程結束運行時或達到任務上限后進程自動退出。該進程的所有變量/對象/資源均會被釋放回收。 * 程序內在`onClose`或設置`定時器`及時使用`unset`清理變量,回收資源 異步客戶端 ---- Swoole提供的異步客戶端與普通的PHP變量不同,異步客戶端在發起`connect`時底層會增加一次引用計數,在連接`close`時會減少引用計數。 > 包括`swoole_client`、`swoole_mysql`、`swoole_redis`、`swoole_http_client` ```php function test() { $client = new swoole_client(SWOOLE_TCP | SWOOLE_ASYNC); $client->on("connect", function($cli) { $cli->send("hello world\n"); }); $client->on("receive", function($cli, $data){ echo "Received: ".$data."\n"; $cli->close(); }); $client->on("error", function($cli){ echo "Connect failed\n"; }); $client->on("close", function($cli){ echo "Connection close\n"; }); $client->connect('127.0.0.1', 9501); return; } ``` * `$client`是局部變量,常規情況下return時會銷毀。 * 但這個`$client`是異步客戶端在執行`connect`時swoole引擎底層會增加一次引用計數,因此return時并不會銷毀。 * 該客戶端執行`onReceive`回調函數時進行了`close`或者服務器端主動關閉連接觸發`onClose`,這時底層會減少引用計數,`$client`才會被銷毀。
                  <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>

                              哎呀哎呀视频在线观看