Releases: swoole/swoole-src
Releases · swoole/swoole-src
v6.0.0-alpha
✨ New Feature:
Swoole
supports multi-threading mode. WhenPHP
is inZTS
mode andSwoole
is compiled with--enable-swoole-thread
, the multi-threading mode can be utilized.- Added a new thread management class
Swoole\Thread
. @matyhtf - Introduced thread lock
Swoole\Thread\Lock
. @matyhtf - Added thread atomic counter
Swoole\Thread\Atomic
,Swoole\Thread\Atomic\Long
. @matyhtf - Added safe concurrent containers
Swoole\Thread\Map
,Swoole\Thread\ArrayList
,Swoole\Thread\Queue
. @matyhtf - File asynchronous operations support
iouring
as the underlying engine. Installingliburing
and compilingSwoole
with--enable-iouring
enables asynchronous operations for functions likefile_get_contents
,file_put_contents
,fopen
,fclose
,fread
,fwrite
,mkdir
,unlink
,fsync
,fdatasync
,rename
,fstat
,lstat
,filesize
throughiouring
. @matyhtf @NathanFreeman - Upgraded
Boost Context
to version 1.84. Now, Loongson CPUs can also support coroutines. @NathanFreeman
📖 example:
- How to create threads
use Swoole\Thread;
$args = Thread::getArguments(); // If it is main thread, the $args is empty; if it is a child thread, the $args is not empty.
$c = 4;
if (empty($args)) {
# main thread
for ($i = 0; $i < $c; $i++) {
$threads[] = new Thread(__FILE__, $i);
}
for ($i = 0; $i < $c; $i++) {
$threads[$i]->join();
}
} else {
# child thread x 4
echo "Thread #" . $args[0] . "\n";
while (1) {
sleep(1);
file_get_contents('https://www.baidu.com/');
}
}
- Thread + Server (Asynchronous Style)
use Swoole\Process;
use Swoole\Thread;
use Swoole\Http\Server;
$http = new Server("0.0.0.0", 9503, SWOOLE_THREAD);
$http->set([
'worker_num' => 2,
'task_worker_num' => 3,
'bootstrap' => __FILE__,
// sharing data between threads through `init_arguments`.
'init_arguments' => function () use ($http) {
$map = new Swoole\Thread\Map;
return [$map];
}
]);
$http->on('Request', function ($req, $resp) use ($http) {
$resp->end('hello world');
});
$http->on('pipeMessage', function ($http, $srcWorkerId, $msg) {
echo "[worker#" . $http->getWorkerId() . "]\treceived pipe message[$msg] from " . $srcWorkerId . "\n";
});
$http->addProcess(new Process(function () {
echo "user process, id=" . Thread::getId();
sleep(2000);
}));
$http->on('Task', function ($server, $taskId, $srcWorkerId, $data) {
var_dump($taskId, $srcWorkerId, $data);
return ['result' => uniqid()];
});
$http->on('Finish', function ($server, $taskId, $data) {
var_dump($taskId, $data);
});
$http->on('WorkerStart', function ($serv, $wid) {
// Retrieve shared data passed by `init_arguments` in the configuration using `Swoole\Thread::getArguments()`.
var_dump(Thread::getArguments(), $wid);
});
$http->on('WorkerStop', function ($serv, $wid) {
var_dump('stop: T' . Thread::getId());
});
$http->start();
- Thread + Coroutine
use Swoole\Thread;
$args = Thread::getArguments(); // If it is main thread, the $args is empty; if it is a child thread, the $args is not empty.
$c = 4;
if (empty($args)) {
# main thread
for ($i = 0; $i < $c; $i++) {
$threads[] = new Thread(__FILE__, $i);
}
for ($i = 0; $i < $c; $i++) {
$threads[$i]->join();
}
} else {
# child thread x 4
echo "Thread #" . $args[0] . "\n";
Co\run(function() {
while (1) {
sleep(1);
Co\go(function () {
file_get_contents('https://www.baidu.com/');
});
}
});
}
🐛 Bug Fixed:
- Fixed the issue where installation via
pecl
was not possible. @remicollet - Fixed the bug where setting
keepalive
was not possible forSwoole\Coroutine\FastCGI\Client
. @NathanFreeman - Fixed the issue where exceeding the
max_input_vars
would throw an error, causing the process to restart repeatedly. @NathanFreeman - Fixed unknown issues caused by using
Swoole\Event::wait()
within a coroutine. @matyhtf - Fixed the problem where
proc_open
does not support pty in coroutine mode. @matyhtf - Fixed segmentation fault issues with
pdo_sqlite
on PHP 8.3. @NathanFreeman - Fixed unnecessary warnings during the compilation of
Swoole
. @Appla @NathanFreeward - Fixed the error thrown by zend_fetch_resource2_ex when
STDOUT/STDERR
are already closed. @Appla @matyhtf - Fixed ineffective
set_tcp_nodelay
configuration. @matyhtf - Fixed the occasional unreachable branch issue during file upload. @NathanFreeman
- Fixed the problem where setting
dispatch_func
would cause PHP's internals to throw errors. @NathanFreeman - Fixed the deprecation of AC_PROG_CC_C99 in autoconf >= 2.70. @petk
- Capture exceptions when thread creation fails. @matyhtf
- Fixed the undefined problem with
_tsrm_ls_cache
. @jingjingxyk - Fixed the fatal compile error with
GCC 14
. @remicollet
⭐️ Kernel optimization:
- Removed unnecessary checks for
socket structs
. @petk - Upgraded Swoole Library. @deminy
- Added support for status code 451 in
Swoole\Http\Response
. @abnegate - Synchronized
file
operation code across different PHP versions. @NathanFreeman - Synchronized
pdo
operation code across different PHP versions. @NathanFreeman - Optimized the code for
Socket::ssl_recv()
. @matyhtf - Improved config.m4; some configurations can now set library locations via
pkg-config
. @NathanFreeman - Optimized the use of dynamic arrays during
request header parsing
. @NathanFreeman - Optimized file descriptor
fd
lifecycle issues in multi-threading mode. @matyhtf - Optimized some fundamental coroutine logic. @matyhtf
❌ Deprecated:
- No longer supports
PHP 8.0
. - No longer supports
Swoole\Coroutine\MySQL
coroutine client. - No longer supports
Swoole\Coroutine\Redis
coroutine client. - No longer supports
Swoole\Coroutine\PostgreSQL
coroutine client.
⚠ Warning:
Swoole-v6.0.0-alpha
is a test version and cannot be used in any production environment; it is for testing purposes only.
😊 Thank you
- Thank you for your contribution to Swoole v6.0.0. Wish you good health, all the best, and smooth work.
✨ 新特性:
Swoole
支持多线程模式,当php
是zts
模式,编译Swoole
时开启--enable-swoole-thread
时,就能使用多线程模式。- 新增线程管理类
Swoole\Thread
。 @matyhtf - 新增线程锁
Swoole\Thread\Lock
。 @matyhtf - 新增线程原子计数
Swoole\Thread\Atomic
,Swoole\Thread\Atomic\Long
。 @matyhtf - 新增安全并发容器
Swoole\Thread\Map
,Swoole\Thread\ArrayList
,Swoole\Thread\Queue
。 @matyhtf - 文件异步操作支持
iouring
作为底层引擎,安装了liburing
和编译Swoole
时开启--enable-iouring
,file_get_contents
,file_put_contents
,fopen
,fclose
,fread
,fwrite
,mkdir
,unlink
,fsync
,fdatasync
,rename
,fstat
,lstat
,filesize
这些函数的异步操作将会由iouring
实现。 @matyhtf @NathanFreeman - 升级
Boost Context
版本到1.84。现在,龙芯CPU也能够支持协程了。 @NathanFreeman
📖 示例:
- 创建线程
use Swoole\Thread;
$args = Thread::getArguments(); // 如果是主线程,$args 为空,如果是子线程,$args 不为空
$c = 4;
if (empty($args)) {
# 主线程
for ($i = 0; $i < $c; $i++) {
$threads[] = new Thread(__FILE__, $i);
}
for ($i = 0; $i < $c; $i++) {
$threads[$i]->join();
}
} else {
# 子线程
echo "Thread #" . $args[0] . "\n";
while (1) {
sleep(1);
file_get_contents('https://www.baidu.com/');
}
}
- 线程 + 服务端(异步风格)
use Swoole\Process;
use Swoole\Thread;
use Swoole\Http\Server;
$http = new Server("0.0.0.0", 9503, SWOOLE_THREAD);
$http->set([
'worker_num' => 2,
'task_worker_num' => 3,
'bootstrap' => __FILE__,
// 通过init_arguments实现线程间的数据共享。
'init_arguments' => function () use ($http) {
$map = new Swoole\Thread\Map;
return [$map];
}
]);
$http->on('Request', function ($req, $resp) use ($http) {
$resp->end('hello world');
});
$http->on('pipeMessage', function ($http, $srcWorkerId, $msg) {
echo "[worker#" . $http->getWorkerId() . "]\treceived pipe message[$msg] from " . $srcWorkerId . "\n";
});
$http->addProcess(new Process(function () {
echo "user process, id=" . Thread::getId();
sleep(2000);
}));
$http->on('Task', function ($server, $taskId, $srcWorkerId, $data) {
var_dump($taskId, $srcWorkerId, $data);
return ['result' => uniqid()];
});
$http->on('Finish', function ($server, $taskId, $data) {
var_dump($taskId, $data);
});
$http->on('WorkerStart', function ($serv, $wid) {
// 通过Swoole\Thread::getArguments()获取配置中的init_arguments传递的共享数据
var_dump(Thread::getArguments(), $wid);
});
$http->on('WorkerStop', function ($serv, $wid) {
var_dump('stop: T' . Thread::getId());
});
$http->start();
- Thread + Coroutine 在线程中使用协程
use Swoole\Thread;
$args = Thread::getArguments(); // If it is main thread, the $args is empty; if it is a child thread, the $args is not empty.
$c = 4;
if (empty($args)) {
# main thread
for ($i = 0; $i < $c; $i++) {
$threads[] = new Thread(__FILE__, $i);
}
for ($i = 0; $i < $c; $i++) {
$threads[$i]->join();
}
} else {
# child thread x 4
echo "Thread #" . $args[0] . "\n";
Co\run(function() {
while (1) {
sleep(1);
Co\go(function () {
file_get_contents('https://www.baidu.com/');
});
}
});
}
🐛 Bug修复:
- 修复无法通过
pecl
安装的问题。 @remicollet - 修复
Swoole\Coroutine\FastCGI\Client
客户端无法设置keepalive。 @NathanFreeman - 修复请求参数超过
max_input_vars
时会抛出错误导致进程不断重启的问题。 @NathanFreeman - 修复在协程中使用
Swoole\Event::wait()
导致的未知问题。 @matyhtf - 修复
proc_open
在协程化的时候不支持pty的问题。 @matyhtf - 修复
pdo_sqlite
在PHP8.3会出现段错误的问题。 @NathanFreeman - 修复编译
Swoole
时的无用警告。 @Appla @NathanFreeman - 修复如果
STDOUT/STDERR
已经关闭时,底层调用zend_fetch_resource2_ex会抛出错误。 @Appla @matyhtf - 修复无效的
set_tcp_nodelay
配置。 @matyhtf - 修复文件上传的时...
v5.1.3
🐛 Bug Fixed:
- Fix the problem of being unable to install through
pecl
. @remicollet - Fix the issue of
Swoole\Coroutine\FastCGI\Client
client being unable to set keepalive. @NathanFreeman - Fix the issue of process continuously restarting due to error thrown when request parameters exceed
max_input_vars
. @NathanFreeman - Fix the unknown issue caused by using
Swoole\Event::wait()
in a coroutine. @matyhtf - Fix the issue of
proc_open
not supporting pty when used in a coroutine. @matyhtf - Fix the segmentation fault issue in
pdo_sqlite
on PHP 8.3. @NathanFreeman - Fix the unnecessary warning when compiling Swoole. @Appla @NathanFreeman
- Fix the error thrown when calling zend_fetch_resource2_ex on closed
STDOUT/STDERR
. @Appla @matyhtf - Fix the invalid
set_tcp_nodelay
configuration. @matyhtf - Fix the occasional unreachable branch issue triggered during file uploads. @NathanFreeman
- Fix the issue causing PHP core to throw errors when
dispatch_func
is set. @NathanFreeman - Fix the obsolete warning of AC_PROG_CC_C99 in autoconf >= 2.70 version. @petk
⭐️ Kernel optimization:
- Remove unnecessary checks for
socket structs
. @petk - Upgrade the
Swoole library
. @deminy - Add support for status code 451 in
Swoole\Http\Response
. @abnegate - Synchronize
file
operation code across different versions of PHP. @NathanFreeman - Synchronize
PDO
operation code across different versions of PHP. @NathanFreeman - Optimize the code for
Socket::ssl_recv()
function. @matyhtf - Optimized config.m4 by allowing some configurations to set dependency library locations using
pkg-config
. @NathanFreeman - Optimize the issue with using dynamic arrays when
parsing request headers
. @NathanFreeman
😊 Thank you
- Thank you for your contribution to Swoole v5.1.3. Wish you good health, all the best, and smooth work.
🐛 Bug修复:
- 修复无法通过
pecl
安装的问题。 @remicollet - 修复
Swoole\Coroutine\FastCGI\Client
客户端无法设置keepalive。 @NathanFreeman - 修复请求参数超过
max_input_vars
时会抛出错误导致进程不断重启的问题。 @NathanFreeman - 修复在协程中使用
Swoole\Event::wait()
导致的未知问题。 @matyhtf - 修复
proc_open
在协程化的时候不支持pty的问题。 @matyhtf - 修复
pdo_sqlite
在PHP8.3会出现段错误的问题。 @NathanFreeman - 修复编译
Swoole
时的无用警告。 @Appla @NathanFreeman - 修复如果
STDOUT/STDERR
已经关闭时,底层调用zend_fetch_resource2_ex会抛出错误。 @Appla @matyhtf - 修复无效的
set_tcp_nodelay
配置。 @matyhtf - 修复文件上传的时候偶尔会触发不可达的分支问题。 @NathanFreeman
- 修复设置了
dispatch_func
,会导致php底层抛出错误的问题。 @NathanFreeman - 修复AC_PROG_CC_C99在autoconf >= 2.70版本中已过时。 @petk
⭐️ 内核优化:
- 移除对
socket structs
的无用检查。 @petk - 升级swoole Library。 @deminy
Swoole\Http\Response
增加对451状态码的支持。 @abnegate- 同步PHP不同版本的
文件
操作代码。 @NathanFreeman - 同步PHP不同版本的
pdo
操作代码。 @NathanFreeman - 优化
Socket::ssl_recv()
的代码。 @matyhtf - 优化了config.m4,一些配置可以通过
pkg-config
设置依赖库位置。 @NathanFreeman - 优化
解析请求头
的时候使用动态数组的问题 。 @NathanFreeman
😊 致谢
- 感谢你们为Swoole v5.1.3做出的贡献,祝愿大家身体健康,万事如意,工作顺利。
v5.1.2
- Added support for embed sapi @matyhtf
- Fixed compatibility with PHP 8.3 ZEND_CHECK_STACK_LIMIT @Yurunsoft
- Fixed no Content-Range response header when the range request returns all the contents of the file @Yurunsoft
- Optimized HTTP server performance @NathanFreeman
- Fixed truncated cookie @stnguyen90
- Fixed native-curl crash on PHP 8.3 @NathanFreeman
- Added CLOSE_SERVICE_RESTART, CLOSE_TRY_AGAIN_LATER, CLOSE_BAD_GATEWAY as valid close reasons for websocket @cjavad
- Fixed invalid errno after Server::Manager::wait() @JacobBrownAustin
- Fixed HTTP2 Typo @leocavalcante
v5.1.1
🐛 Bug Fixed
- Fixed memory leak issue in
HTTP coroutine client
@NathanFreeman - Fixed the issue of can not hook
pdo_odbc
@NathanFreeman - Fixed the error in executing
socket_import_stream()
@Yurunsoft - Fixed the issue with
Context::parse_multipart_data()
unable to handle empty request body @NathanFreeman - Fixed the issue with
PostgreSQL coroutine client
where the parameters are not working @Yurunsoft - Fixed the bug where
curl
crashes during destruction @matyhtf - Fixed the compatibility issue between
Swoole 5.x
and the latest version ofxdebug
@NathanFreeman - Fixed the problem of
class not found
error caused by coroutine switching during the process ofclass autoloading
@Yurunsoft - Fixed the issue of not being able to compile
Swoole
onOpenBSD
@ChihHao-Su @twose
🐛 Bug 修复
- 修复
http协程客户端
内存泄漏问题 (@NathanFreeman) - 修复
pdo_odbc
无法协程化的问题 (@NathanFreeman) - 修复
socket_import_stream()
执行错误的问题 (@Yurunsoft) - 修复
Context::parse_multipart_data()
无法处理空请求体的问题 (@NathanFreeman) - 修复
PostgreSQL协程客户端
参数不起作用的问题 (@Yurunsoft) - 修复
curl
在析构时会崩溃的bug (@matyhtf) - 修复
Swoole5.x
与新版的xdebug
不兼容问题 (@NathanFreeman) - 修复类
自动加载
的过程中发生协程切换导致提示类不存在
的问题 (@Yurunsoft) - 修复无法在
OpenBSD
编译swoole
的问题 (@ChihHao-Su) (@twose)
v5.1.0
✨ New Features
- Support
pdo_pgsql
coroutine hook (@matyhtf) - Support
pdo_odbc
coroutine hook (@matyhtf) - Support
pdo_oci
coroutine hook (@NathanFreeman) - Support
pdo_sqlite
coroutine hook (@NathanFreeman) - Add configuration for PDO connection pools for
pdo_pgsql
,pdo_odbc
,pdo_oci
,pdo_sqlite
(@NathanFreeman)
💪 Performance Improvement
- Improved performance of
Http\Server
, can increase up to60%
in extreme cases (@matyhtf) (@NathanFreeman)
🐛 Bug Fixed
- Fixed the memory leak caused by each request of the
WebSocket coroutine client
(@matyhtf) (@NathanFreeman) - Fixed the issue where graceful shutdown of the
HTTP coroutine server
was not causing the client to exit (@matyhtf) - Fixed the issue where adding the
--enable-thread-context
option during compilation was causingProcess::signal()
to not work (@NathanFreeman) - Fixed the issue where the connection count was being calculated incorrectly when a process exited abnormally in
SWOOLE_BASE
mode (@Yunrunsoft) - Fixed the incorrect signature of the
stream_select()
function (@Yunrunsoft) (@NathanFreeman) - Fixed the case sensitivity issue with the MIME information in files (@hongweipeng)
- Fixed the spelling mistake in
Http2\Request::$usePipelineRead
, which was causing a warning to be thrown in PHP 8.2 environment (@NathanFreeman) - Fixed the memory leak issue in
SWOOLE_BASE
mode (@dongzitai) (@NathanFreeman) - Fixed the memory leak issue caused by setting the expiration time of a cookie in
Http\Response::cookie()
(@NathanFreeman) - Fixed the connection leak issue in
SWOOLE_BASE
mode (@NathanFreeman)
🔑 Kernel
- Fixed the function signature issue of php_url_encode in Swoole under PHP 8.3 (@YepYuYu)
- Fixed the issue with unit testing options (@YepYuYu)
- Optimized and refactored the code (@matyhtf)
- Fix compatibility with PHP 8.3 (@Yunrunsoft) (@matyhtf)
- Unsupported compilation on 32-bit operating systems
🌕🥮🥰 Happy Mid-Autumn Festival!
✨ 新特性
- 增加对
pdo_pgsql
的协程化支持 (@matyhtf) - 增加对
pdo_odbc
的协程化支持 (@matyhtf) - 增加对
pdo_oci
的协程化支持 (@NathanFreeman) - 增加对
pdo_sqlite
的协程化支持 (@NathanFreeman) - 增加
pdo_pgsql
,pdo_odbc
,pdo_oci
,pdo_sqlite
的连接池配置。(@NathanFreeman)
💪 性能提高
- 改进了
Http\Server
的性能,极限情况下可以提升60%
(@matyhtf) (@NathanFreeman)
🐛 Bug 修复
- 修复
WebSocket协程客户端
每次请求造成的内存泄漏 (@matyhtf) (@NathanFreeman) - 修复
http协程服务端
优雅退出导致客户端不退出的问题 (@matyhtf) - 修复编译的时候加入了
--enable-thread-context
选项会导致Process::signal()
不起作用(@NathanFreeman) - 修复
在SWOOLE_BASE模式
下,当进程非正常退出时,连接数统计错误的问题 (@Yunrunsoft) - 修复
stream_select()
函数签名错误 (@Yunrunsoft) (@NathanFreeman) - 修复文件MIME信息大小写敏感错误 (@hongweipeng)
- 修复
Http2\Request::$usePipelineRead
拼写错误导致在PHP8.2的环境下会抛出警告。 (@NathanFreeman) - 修复在
SWOOLE_BASE
模式下的内存泄漏问题 (@dongzitai) (@NathanFreeman) - 修复当
Http\Response::cookie()
设置cookie
的过期时间导致的内存泄漏问题 (@NathanFreeman) - 修复在
SWOOLE_BASE
模式下的连接泄漏问题 (@NathanFreeman)
🔑 内核
- 修复swoole在php8.3下的php_url_encode的函数签名问题 (@YepYuYu)
- 修复单元测试选项问题 (@YepYuYu)
- 优化,重构代码 (@matyhtf)
- 兼容PHP8.3 (@Yunrunsoft) (@matyhtf)
- 不支持32位操作系统上编译
🌕🥮🥰 祝大家中秋节快乐!
v5.0.3
- Added
--with-nghttp2_dir
option, Use the system nghttp2 library - Added unit character supports for byte length or size related options
- Fixed memory leak Server task/pipemessage/finish event callback
- Added
Process\Pool::sendMessage()
- Added support for
max-age
toHttp\Response:cookie()
method - No longer thrown error log when http header conflicts
- No longer thrown error log when the server connection is closed
- Fixed memory leak caused by Server send_yield
v4.8.13
- Fixed parameter compatibility of
Coroutine::printBackTrace()
anddebug_print_backtrace()
- Fixed parsing length is wrong when the websocket server enable http2 and websocket protocols at the same time
- Refactor curl native to support a curl handle with multiple sockets, such as the curl ftp protocol
- Support for configuring http2 default settings
- Improved websocket client, upgrade header contains websocket instead of equal
- Optimized http client, disable keep-alive when server sends connection close
- Optimized http client, prohibit adding the
Accept-Encoding
header without compression library - Improved debug info, set password as sensitive parameter under PHP-8.2
- Fixed memory leak when send_yield occurs in
Server::send()
,Http\Response::end()
,Http\Response::write()
,WebSocket/Server::push()
- Fixed crash when using
Table::getMemorySize()
before add columns - Support HTTP Range Requests
v5.0.2
- Support for configuring http2 default settings
- Support xdebug under 8.1 or higher
- Refactor curl native to support a curl handle with multiple sockets, such as the curl ftp protocol
- Added
$who
parameter toProcess::setPriority/getPriority
- Added
Coroutine\Socket::getBoundCid()
- Adjusted the default value of
Coroutine\Socket::recvLine/recvWithBuffer
$length
parameter to65536
- Refactor cross-coroutine shutdown feature to make memory release safer and solve the crash problem when a fatal error occurs
- Added socket property for
Coroutine\Client
,Coroutine\Http\Client
,Coroutine\Http2\Client
, allow direct operation of socket resources - Support
Http\Server
to send empty file to http2 client - Support graceful restart for
Coroutine\Http\Server
. When server shuting down, the client connection will no longer be forcibly closed, and only stop listening to new requests - Added
pcntl_rfork
pcntl_sigwaitinfo
to list of unsafe function, will be closed when coroutine container starts - Refactor Server process manager with base mode, the behavior of shutdown and reload will be consistent with base or process mode
The
version-5.0.2
has no backwards incompatible changes
v5.0.1
- Supported
PHP-8.2
- Improved coroutine exception handling, compatible with
ext-soap
- Fixed parameter compatibility of
Coroutine::printBackTrace()
anddebug_print_backtrace()
- Added pgsql coroutine client LOB supports
- Fixed
Event::add()
support for sockets resources - Fixed compile error when no zlib
- Improved websocket client, upgrade header contains websocket instead of equal
- Optimized http client, disable
keep-alive
when server sends connection close - Optimized http client, prohibit adding the
Accept-Encoding
header without compression library - Improved debug info, set password as sensitive parameter under PHP-8.2
- Fixed crash when unpack server task parsed to an unexpected string
- Enhanced
Server::taskWaitMulti()
, no blocking in coroutine environment - Fixed the problem that adding a timer less than 1ms is forced to 0
- Fixed crash when using
table::getMemorySize()
before add columns - Optimized log function, no longer print screen when writing to the log file fails
- Modify the
expire
parameter name ofHttp\Response::setCookie()
toexpires
, fix #4780
v4.8.12
- Supports
PHP-8.2
- Enhanced
Event::add()
support for sockets resources - Fixed incorrect error message when wrong multipart body is received
- Improved
Http\Client::sendfile()
, support large files over 4G - Improved
Server::taskWaitMulti()
, support coroutine environment - Fixed incorrect error message when add timer less than 1ms
- Fixed deadlock caused by writing log when disk is full