<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # PHP7環境下出現zend_mm_heap corrupted PHP7+Swoole開啟`opcache`,運行時出現`zend_mm_heap corrupted`。這個問題的主要原因是PHP7增加了一個優化項,如果PHP代碼中一個數組只聲明一次,并且沒有對數據進行修改操作。PHP7會將此數組轉為`immutable`類型,此數組僅作為只讀。 PHP7的解析器只能識別PHP程序中的數組操作行為,但是擴展層對數組的修改無法識別。而Swoole的`Server->set`等方法可能會修改傳入的數組,導致出現內存錯誤。 Immutable數組 --- ```php $array = array( 'worker_num' => 1, 'log_file' => 'swoole.log', ); ``` 非Immutable數組 ---- ```php $array = array( 'worker_num' => 1, 'log_file' => 'swoole.log', ); //有修改行為,PHP7不會優化此數組為只讀 $array['daemonize'] = true; ``` 未啟用opcache時,Immutable數組即使被修改了,只要PHP代碼中沒有再操作此數據則不會出現內存錯誤。一旦開啟opcache,Immutable數組會被轉存到`SharedMemory`并進行持久化。這時Swoole修改此數組會使ZendVM發生內存錯誤,拋出`zend_mm_heap corrupted`錯誤。 ```c zval *zsetting = sw_zend_read_property(swoole_server_class_entry_ptr, getThis(), ZEND_STRL("setting"), 1); if (zsetting == NULL || ZVAL_IS_NULL(zsetting)) { SW_MAKE_STD_ZVAL(zsetting); array_init(zsetting); zend_update_property(swoole_server_class_entry_ptr, getThis(), ZEND_STRL("setting"), zsetting); } add_assoc_bool(zsetting, "open_http_protocol", 1); add_assoc_bool(zsetting, "open_mqtt_protocol", 0); add_assoc_bool(zsetting, "open_eof_check", 0); add_assoc_bool(zsetting, "open_length_check", 0); ``` 底層修復 ---- 1.9.2版本增加了一個`php_swoole_array_separate`的宏,用于將`Immutable數組`分離并重新構建一個`非Immutable數組`,底層就可以修改這個數組的值了。實現代碼: ```c #define php_swoole_array_separate(arr) zval *_new_##arr;\ SW_MAKE_STD_ZVAL(_new_##arr);\ array_init(_new_##arr);\ sw_php_array_merge(Z_ARRVAL_P(_new_##arr), Z_ARRVAL_P(arr));\ arr = _new_##arr; ``` 在C擴展中如果需要修改PHP代碼傳入的數組,必須調用`php_swoole_array_separate`將數組分離。 ```c php_swoole_array_separate(zset); ``` 解決辦法 ---- 升級到最新版本的swoole,或者關閉`opcache`擴展,可修改`php.ini`加入配置項: ```shell opcache.enable_cli = off ```
                  <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>

                              哎呀哎呀视频在线观看