Swoole v4.6.7 版本發佈,Bug修復版本

v4.6.7 版本主要是一個 Bug 修復版本,沒有向下不兼容改動。php

此版本中修復了Http\Response::end()方法老是返回 true 的問題,同時修改了 output_buffer_size 的默認值git

在以前的版本中 output_buffer_size 的默認值爲2M,因爲受到 output_buffer_size 的限制,若是在調用end時,須要發送的內容大於這個限制則會響應失敗,並拋出以下錯誤:github

use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;

$http = new Server('127.0.0.1', 9501);

$http->set([
    'http_compression' => false,
    'buffer_output_size' => 128 * 1024,
]);

$http->on('request', function (Request $request, Response $response) {
    assert($response->end(str_repeat('A', 256 * 1024)) === false);
    assert(swoole_last_error() === SWOOLE_ERROR_DATA_LENGTH_TOO_LARGE);
});

$http->start();
使用以上代碼便可復現該錯誤
WARNING finish (ERRNO 1203): The length of data [262144] exceeds the output buffer size[131072], please use the sendfile, chunked transfer mode or adjust the output_buffer_size

之前的解決方法爲:使用 sendfilewrite 或調整 output_buffer_size,而此版本中將output_buffer_size的默認值提升到了無符號 INT 最大值(UINT_MAX)bash

從 4.5 版本開始去掉了 Worker 進程共享內存的使用,改成了所有使用 UnixSocket 管道,因此再也不須要預先分配內存。output_buffer_size 參數只是一個限制,設置爲比較大的參數也不會致使額外佔用內存。swoole

同時還修復了end的返回值一直是true的問題,以上代碼中產生錯誤後未成功響應,返回值爲falsecurl

更新日誌

下面是完整的更新日誌:函數

加強

  • Manager 進程和 Task 同步進程支持調用Process::signal()函數 (#4190) (@matyhtf)

修復

  • 修復信號不能被重複註冊的問題 (#4170) (@matyhtf)
  • 修復在 OpenBSD/NetBSD 上編譯失敗的問題 (#4188) (#4194) (@devnexen)
  • 修復監聽可寫事件時特殊狀況 onClose 事件丟失 (#4204) (@matyhtf)
  • 修復 Symfony HttpClient 使用 native curl 的問題 (#4204) (@matyhtf)
  • 修復Http\Response::end()方法老是返回 true 的問題 (swoole/swoole-src@66fcc35) (@matyhtf)
  • 修復 PDOStatementProxy 產生的 PDOException (swoole/library#104) (@twose)

內核

  • 重構 worker buffer,給 event data 加上 msg id 標誌 (#4163) (@matyhtf)
  • 修改 Request Entity Too Large 日誌等級爲 warning 級別 (#4175) (@sy-records)
  • 替換 inet_ntoa and inet_aton 函數 (#4199) (@remicollet)
  • 修改 output_buffer_size 默認值爲 UINT_MAX (swoole/swoole-src@46ab345) (@matyhtf)

相關文章
相關標籤/搜索