swoole: Changelog

Version Message
6.0.0 - Swoole supports multi-threading mode. When PHP is in ZTS mode and Swoole is compiled with --enable-swoole-thread, the multi-threading mode can be utilized.
- Added a new thread management class Swoole\Thread.
- Introduced thread lock Swoole\Thread\Lock.
- Added thread atomic counter Swoole\Thread\Atomic, Swoole\Thread\Atomic\Long.
- Added safe concurrent containers Swoole\Thread\Map, Swoole\Thread\ArrayList, Swoole\Thread\Queue.
- File asynchronous operations support iouring as the underlying engine. Installing liburing and compiling Swoole with --enable-iouring enables asynchronous operations for functions like file_get_contents, file_put_contents, fopen, fclose, fread, fwrite, mkdir, unlink, fsync, fdatasync, rename, fstat, lstat, filesize through iouring.
- Upgraded Boost Context to version 1.84. Now, Loongson CPUs can also supports coroutines.
- Fixed the issue where installation via pecl was not possible.
- Fixed the bug where setting keepalive was not possible for Swoole\Coroutine\FastCGI\Client.
- Fixed the issue where exceeding the max_input_vars would throw an error, causing the process to restart repeatedly.
- Fixed unknown issues caused by using Swoole\Event::wait() within a coroutine.
- Fixed the problem where proc_open does not support pty in coroutine mode.
- Fixed segmentation fault issues with pdo_sqlite on PHP 8.3.
- Fixed unnecessary warnings during the compilation of Swoole.
- Fixed the error thrown by zend_fetch_resource2_ex when STDOUT/STDERR are already closed.
- Fixed ineffective set_tcp_nodelay configuration.
- Fixed the occasional unreachable branch issue during file upload.
- Fixed the problem where setting dispatch_func would cause PHP's internals to throw errors.
- Fixed the deprecation of AC_PROG_CC_C99 in autoconf >= 2.70.
- Capture exceptions when thread creation fails.
- Fixed the undefined problem with _tsrm_ls_cache.
- Fixed the fatal compile error with GCC 14.
- Removed unnecessary checks for socket structs.
- Upgraded Swoole Library.
- Added support for status code 451 in Swoole\Http\Response.
- Synchronized file operation code across different PHP versions.
- Synchronized pdo operation code across different PHP versions.
- Optimized the code for Socket::ssl_recv().
- Improved config.m4; some configurations can now set library locations via pkg-config.
- Optimized the use of dynamic arrays during request header parsing.
- Optimized file descriptor fd lifecycle issues in multi-threading mode.
- Optimized some fundamental coroutine logic.
- 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.
- Swoole-v6.0.0-alpha is a test version and cannot be used in any production environment; it is for testing purposes only.
5.1.3 - Fix the problem of being unable to install through pecl.
- Fix the issue of Swoole\Coroutine\FastCGI\Client client being unable to set keepalive.
- Fix the issue of process continuously restarting due to error thrown when request parameters exceed max_input_vars.
- Fix the unknown issue caused by using Swoole\Event::wait() in a coroutine.
- Fix the issue of proc_open not supporting pty when used in a coroutine.
- Fix the segmentation fault issue in pdo_sqlite on PHP 8.3.
- Fix the unnecessary warning when compiling Swoole.
- Fix the error thrown when calling zend_fetch_resource2_ex on closed STDOUT/STDERR.
- Fix the invalid set_tcp_nodelay configuration.
- Fix the occasional unreachable branch issue triggered during file uploads.
- Fix the issue causing PHP core to throw errors when dispatch_func is set.
- Fix the obsolete warning of AC_PROG_CC_C99 in autoconf >= 2.70 version.
- Remove unnecessary checks for socket structs.
- Upgrade the Swoole library.
- Add support for http status code 451 in Swoole\Http\Response.
- Synchronize file operation code across different versions of PHP.
- Synchronize PDO operation code across different versions of PHP.
- Optimize the code for Socket::ssl_recv() function.
- Optimized config.m4 by allowing some configurations to set dependency library locations using pkg-config.
- Optimize the issue with using dynamic arrays when parsing request headers.
5.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
5.1.1 - Fixed memory leak issue in HTTP coroutine client
- Fixed the issue of can not hook pdo_odbc
- Fixed the error in executing socket_import_stream()
- Fixed the issue with Context::parse_multipart_data() unable to handle empty request body
- Fixed the issue with PostgreSQL coroutine client where the parameters are not working
- Fixed the bug where curl crashes during destruction
- Fixed the compatibility issue between Swoole 5.x and the latest version of xdebug
- Fixed the problem of class not found error caused by coroutine switching during the process of class autoloading
- Fixed the issue of not being able to compile Swoole on OpenBSD
5.1.0 - Support pdo_pgsql coroutine hook
- Support pdo_odbc coroutine hook
- Support pdo_oci coroutine hook
- Support pdo_sqlite coroutine hook
- Add configuration for PDO connection pools for pdo_pgsql, pdo_odbc, pdo_oci, pdo_sqlite
- Improved performance of Http\Server, can increase up to 60% in extreme cases
- Fixed the memory leak caused by each request of the WebSocket coroutine client
- Fixed the issue where graceful shutdown of the HTTP coroutine server was not causing the client to exit
- Fixed the issue where adding the --enable-thread-context option during compilation was causing Process::signal() to not work
- Fixed the issue where the connection count was being calculated incorrectly when a process exited abnormally in SWOOLE_BASE mode
- Fixed the incorrect signature of the stream_select() function
- Fixed the case sensitivity issue with the MIME information in files
- Fixed the spelling mistake in Http2\Request::$usePipelineRead, which was causing a warning to be thrown in PHP 8.2 environment
- Fixed the memory leak issue in SWOOLE_BASE mode
- Fixed the memory leak issue caused by setting the expiration time of a cookie in Http\Response::cookie()
- Fixed the connection leak issue in SWOOLE_BASE mode
- Fixed the function signature issue of php_url_encode in Swoole under PHP 8.3
- Fixed the issue with unit testing options
- Optimized and refactored the code
- Fix compatibility with PHP 8.3
5.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 to Http\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
5.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 to Process::setPriority/getPriority
- Added Coroutine\Socket::getBoundCid()
- Adjusted the default value of Coroutine\Socket::recvLine/recvWithBuffer $length parameter to 65536
- 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
5.0.1 * Supported PHP-8.2
* Improved coroutine exception handling, compatible with ext-soap
* Fixed parameter compatibility of Coroutine::printBackTrace() and debug_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
5.0.0 Added
* Added max_concurrency option for Server
* Added max_retries option for Coroutine\Http\Client
* Added name_resolver global option
* Added upload_max_filesize option for Server
* Added Coroutine::getExecuteTime()
* Added SWOOLE_DISPATCH_CONCURRENT_LB dispatch_mode for Server

* Enhanced type system, added types for parameters and return values of all functions
* Optimized error handling, all constructors will throw exceptions when fail
* Adjusted the default mode of Server, the default is SWOOLE_BASE mode
* Migrate pgsql coroutine client to core
* Contains all bugfixes from the 4.8.x branch

- Removed PSR-0 style class names
- Removed the automatic addition of Event::wait() in shutdown function
- Removed Server::tick/after/clearTimer/defer aliases
- Removed --enable-http/--enable-swoole-json, adjusted to be enable by default

- Deprecated Coroutine\Redis and Coroutine\MySQL
4.8.13 - Fixed parameter compatibility of Coroutine::printBackTrace() and debug_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
4.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
4.8.11 - Supports intel CET
- Fixed #4712
- Fixed crash issue when pdo persistent connection throws exception
- Added Server::$ssl property
- Added enable-cares option to pecl
- Refactor multipart_parser
- Fixed incorrect error message in Server::close()
4.8.10 - Reset value to 1ms when stream_select timeout is less than 1ms
- Fixed #4693
- Fixed #4699
4.8.9 - Added support http_auto_index for http2 server
- Fixed #4657
- Fixed the stream_select hook function memory leak
- Optimized cookies parser
4.8.8 - Reduce SW_IPC_BUFFER_MAX_SIZE to 64k
- Respect SETTINGS_HEADER_TABLE_SIZE http2 setting (#4635)
- Fixed #4639
- Fixed http2 server NPN errors
4.8.7 - Added curl_share supports
- Fixed symbol undefined on arm32 platform
- Fixed clock_gettime() compatibility
- Fixed issue where server sending fails with PROCESS mode when kernel lacks large block of memory
4.8.6 - Added prefix to boost/context API names
- Optimized configure options
4.8.5 - Revert parameter type of Table
- Fix crash when received wrong data with websocket protocol
4.8.4 - Fixed compatibility of sockets hook with PHP-8.1
- Fixed compatibility of Table with PHP-8.1
- Fixed bug #4519
4.8.3 - Fixed compatibility of curl native hook with PHP-8.1
- Fixed compatibility of sockets hook with PHP-8
- Fixed the return value error of sockets hook function
- Added Coroutine\Socket::isClosed()
- Fixed Http2Server sendfile cannot set content-type
- Optimize performance of HttpServer date header
4.8.2 - Fixed memory leak of proc_open hook
- Fixed compatibility of curl native hook with PHP-8.0 and PHP-8.1
- Fixed connection cannot be closed normally in the Manager process
- Fixed Manager process cannot use sendMessage
- Fixed Coroutine\Http\Server received abnormally large POST data parsing
- Fixed cannot exit directly when a fatal error occurs in PHP8 environment
- Adjust coroutine max_concurrency option, only allowed to be used in Co::set()
- Adjust Coroutine::join() to ignore non-exists coroutine
4.8.1 New APIs
* Added swoole_error_log_ex(), swoole_ignore_error() (#4440) (@matyhtf)

* Migrate admin api from ext-swoole_plus to swoole-src (#4441) (@matyhtf)
* Added get_composer_packages command for admin server (swoole/library@07763f46) (swoole/library@8805dc05) (swoole/library@175f1797) (@sy-records) (@yunbaoi)
* Added POST method request restrictions for write operations (swoole/library@ac16927c) (@yunbaoi)
* Supported to get the method information of the class by get_function_info (swoole/library@690a1952) (@djw1028769140) (@sy-records)
* Optimized admin server code (swoole/library#128) (swoole/library#131) (@sy-records)
* Supported to request multiple groups of server information for admin server (swoole/library#124) (@sy-records)
* Supported to get interface info for admin server (swoole/library#130) (@sy-records)
* Supported CURLOPT_HTTPPROXYTUNNEL for SWOOLE_HOOK_CURL (swoole/library#126) (@sy-records)

* Prohibit coroutine concurrent join (#4442) (@matyhtf)
* Fixed init_row, don't clear lock_ and lock_pid (#4446) (@Txhua) (@matyhtf)
* Fixed missing helper options (swoole/library#123) (@sy-records)
* Fixed get_static_property_value command error (swoole/library#129) (@sy-records)
4.8.0 New APIs
* Added Co::getStackUsage() (#4398) (@matyhtf) (@twose)
* Added Coroutine\Redis some api (#4390) (@chrysanthemum)
* Added Table::stats() (#4405) (@matyhtf)
* Added Coroutine::join() (#4406) (@matyhtf)

New feature
* Supported server command (#4389) (@matyhtf)
* Supported Server::onBeforeShutdown callback (#4415) (@matyhtf)

* Set error code when websocket pack fails (swoole/swoole-src@d27c5a5) (@matyhtf)
* Added Timer::exec_count field (#4402) (@matyhtf)
* Supported for hooked mkdir using open_basedir ini config (#4407) (@NathanFreeman)
* Added vendor_init.php (swoole/library@6c40b02) (@matyhtf)
* Supported CURLOPT_UNIX_SOCKET_PATH for SWOOLE_HOOK_CURL (swoole/library#121) (@sy-records)
* Supported ssl_ciphers config for client (#4432) (@amuluowin)

* Fixed unnecessary URL decode of file names when uploading files (swoole/swoole-src@a73780e) (@matyhtf)
* Fixed HTTP2 max_frame_size error (#4394) (@twose)
* Fixed curl_multi_select bug #4393 (#4418) (@matyhtf)
* Fixed missing coroutine options (#4425) (@sy-records)
* Fixed connection cannot be forcibly closed when the send buffer is full (swoole/swoole-src@2198378) (@matyhtf)
4.7.1 New feature
* Introduce a new concurrency mode (#4330) (@doubaokun)

* Supported query /etc/hosts for System::dnsLookup (#4341) (#4349) (@zmyWL) (@NathanFreeman)
* Supported boost context support for mips64 (#4358) (@dixyes)
* Supported CURLOPT_RESOLVE option for SWOOLE_HOOK_CURL (swoole/library#107) (@sy-records)
* Supported CURLOPT_NOPROGRESS for SWOOLE_HOOK_CURL (swoole/library#117) (@sy-records)
* Supported boost context support for riscv64 (#4375) (@dixyes)

* Fixed memory error on shutdown (PHP-8.1) (#4325) (@twose)
* Fixed not serializable classes for 8.1.0beta1 (#4335) (@remicollet)
* Fixed multiple coroutines recursively creating directories (#4337) (@NathanFreeman)
* Fixed native curl bugs (#4360) (@matyhtf)
* Fixed PDOStatement::bindParam() expects parameter 1 to be string (swoole/library#116) (@sy-records)
4.7.0 New APIs
* Added Process\Pool::detach() (#4221) (@matyhtf)
* Added onDisconnect callback for Swoole\Server (#4230) (@matyhtf)
* Added Coroutine::cancel() (#4247) (#4249) (@matyhtf)
* Added http_compression/body_decompression options for Http Client (#4299) (@matyhtf)

* Supported mysql client prepare field type identification (#4238) (@Yurunsoft)
* Supported c-ares, Refactor DNS (#4275) (@matyhtf)
* Supported setting different idle time for each port (#4290) (@matyhtf)
* Supported SW_DISPATCH_CO_CONN_LB and SW_DISPATCH_CO_REQ_LB for Swoole\Server dispatch_mode (#4318) (@matyhtf)
* Supported timeout for Swoole\ConnectionPool::get (swoole/library#108) (@leocavalcante)
* Supported CURLOPT_PRIVATE for Hook Curl (swoole/library#112) (@sy-records)
* Optimized PDOStatementProxy::setFetchMode function prototype (swoole/library#109) (@yespire)

* Fixed uncaught thread creation exception when creating a large number of coroutines (swoole/swoole-src@8ce5041) (@matyhtf)
* Fixed the "make install" missing php_swoole.h header file (#4239) (@sy-records)
* Fixed EVENT_HANDSHAKE BC (#4248) (@sy-records)
* Fixed SW_LOCK_CHECK_RETURN (#4302) (@zmyWL)
* Fixed problems with Swoole\Atomic\Long M1 chip (swoole/swoole-src@e6fae2e) (@matyhtf)
* Fixed missing return value of Coroutine\go (swoole/library@1ed49db) (@matyhtf)
* Fixed StringObject consistency between other methods and its immutability (swoole/library#111) (@leocavalcante)
* Fixed StringObject substr error (swoole/library#113) (@sy-records)

* Did not hook disabled functions (#4283) (@twose)

* Added Cygwin build (#4222) (@sy-records)
* Added alpine 3.13 and 3.14 into building test (#4309) (@limingxinleo)
4.6.7 Enhancement
* Supported call Process::signal() in Manager process and Task synchronous process (#4190) (@matyhtf)

* Fixed signal cannot be registered repeatedly (#4170) (@matyhtf)
* Fixed build on OpenBSD/NetBSD (#4188) (#4194) (@devnexen)
* Fixed special case OnClose event missing while listening for writable events (#4204) (@matyhtf)
* Fixed native curl with Symfony HttpClient (#4208) (@matyhtf)
* Fixed Http\Response::end() always return true (swoole/swoole-src@66fcc35) (@matyhtf)
* Fixed PDOException generated by PDOStatementProxy (swoole/library#104) (@twose)

* Refactored worker buffer, add msg id for the event data (#4163) (@matyhtf)
* Changed the log level of "Request Entity Too Large" to warning (#4175) (@sy-records)
* Deleted inet_ntoa and inet_aton calls (#4199) (@remicollet)
* Adjusted output_buffer_size value to UINT_MAX (swoole/swoole-src@46ab345) (@matyhtf)
4.6.6 Enhancement
* Sent SIGTERM to the manager process on FreeBSD when master process is dead (#4150) (@devnexen)
* Supported static compilation with PHP (#4153) (@matyhtf)
* Supported SNI for File Wrapper over HTTP proxy (#4158) (@matyhtf)

* Fixed sync-client async connect bugs (#4152) (@matyhtf)
* Fixed native curl multi mem leak (swoole/swoole-src@91bf243) (@matyhtf)
4.6.5 New APIs
* Add count method to WaitGroup (swoole/library#100) (@sy-records) (@deminy)

* Supported native curl multi (#4093) (#4099) (#4101) (#4105) (#4113) (#4121) (swoole/swoole-src@cd7f51c) (#4147) (@matyhtf) (@sy-records) (@huanghantao)
* Allow array HTTP/2 headers, Bug fixed for #4133 (#4140)

* Fixed NetBSD build (#4080) (@devnexen)
* Fixed OpenBSD build. (#4108) (@devnexen)
* Fixed illumos/solaris build, member aliases only (#4109) (@devnexen)
* Fixed heartbeat detection of SSL connection does not take effect when handshake is not completed (#4114) (@matyhtf)
* Fixed httpclient proxy with host and port (#4124) (@Yurunsoft)
* Fixed Swoole\Coroutine\Http::request, correct array to the client setting (swoole/library#103) (@leocavalcante) (@deminy)

* Supported asm context on BSD (#4082) (@devnexen)
* Used arc4random_buf to implement getrandom under FreeBSD (#4096) (@devnexen)
* Make context darwin arm64: removes workaround and uses the label (#4127) (@devnexen)

* Added build job for alpine (#4104) (@limingxinleo)
4.6.4 Enhancement
+ Supported ARM 64 build (#4057) (@devnexen)
+ Supported set open_http_protocol in Swoole TCP Server (#4063) (@matyhtf)
+ Supported ssl client only set certificate (swoole/swoole-src@91704ac) (@matyhtf)
+ Supported ssl client only set certificate (swoole/swoole-src@91704ac) (@matyhtf)
+ Supported tcp_defer_accept option for FreeBSD (#4049) (@devnexen)

* Fixed Proxy-Authorization missing when use Coroutine\Http\Client (swoole/swoole-src@edc0552) (@matyhtf)
* Fixed memory allocation issues with Swoole\Table (swoole/swoole-src@3e7770f) (@matyhtf)
* Fixed crash when Coroutine\Http2\Client connects concurrently (swoole/swoole-src@630536d) (@matyhtf)
* Fixed enable_ssl_encrypt with DTLS (swoole/swoole-src@842733b) (@matyhtf)
* Fixed Coroutine\Barrier mem leak (swoole/library#94) (@Appla) (@FMiS)
* Fixed the offset error caused by CURLOPT_PORT and CURLOPT_URL order (swoole/library#96) (@sy-records)
* Fixed Table::get($key, $field) when field type is float (swoole/swoole-src@08ea20c) (@matyhtf)
* Fixed Swoole\Table mem leaks (swoole/swoole-src@d78ca8c) (@matyhtf)
4.6.3 New APIs
+ Added Swoole\Coroutine\go function (swoole/library@82f63be) (@matyhtf)
+ Added Swoole\Coroutine\defer function (swoole/library@92fd0de) (@matyhtf)

+ Added option compression_min_length for HTTP Server (#4033) (@matyhtf)
+ Allowed setting content-length HTTP header in application layer (#4041) (@doubaokun)

* Fixed coredump when program reach file open limitation (swoole/swoole-src@709813f) (@matyhtf)
* Fixed JIT being disabled (#4029) (@twose)
* Fixed Response::create() bug (swoole/swoole-src@a630b5b) (@matyhtf)
* Fixed task process id false positives on ARM (#4040) (@doubaokun)
* Fixed README (#4046) (@asheroto)
* Fixed native-curl crash on PHP8 (#4042) (#4045) (@Yurunsoft) (@matyhtf)
* Fixed mem error (#4050) (@matyhtf)

* Optimized ssl_connect/ssl_shutdown (#4030) (@matyhtf)
* Exit the process directly when a fatal error occurs (#4053) (@matyhtf)
4.6.2 New APIs
+ Added Http::Request::getMethod() (#3987) (@luolaifa000)
+ Added Coroutine::Socket:recvLine() (#4014) (@matyhtf)
+ Added Socket::readWithBuffer() (#4017) (@matyhtf)

+ Improved Response::create() (#3998) (@matyhtf)
+ Supported Coroutine\Redis::hExists return bool with compatibility_mode (swoole/swoole-src@b8cce7c) (@matyhtf)
+ Supported PHP_NORMAL_READ for socket_read (swoole/swoole-src@b1a0dcc) (@matyhtf)

* Fixed Coroutine::defer coredump in PHP8 (#3997) (@huanghantao)
* Fixed Coroutine::Socket::errCode is not set correctly when using thread context (swoole/swoole-src@004d08a) (@matyhtf)
* Fixed build Swoole error on latest macos (#4007) (@matyhtf)
* Fixed php stream context is nullptr when use md5_file with url (#4016) (@ZhiyangLeeCN)
* Fixed rshutdown deprecated warning when throw exception (#4026) (@huanghantao)

* Used AIO thread hook stdio instead of coroutine socket (#4002) (@matyhtf)
* Refactor HttpContext (#3998) (@matyhtf)
* Refactor Process::wait() (#4019) (@matyhtf)
4.6.1 Enhancement
+ Added --enable-thread-context option (#3970) (@matyhtf)
+ Strict session_id, check the connection activity (#3993) (@matyhtf)
* Optimized CURLOPT_PROXY, support user, pass and scheme (swoole/library#87) (sy-records)

* Fixed minimal PHP version (#3979) (@remicollet)
* Fixed pecl install missing enable-swoole-json and enable-swoole-curl options (#3980) (@sy-records)
* Fixed openssl thread safety issue (swoole/swoole-src@b516d69) (@matyhtf)
* Fixed enableSSL coredump (#3990) (@huanghantao)

* Optimized ipc writev, avoid coredump how event data is null (#3994) (@matyhtf)
4.6.0 Backward compatibility Break
* Removed the maximum limit of session id, never repeat (#3879) (@matyhtf)
* Disabled unsafe function when use Coroutine, including pcntl_fork/pcntl_wait/pcntl_waitpid/pcntl_sigtimedwait (#3880) (@matyhtf)
* Enabled coroutine hook by default (#3903) (@matyhtf)

- No longer support PHP-7.1 (swoole/swoole-src@4a963df) (swoole/swoole-src@9de8d9e) (@matyhtf)

- Marked the Event::rshutdown() as deprecated, please use Coroutine::run instead (#3881) (@matyhtf)

New APIs
+ Supported setPriority/getPriority (#3876) (@matyhtf)
+ Supported native-curl hook (#3863) (@matyhtf) (@huanghantao)
+ Supported object style callback parameters for Server, off by default (#3888) (@matyhtf)
+ Supported ext-sockets hook (#3898) (@matyhtf)
+ Supported duplicate header (#3905) (@matyhtf)
+ Supported SSL sni (#3908) (@matyhtf)
+ Supported hook stdio (#3924) (@matyhtf)
+ Supported capture_peer_cert option for stream_socket (#3930) (@matyhtf)
+ Added Http\Request::create/parse/isCompleted (#3938) (@matyhtf)
+ Added Http\Response::isWritable (swoole/swoole-src@db56827) (@matyhtf)

+ All time accuracy of Server changed from int to double (#3882) (@matyhtf)
+ Added poll EINTR check for swoole_client_select (#3909) (@shiguangqi)
+ Added coroutine deadlock detect (#3911) (@matyhtf)
+ Supported closing the connection in another process with server base mode (#3916) (@matyhtf)
+ Optimized send to worker from master, reduced memory copy (#3910) (@huanghantao) (@matyhtf)

* Pop Coroutine::Channel data when channel is closed (swoole/swoole-src@960431d) (@matyhtf)
* Fixed memory error when use JIT (#3907) (@twose)
* Fixed port->set() dtls compile error (#3947) (@Yurunsoft)
* Fixed connection_list error (#3948) (@sy-records)
* Fixed ssl verify (#3954) (@matyhtf)
* Clear all columns when incr and decr (#3956) (@matyhtf) (@sy-records)
* Fixed failed to compile with LibreSSL 2.7.5 (#3962) (@matyhtf)

* Ignored SIGPIPE signal by default (swoole/swoole-src@9647678) (@matyhtf)
* Supported running php and c coroutines at same time (swoole/swoole-src@c94bfd8) (@matyhtf)
* Added TEST(coroutine_base, get_elapsed) (#3961) (@luolaifa000)
* Added TEST(coroutine_base, get_init_msec) (#3964) (@luffluo)
4.5.11 Enhancement
* Optimize table (#3959) (@matyhtf)
* Enhancement CURLOPT_PROXY (swoole/library#87) (@sy-records)

* Clear all columns when incr and decr (#3956) (@matyhtf)
* Fixed compile error (49fea171) (@matyhtf)
* Fixed fread bugs (#3972) (@matyhtf)
* Fixed openssl thread safety issue (7ee2c1a0) (@matyhtf)
* Fixed Invalid argument supplied for foreach (swoole/library#80) (@sy-records)
* Fixed trigger_error param error (swoole/library#86) (@sy-records)
4.5.10 Fixed
* Fixed #3906, sync master (93901dc0) (@matyhtf)
* Fixed PHP8 compatibility (f0dc6d32) (@matyhtf)
* Fixed connection_list error (#3948) (@sy-records)
4.5.9 Enhancement
+ Added SWOOLE_HTTP_CLIENT_ESTATUS_SEND_FAILED constant for Coroutine\\Http\\Client (#3873) (@sy-records)

* Fixed PHP8 compatibility (#3868) (#3869) (#3872) (@twose) (@huanghantao) (@doubaokun)
* Fixed undefined constant CURLOPT_HEADEROPT and CURLOPT_PROXYHEADER (swoole/library#77) (@sy-records)
* Fixed CURLOPT_USERPWD (swoole/library@7952a7b6) (@twose)
4.5.8 New APIs
+ Added swoole_error_log function (swoole/swoole-src@67d2bff) (@matyhtf)
+ Supported SSL for readVector and writeVector (#3857) (@huanghantao)

+ Did not wait when the child process does not exist (#3832) (@matyhtf)
+ Supported DTLS 16k record (#3849) (@matyhtf)
+ Supported priority for cookie (#3854) (@matyhtf)
+ Supported more CURL options (swoole/library#71) (@sy-records)
+ Handled CURL header names in case insensitive manner (swoole/library#76) (@filakhtov) (@twose) (@sy-records)

* Fixed readv_all and writev_all when trigger EAGAIN errno (#3830) (@huanghantao)
* Fixed warning for PHP8 (swoole/swoole-src@03f3fb0) (@matyhtf)
* Fixed binary security of swoole table keys (#3842) (@twose)
* Fixed System::writeFile append file issue when using FILE_APPEND (swoole/swoole-src@a71956d) (@matyhtf)
* Fixed CURLOPT_WRITEFUNCTION (swoole/library#74) (@sy-records)
* Fixed memory overread when parse form-data boundary (#3858) (@twose)
* Fixed is_callable() can not access internal private callable on PHP8 (#3859) (@twose)

* Refactored memory allocation function, replace macro with SwooleG.std_allocator (#3853) (@matyhtf)
* Refactored pipe (#3841) (@matyhtf)
4.5.7 New APIs
+ Added writeVector, writeVectorAll, readVector, readVectorAll for Coroutine::Socket (#3764) (@huanghantao)

+ Added task_worker_num and dispatch_count for server->stats (#3771) (#3806) (@sy-records) (@matyhtf)
+ Added extension dependencies, including json, mysqlnd, sockets (#3789) (@remicollet)
+ Limited the minimum for uid server->bind is INT32_MIN (#3785) (@sy-records)
+ Added compilation option for JSON decoder, Support negative offset (#3809) (@matyhtf)
+ Added CURLOPT_TCP_NODELAY for Curl (swoole/library#65) (@sy-records) (@deminy)

* Fixed sync client::connect error info (#3784) (@twose)
* Fixed the scandir function hooked (#3793) (@twose)
* Fixed some errors in the barrier (swoole/library#68) (@sy-records)

* Optimized print-backtrace, using boost.stacktrace (#3788) (@matyhtf)
4.5.6 New APIs
+ Added swoole_substr_unserialize and swoole_substr_json_decode (#3762) (@matyhtf)

+ Modified Coroutine\Http\Server::onAccept to private property (#dfcc83b) (@matyhtf)

* Fixed coverity issues (#3737) (#3740) (@matyhtf)
* Fixed some bugs on Alpine (#3738) (@matyhtf)
* Fixed swMutex_lockwait (#0fc5665) (@matyhtf)
* Fixed PHP-8.1 build error (#3757) (@twose)

* Added check_liveness for Socket::read/write/shutdown (#3735) (@matyhtf)
* Changed the type of session_id and task_id to int64 (#3756) (@matyhtf)
4.5.5 New APIs
+ Added Process\Manager and alias Process\ProcessManager (swoole/library#eac1ac5) (@matyhtf)
+ Support HTTP2 server-side GOAWAY (#3710) (@doubaokun)
+ Added Co\map() function (swoole/library#57) (@leocavalcante)

+ Support http2 client unix socket (#3668) (@sy-records)
+ Set the worker status to SW_WORKER_EXIT when the worker process exits (#3724) (@matyhtf)
+ Add send_queued_bytes and recv_queued_bytes in Server::getClientInfo() (#3721) (#3731) (@matyhtf) (@Yurunsoft)
+ Support option of stats_file (#3725) (@matyhtf) (@Yurunsoft)

* Fixed PHP8 build (zend_compile_string change) (#3670) (@twose)
* Fixed PHP8 build (ext/sockets compatibility) (#3684) (@twose)
* Fixed PHP8 build (php_url_encode_hash_ex change) (#3713) (@remicollet)
* Fixed invalid conversion from 'const char*' to 'char*' for build (#3686) (@remicollet)
* Fixed HTTP2 client over HTTP proxy is not working (#3677) (@matyhtf) (@twose)
* Fixed PDO context data confusion (swoole/library#54) (@sy-records)

* Code optimization (#3671) (#3689) (#3700) (#3701) (#3708) (#3718) (#3722) (#3723) (@matyhtf)
4.5.4 Backward compatibility Break
* Modify SWOOLE_HOOK_ALL to contain SWOOlE_HOOK_CURL (#3606) (@matyhtf)
* Remove ssl_method and Support ssl_protocols (#3639) (@Yurunsoft)

New APIs
+ Added firstKey and lastKey (swoole/library#51) (@sy-records)

+ Added open_websocket_ping_frame, open_websocket_pong_frame (#3600) (@Yurunsoft)

* Fixed fseek ftell file larger than 2G bug (#3619) (@Yurunsoft)
* Fixed Socket barrier bug (#3627) (@matyhtf)
* Fixed http proxy handshake bug (#3630) (@matyhtf)
* Fixed a problem with parsing the HTTP header when send chunk data (#3633) (@matyhtf)
* Fixed zend_hash_clean assertion failure (#3634) (@twose)
* Fixed can't remove broken fd from event loop (#3650) (@matyhtf)
* Fixed crash when receiving invalid packet (#3653) (@matyhtf)
* Fixed array_key_last (swoole/library#46) (@sy-records)

* Code optimization (#3615) (#3617) (#3622) (#3635) (#3640) (#3641) (#3642) (#3645) (#3658) (@matyhtf)
* Reduce unnecessary memory operation to improve write performance (#3620) (@matyhtf)
* Refactor aio (#3624) (@Yurunsoft)
* Added readlink/opendir/readdir/closedir hook (#3628) (@matyhtf)
* Improve swMutex_create, add SW_MUTEX_ROBUST (#3646) (@matyhtf)
4.5.3 New APIs
+ Added `Swoole\Process\ProcessManager` (swoole/library#88f147b) (@huanghantao)
+ Added ArrayObject::append, StringObject::equals (swoole/library#f28556f) (@matyhtf)
+ Added Coroutine::parallel (swoole/library#6aa89a9) (@matyhtf)
+ Added Coroutine\Barrier (swoole/library#2988b2a) (@matyhtf)

+ Added usePipelineRead to support streaming call-in http2 client (#3354) (@twose)
+ Do not create the file before receive body when a download (#3381) (@twose)
+ Added `bind_address` and `bind_port` setting for coroutine http client (#3390) (@huanghantao)
+ Added `lowercase_header` option for HttpClient (#3399) (@matyhtf)
+ Added `tcp_user_timeout` option for `Swoole\Server` (#3404) (@huanghantao)
+ Added `Coroutine\Socket` event barrier (#3409) (@matyhtf)
+ Added specify swString memory allocator (#3418) (@matyhtf)
+ Support cURL `__toString` (swoole/library#38) (@twose)
+ Added `lowercase_header` to fix cURL header name (swoole/library#e7c2a82) (@twose)
+ Set wait count directly in WaitGroup constructor (swoole/library#2fb228b8) (@matyhtf)
+ Added `CURLOPT_REDIR_PROTOCOLS` (swoole/library#46) (@sy-records)
+ Support trailer for HTTP 1.1 (#3485) (@huanghantao)
+ Support yield when sleeping less 1ms (#3487) (@Yurunsoft)
+ Support get soft link file in the static handler (#3569) (@LeiZhang-Hunter)
+ Close WebSocket connection immediately after the server call close method (#3570) (@matyhtf)
+ Support hook stream_set_blocking (#3585) (@Yurunsoft)
+ Support HTTP2 flow control in async HTTP2 Server (#3486) (@huanghantao) (@matyhtf)
+ Support free socket buffer after onPackage is called (#3551) (@huanghantao) (@matyhtf)

* Fixed WebSocket coredump, handle protocol status error (#3359) (@twose)
* Fixed swSignalfd_setup and fix possible nullptr error in wait_signal (#3360) (@twose)
* Fixed `Swoole\Server::close` throw a error when set dispatch_func (#3365) (@twose)
* Fixed format_buffer init problem when use `Swoole\Redis\Server::format` (#3369) (@matyhtf) (@twose)
* Fixed get mac address in MacOS (#3372) (@twose)
* Fixed MySQL test case (#3374) (@qiqizjl)
* Fixed PHP8 compatibility (#3384) (#3458) (#3578) (#3598) (@twose)
* Fixed missing php_error_docref, timeout_event and return value in hook socket write and read (#3383) (@twose)
* Fixed the server could not be stopped during the `WorkerStart` phase (#3382) (@huanghantao)
* Fixed coredump because of heart thread operate conn->socket (#3396) (@huanghantao)
* Fixed send yield logic bug (#3397) (@twose) (@matyhtf)
* Fixed compile problem in Cygwin64 (#3400) (@twose)
* Fixed WebSocket finish property invalid (#3410) (@matyhtf)
* Fixed build error when losing sys/random.h (#3427) (@huanghantao)
* Fixed missing MySQL transaction error, update the test (#3429) (@twose)
* Fixed the result of `stream_select` (#3440) (@Yurunsoft)
* Fixed lose `SIGCHLD` when use `Coroutine\System` to create the child process (#3446) (@huanghantao)
* Fixed sendwait not support SSL mode (#3459) (@huanghantao)
* Fixed `ArrayObject` and `StringObject` bug (swoole/library#44) (@matyhtf)
* Fixed mysqli error, typo (swoole/library#45) (@sy-records)
* Fixed can not get correct Swoole\Client::errCode if `open_eof_check` is set (#3478) (@huanghantao)
* Fixed fix atomic->wait()/wakeup() in MacOS (#3476) (@Yurunsoft)
* Fixed Client::connect return 0 when serve refused (#3484) (@matyhtf)
* Fixed nullptr_t is not declared in alpine (#3488) (@limingxinleo)
* Fixed fix HTTP Client download filename bug, double-free memory (#3489) (@Yurunsoft)
* Fixed fix memory leak of Server\Port (#3507) (@twose)
* Fixed fix mqtt parse protocal error (318e33a) (84d8214) (80327b3) (efe6c63) (@GXhua) (@sy-records)
* Fixed Coroutine\Http\Client->getHeaderOut coredump (#3534) (@matyhtf)
* Fixed missing error info of SSL verify (#3535) (@twose)
* Fixed update Swoole benchmark link in README (#3536) (@sy-records) (@santalex)
* Fixed fix HTTP header/cookie injection when using CRLF (#3539) (#3541) (#3545) (chromium1337) (@huanghantao)
* Fixed fix the typo variable in #3463 (#3547) (chromium1337) (@huanghantao)
* Fixed the typo introduced in pull request #3463 (#3547) (@deminy)
* Fixed set coroutine WebSocket server frame->fd (#3549) (@huanghantao)
* Fixed connection leak when heart thread check the connection status (#3534) (@matyhtf)
* Fixed don't need block signals in the process pool (#3582) (@huanghantao) (@matyhtf)
* Fixed don't send headers by SAPI (#3571) (@twose) (@sshymko)
* Fixed set error code and error message when curl execution fails (swoole/library#1b6c65e) (@sy-records)
* Fixed swoole_socket_coro accept bug when call setProtocol function will cause coredump (#3591) (@matyhtf)

* Use the CPP style (#3349) (#3351) (#3454) (#3479) (#3490) (@huanghantao) (@matyhtf)
* Added Swoole known strings to improve PHP object property reading (#3363) (@huanghantao)
* Improve code (#3350) (#3356) (#3357) (#3423) (#3426) (#3461) (#3463) (#3472) (#3557) (#3583) (@huanghantao) (@twose) (@matyhtf)
* Optimize tests (#3416) (#3481) (#3558) (@matyhtf)
* Simplify table int type (#3407) (@matyhtf)
* Added sw_memset_zero and replace bzero (#3419) (@CismonX)
* Optimize log module (#3432) (@matyhtf)
* Refactor libswoole (#3448) (#3473) (#3475) (#3492) (#3494) (#3497) (#3498) (#3526) (@matyhtf)
* Refactor header deps (#3457) (@matyhtf) (@huanghantao)
* Added `Channel::count()` and `Channel::get_bytes()` (f001581) (@matyhtf)
* Added scope guard (#3504) (@huanghantao)
* Added libswoole coverage test (#3431) (@huanghantao)
* Added lib-swoole/ext-swoole MacOS test (#3521) (@huanghantao)
* Added lib-swoole/ext-swoole Alpine test (#3537) (@limingxinleo)
4.5.2 Enhancement
+ Support `Server->set(['log_rotation' => SWOOLE_LOG_ROTATION_DAILY])` to generate log file by date (#3311) (@matyhtf)
+ Support `swoole_async_set(['wait_signal' => true])`, reactor will not exit if there is signal listener (#3314) (@matyhtf)
+ Support `Server->sendfile` to send empty file (#3318) (@twose)
+ Improve worker idle warning (#3328) (@huanghantao)
+ Improve configuration parser about Host (for HTTPS proxy) (#3343) (@twose)
+ SSL use ecdh auto (#3316) (@matyhtf)
+ SSL quiet shutdown when client close (#3342) (@huanghantao)

* Fixed `Server->taskWait` on OSX (#3330) (@matyhtf)
* Fixed MQTT protocol bug (8dbf506b) (@guoxinhua) (2ae8eb32) (@twose)
* Fixed Content-Length int overflow (#3346) (@twose)
* Fixed packet length checker of PRI (#3348) (@twose)
* Fixed CURLOPT_POSTFIELDS (swoole/library@ed192f64) (@twose)
* Fixed the latest connection can not be released before accept new one (swoole/library@1ef79339) (@twose)

* Socket zero copy feature (#3327) (@twose)
* Use swoole_get_last_error/swoole_set_last_error to replace global vars (e25f262a) (@matyhtf) (#3315) (@huanghantao)
4.5.1 Enhancement
+ Support socket context bindto in hook (#3275) (#3278) (@codinghuang)
+ Support dns resolve in client::sendto (#3292) (@codinghuang)
+ Process->exit(0) will call os.exit directly (a732fe56) (@matyhtf)
+ Support `log_date_format` to change format of log date, `log_date_with_microseconds` to show micro-time in log (baf895bc) (@matyhtf)
+ Support CURLOPT_CAINFO and CURLOPT_CAPATH (swoole/library#32) (@sy-records)
+ Support CURLOPT_FORBID_REUSE (swoole/library#33) (@sy-records)

* Fixed 32-bit build (#3276) (#3277) (@remicollet) (@twose)
* Fixed missing error info (#3280) (@codinghuang)
* Fixed potential bugs in Table (d7b87b65) (@matyhtf)
* Fixed null ptr error in Server (defensive programming) (#3304) (#3305) (@twose)
* Fixed heartbeat timeout null ptr error (#3307) (@twose)
* Fixed mysqli options error (swoole/library#35)
* Fixed response header parsing when there is no space after the colon in the response header (swoole/library#27) (@Yurunsoft)

- Mark Coroutine\System::(fread/fgets/fwrite) as deprecated, please use runtime hook instead (it should have been included in v4.5.0) (c7c9bb40) (@twose)

+ Use zend_object_alloc (cf1afb25) (@twose)
+ Add more options for log (#3296) (@matyhtf)
+ Improve code and add more tests (swoole/library) (@deminy)
4.5.0 New APIs
+ DTLS supports, we can build WebRTC applications now (#3188) (@matyhtf)
+ Built-in `FastCGI` client, we can proxy HTTP request to FPM with one line of code now (swoole/library#17) (@twose)
+ `Co::wait`, `Co::waitPid`, `Co::waitSignal` (#3158) (@twose)
+ `Co::waitEvent` (#3197) (@twose)
+ `Co::set(['exit_condition' => $callable])` to exit condition of reactor (#2918) (#3012) (@twose)
+ `Co::getElapsed` to get the coroutine elapsed time (#3162) (@doubaokun)
+ `Socket::checkLiveness`, `Socket::peek` (#3057) (@twose)
+ `Socket->setProtocol(['open_fastcgi_protocol' => $bool])` (#3103) (@twose)
+ `Server::get(Master|Manager|Worker)Pid`, `Server::getWorkerId` (#2793) (#3019) (@matyhtf)
+ `Server::getWorkerStatus` (SWOOLE_WORKER_BUSY, SWOOLE_WORKER_IDLE) (#3225) (@matyhtf)
+ `Server->on('beforeReload', $callable)` and `Server->on('afterReload', $callable)` (Server reload event on manager process) (#3130) (@huanghantao)
+ `Http\Server` support `http_index_files` and `http_autoindex` with static handler (#3171) (@huanghantao)
+ `Http2\Client->read(float $timeout = -1)`, support Coroutine\HTTP2\Client read more than once (#3011) (#3117) (@twose)
+ `Http\Request->getContent` (alias of rawContent) (#3128) (@huanghantao)
+ `swoole_mime_type_(add|set|delete|get|exists)` (mime APIs) (#3134) (@twose)

+ Optimize memory-copy between master and worker (4x faster) (#3075) (#3087) (@huanghantao)
+ Optimize websocket dispatch (1x faster) (#3076) (@matyhtf)
+ Optimize memory-copy in websocket_construct_frame (1x faster) (#3097) (@matyhtf)
+ Optimize SSL validation (#3226) (@matyhtf)
+ Separate SSL accept and SSL handshake (#3214) (@twose)
+ Support MIPS (#3196) (@ekongyun)
+ Resolve the domain name when use udp coroutine client (#3236) (#3239) (@huanghantao)
+ Support some common options for Coroutine\Http\Server (#3257) (@twose)
+ Support set cookies when websocket handshake (#3270) (#3272) (@twose)
+ Support CURLOPT_FAILONERROR (swoole/library#20) (@sy-records)
+ Support CURLOPT_FAILONERROR (swoole/library#20) (@sy-records)
+ Support CURLOPT_HTTPGET (swoole/library@d730bd08) (@shiguangqi)

- Remove `Runtime::enableStrictMode` method (b45838e3) (@twose)
- Remove `Buffer` class (559a49a8) (@twose)

* New C++ API: `coroutine::async` with lambda (#3127) (@matyhtf)
* Refactor event API and reactor fd to swSocket (#3030) (@matyhtf)
* Convert all source files to C++ (#3030) (71f987f3) (@matyhtf)
* Code optimizations (#3063) (#3067) (#3115) (#3135) (#3138) (#3139) (#3151) (#3168) (@huanghantao)
* Code optimization for header files (#3051) (@matyhtf)
* Refactor `enable_reuse_port` option (#3192) (@matyhtf)
* Reactor Socket API (#3193) (@matyhtf)
* Reduce one system call (3b5aa85d) (@matyhtf)
* Remove swServerGS::now (#3152) (@huanghantao)
* Improve protocol setter (#3108) (@twose)
* Use the Better way to init C object on stack (#3069) (@twose)
* Use type `uchar` for bit field (#3071) (@twose)
* Support parallel test (#3215) (@twose)

* Fixed `enable_delay_receive` (#3221) (#3224) (@matyhtf)
* All other bug fix patches have already been merged into the v4.4.x branch, we will not reiterate them here
4.4.26 Fixed
* Fixed special case OnClose event missing while listening for writable events
4.4.23 Fixed
* Fixed table bugs
* Fixed sync client error info (#3784)
* Fixed memory overread when parse form-data boundary (#3858)
* Fixed the bug of the channel, the data that has enqueue cannot be popped after the close
4.4.19 Notice: v4.4.x is no longer the main maintenance branch, bug fixes only when necessary

* Merged all the bugfix patches from v4.5.x
4.4.18 Enhancement
+ Resolve the domain name when use udp coroutine client (#3236) (#3239) (@huanghantao)
+ Do not close stdout and stderr (show error logs after shutdown) (#3249) (@twose)
+ Support some common options for Coroutine\Http\Server (#3257) (@twose)
+ Support set cookies when websocket handshake (#3270) (#3272) (@twose)
+ Support CURLOPT_FAILONERROR (swoole/library#20) (@sy-records)
+ Support CURLOPT_HTTPGET (swoole/library@d730bd08) (@shiguangqi)
+ Compatible with different versions of Redis extension as much as possible (swoole/library#24) (@twose)
+ Disable Cloning of Database Proxy Objects (swoole/library#23) (@deminy)

* Fixed SSL handshake failure (dc5ac29a) (@twose)
* Fixed memory error when generate error message (#3229) (@twose)
* Fixed empty proxy authorization info (#3243) (@twose)
* Fixed channel unreal memory leak (#3260) (@twose)
* Fixed memory leak of Co\Http\Server (#3271) (@twose)
* Fixed `ConnectionPool->fill` (swoole/library#18) (@NHZEX)
* Fixed use new client for the redirection requests (swoole/library#21) (@doubaokun)
* Fixed null socket error in ioException (swoole/library@4d15a4c3) (@twose)
* Fixed ConnectionPool@put when error happens (swoole/library#25) (@Sinute)
* Fixed mysqli write_property error (swoole/library#26) (@twose)
4.4.17 Enhancement
+ Improve SSL Server performance (#3077) (85a9a595) (@matyhtf)
+ Remove SW_HTTP_HEADER_VALUE_SIZE, SW_HTTP_HEADER_BUFFER_SIZE (#3187) limitation (@twose)
+ Support MIPS (#3196) (@ekongyun)
+ Support CURLOPT_HTTPAUTH (swoole/library@570318be) (@twose)

* Fixed behavior of package_length_func and memory leak (#3111) (@twose)
* Fixed HTTP 304 error (#3118) (#3120) (@twose)
* Fixed incorrect macro expansion (#3142) (@twose)
* Fixed OpenSSL function signature (#3154) (#3155) (@twose)
* Fixed SSL error msg (#3172) (@matyhtf) (@twose)
* Fixed PHP-7.4 compatibility (@twose) (@matyhtf)
* Fixed HTTP chunk length parser (19a1c712) (@twose)
* Fixed chunked multipart parser (3692d9de) (@twose)
* Fixed ZEND_ASSUME failed (fc0982be) (@twose)
* Fixed Socket address error (d72c5e3a) (@twose)
* Fixed Socket get name #3177 (#3179) (@matyhtf)
* Fixed static handler with empty file (#3182) (@twose)
* Fixed upload file handler on Coroutine\Http\Client (#3189) (#3191) (@twose)
* Fixed possible memory error on shutdown (44aef60a) (@matyhtf)
* Fixed Server->heartbeat (#3203) (@matyhtf)
* Fixed reactor defer task (only tasks of the current round will be called) (#3207) (@twose)
* Fixed invalid write on immutable array (#3212) (@twose)
* Fixed double wait, improve error message (swoole/library@537a82e1) (@twose)
* Fixed empty header (keep same with cURL) (swoole/library@7c92ed5a) (@twose)
* Fixed non-IO methods error handler (swoole/library@f6997394) (@twose)
* Fixed wrong proxy header (swoole/library@5e94e5da) (@twose)
4.4.16 Enhancement
+ Now you can get [Supported Versions of Swoole](https://github.com/swoole/swoole-src/blob/master/SUPPORTED.md) (@twose)
+ More friendly error messages (0412f442) (09a48835) (@twose)
+ Prevent endless loops that may occur in some special systems (069a0092) (@matyhtf)
+ Add driver in PDOConfig (swoole/library#8) (@jcheron)

* Fixed http2_session.default_ctx double free (bddbb9b1) (@twose)
* Fixed uninitialized http_context (ce77c641) (@twose)
* Fixed typo in Table (may lead to memory errors) (db4eec17) (@twose)
* Fixed status error when kill USR2 and no set task_num (e4378278) (@GXhua)
* Fixed incomplete raw-content of HTTP request (#3079) (#3085) (@hantaohuang)
* Fixed static handler (when the file content is empty, server should respond 404) (#3084) (@Yurunsoft)
* Fixed http_compression_level not work (16f9274e) (@twose)
* Fixed null pointer error of Coroutine HTTP2 Server caused by no handle (ed680989) (@twose)
* Fixed option socket_dontwait not work (27589376) (@matyhtf)
* Fixed double zend::eval (#3099) (@GXhua)
* Fixed HTTP2 Server null pointer error (respond after connection is closed) (#3110) (@twose)
* Fixed PDOStatementProxy::setFetchMode missing arguments (swoole/library#13) (@jcheron)
4.4.15 Enhancement
+ Bad websocket handshake request will respond 400 (fdc1cb67) (@twose)
+ Disable accept when have too many connections (dd9fbf2f) (@matyhtf)
+ Binary security of package_eof (#3054) (@twose)
+ Support HTTP chunked request (#3055) (@twose)
+ Unified naming style and improve accessibility of Curl\Handler properties (library/curl) (@twose)

* Fixed Http\Response->close (d30e3269) (@twose)
* Fixed possible memory overflow (2212e091) (@twose)
* Fixed memory error when MSHUTDOWN (undestroyed reactor) (78d6dd73) (@twose)
* Fixed handler of event HUP (#3046) (@matyhtf) (@twose)
* Fixed exit code 1 (f982b817) (@matyhtf) (@twose) (@qiqizjl)
* Fixed missing "unhook curl_multi_getcontent" (7b2e960e) (@twose)
* Fixed Coroutine HTTP2 Server memory error (d90eebe6) (@twose)
* Fixed http_context_send_data (#3059) (@twose)
* Fixed send_yield in BASE mode (edbb654d) (1b8096e9) (@twose)
* Refactor HTTP2 Server to fix some bugs (#3061) (@twose)
* Fixed behaviour of CURLOPT_POSTFIELDS, CURLOPT_HTTPHEADER, curl_close (library/curl) (@twose)
4.4.14 Enhancement
+ Now cookie parsing on client-side always succeeds (#3035) (378a7fca) (@twose)

* Fixed Coroutine\HTTP\Server memory leak and can not handle pipeline request (#3025) (#3029) (@twose)
* Fixed compatibility issues with phar (e0558d6e) (4bf483f5) (4f93b793) (@twose)
* Fixed the concurrency capability of the Coroutine HTTP2 Server (daf45b57) (@twose)
* Fixed SIGCHLD listener for manager process (#3017) (@hejingsong)
* Fixed warning in buffer module (161f449c) (@twose)
4.4.13 New API
+ Built-in Connection Pool ([examples](https://github.com/swoole/library/tree/master/examples)) ([doc](https://wiki.swoole.com/wiki/page/p-library.html)) (@twose)

+ Support websocket compression on Coroutine\Http\Server (#2943) (@twose)
+ Add error info for bind error (#2972) (@LeiZhang-Hunter) (@twose)
+ Update error info if socket call failed (it will not warn anymore if not necessary) (1e9b8cbb) (@twose)
+ Move the library to [a separate repo](https://github.com/swoole/library) (@twose)
+ Support `CURLOPT_IPRESOLVE` (library-12ffb4d6) (@twose)
+ Support `CURLOPT_PORT`, `CURLOPT_PROXYPORT`, `CURLOPT_DNS_USE_GLOBAL_CACHE` (library-5a718920) (@twose)
+ Better `CURLOPT_ENCODING` support (library-7b680712) (@twose)

* Fixed gdbinit in docker (missing symbol) (d46dc2d7 (@twose)
* Fixed compression in POST request (#2947) (@twose)
* Fixed compatibility of `Websocket->push` method (ac7dbcbc) (@twose)
* Fixed `$output` result inconsistency (@Yurunsoft) (#2955)
* Fixed `Coroutine::fread` (#2958) (@matyhtf)
* Fixed `Coroutine\Server` can not exit normally #2837 (#2962) (@twose)
* Fixed memory leak in HTTP2 Server (#2964) (@twose)
* Fixed `unsafe_event` (#2970) (@matyhtf)
* Fixed illegal call after server start (#2977) (@twose)
* Fixed `WebSocket\Frame` can not enable mask (#2982) (#2983) (@twose)
* Fixed memory leak of `Process` callback (898894a7) (@twose)
* Fixed case where minfd is never updated (#2985)
* Fixed HTTP2 module is always enable (3925e212) (@twose)
* Fixed HTTP2 context double free (#2987) (f4cdff1b) (@twose)
* Fixed string comparison (#2988) (97c6c425) (9e5eae63) (@twose)
* Fixed HTTP2 pipeline (#2993) (@twose)
* Fixed coroutine context has been destroyed (#2991) (@twose)
* Fixed illegal usage of `Process::daemon` (#3005) (@twose)
* Fixed compilation without zlib (#3008) (@twose)

* Refactor `swoole_(get|set)_object` to the way of extending `zend_object` (more stable and efficient) (#2966) (@twose)
* Support Github Actions (@twose) (@matyhtf)
4.4.13RC2 New API
+ Built-in Connection Pool ([examples](https://github.com/swoole/library/tree/master/examples)) ([doc](https://wiki.swoole.com/wiki/page/p-library.html)) (@twose)

+ Support websocket compression on Coroutine\Http\Server (#2943) (@twose)
+ Add error info for bind error (#2972) (@LeiZhang-Hunter) (@twose)
+ Update error info if socket call failed (it will not warn anymore if not necessary) (1e9b8cbb) (@twose)
+ Move the library to [a separate repo](https://github.com/swoole/library) (@twose)
+ Support `CURLOPT_IPRESOLVE` (library-12ffb4d6) (@twose)
+ Support `CURLOPT_PORT`, `CURLOPT_PROXYPORT`, `CURLOPT_DNS_USE_GLOBAL_CACHE` (library-5a718920) (@twose)
+ Better `CURLOPT_ENCODING` support (library-7b680712) (@twose)

* Fixed gdbinit in docker (missing symbol) (d46dc2d7 (@twose)
* Fixed compression in POST request (#2947) (@twose)
* Fixed compatibility of `Websocket->push` method (ac7dbcbc) (@twose)
* Fixed `$output` result inconsistency (@Yurunsoft) (#2955)
* Fixed `Coroutine::fread` (#2958) (@matyhtf)
* Fixed `Coroutine\Server` can not exit normally #2837 (#2962) (@twose)
* Fixed memory leak in HTTP2 Server (#2964) (@twose)
* Fixed `unsafe_event` (#2970) (@matyhtf)
* Fixed illegal call after server start (#2977) (@twose)
* Fixed `WebSocket\Frame` can not enable mask (#2982) (#2983) (@twose)
* Fixed memory leak of `Process` callback (898894a7) (@twose)
* Fixed case where minfd is never updated (#2985)
* Fixed HTTP2 module is always enable (3925e212) (@twose)
* Fixed HTTP2 context double free (#2987) (f4cdff1b) (@twose)
* Fixed string comparison (#2988) (97c6c425) (9e5eae63) (@twose)
* Fixed HTTP2 pipeline (#2993) (@twose)
* Fixed coroutine context has been destroyed (#2991) (@twose)
* Fixed illegal usage of `Process::daemon` (#3005) (@twose)
* Fixed compilation without zlib (#3008) (@twose)

* Refactor `swoole_(get|set)_object` to the way of extending `zend_object` (more stable and efficient) (#2966) (@twose)
* Support Github Actions (@twose) (@matyhtf)
4.4.13RC1 New API
+ Built-in Connection Pool ([examples](https://github.com/swoole/library/tree/master/examples)) ([doc](https://wiki.swoole.com/wiki/page/p-library.html)) (@twose)

* Support websocket compression on Coroutine\Http\Server (#2943) (@twose)
* Add error info for bind error (@LeiZhang-Hunter) (@twose) (#2972)
* Update error info if socket call failed (it will not warn anymore if not necessary) (1e9b8cbb) (@twose)
* Make library submodule (@twose)

* Fixed gdbinit in docker (missing symbol) (d46dc2d7 (@twose)
* Fixed compression in POST request (#2947) (@twose)
* Fixed compatibility of Websocket->push method (ac7dbcbc) (@twose)
* Fixed $output result inconsistency (Yurunsoft) (#2955)
* Fixed Coroutine::fread (#2958) (@matyhtf)
* Fixed Coroutine\Server can not exit normally #2837 (#2962) (@twose)
* Fixed memory leak in HTTP2\Server (#2964) (@twose)
* Fixed unsafe_event (#2970) (@matyhtf)
* Fixed illegal call after server start (#2977) (@twose)
* Fixed WebSocket\Frame can not enable mask (#2982) (#2983) (@twose)
* Fixed memory leak of Process callback (898894a7) (@twose)
* Fixed case where minfd is never updated (#2985)
* Fixed HTTP2 module is always enable (3925e212) (@twose)
* Fixed HTTP2 context double free (#2987) (f4cdff1b) (@twose)
* Fixed string comparison (#2988) (97c6c425) (9e5eae63) (@twose)
* Fixed HTTP2 pipeline (#2993) (@twose)
* Fixed coroutine context has been destroyed (#2991) (@twose)

* Refactor swoole_(get|set)_object to the way of extending zend_object (more stable and faster) (#2966) (@twose)
* Support Github Actions (@twose) (@matyhtf)
4.4.12 New API
+ Runtime::getHookFlags (#2915) (@limingxinleo)

+ Support Websocket Compression on client-side (#2937) (@twose)
+ Support compress websocket message by frame (#2937) (@twose)
+ Optimized the detect logical of shortname (#2935) (@sy-records)
+ Better compression handler (Gzip and Brotli) (#2928) (@twose)
+ Reduce memory copy (#2893) (7fc93504) (@hantaohuang) (@twose)
+ Accepted connection will inherit the options of server (#2898) (@twose)
+ Coroutine\Http\Server support HTTP2 protocol now (5479dbc4) (@matyhtf)
+ Automatically add Content-Type header when use sendfile (4e62bc52) (@matyhtf)
+ Compatibility with Zend preloader (Special thanks to PHP team) (#2899) (@twose)
+ Implement RFC-7692 (#2906) (@matyhtf)
+ Support PHP error control operators (#2916) (@twose)
+ Support socket_send_timeout option for sync client (#2919) (@matyhtf)
+ Support NPN (#2900) (@matyhtf)
+ Improve HTTP proxy handshake request (#2922) (@twose)

* Fixed AIO task num overflow (7038bdc1) (@twose)
* Fixed gdbinit, support get backtrace info of current stack (bd033e56) (@twose)
* Fixed Websocket Compression (ca818657) (@matyhtf)
* Fixed compilation failure caused BrotliDecoder (#2925) (@twose)
* Fixed memory error caused by compressing big data (#2928) (@twose)
* Fixed #2890 (start a Process\Pool without onWorkerStart event) (#2892) (@twose)
* Fixed the bug that close the connection in non-current worker (#2891) (@matyhtf)
* Fixed memory error of create socket failure (2948f10a) (@matyhtf)
* Fixed missing ssl_host_name of HTTPS proxy (#2904) (@twose)
* Fixed CID-1466865 (#2923) (@tutanhamon)
4.4.8 Deprecated
- Move async Swoole\Client to [ext-async](https://github.com/swoole/ext-async)

+ Support Http\Response close (#2861) (@matyhtf)
+ Support Process::daemon() redirection of IO (#2871) (@matyhtf)
* Add Swoole\Server\Task::pack (#2872) (#2874) (@matyhtf)
+ Support ssl_protocols option (74499276) (@matyhtf)
+ Add document of bug reports (ba1c078f) (@twose)

* Fixed random bytes added to response status code (#2856) (@twose)
* Fixed naming conflicts with php gdbinit (2a2447ec) (@shiguangqi)
* Fixed build without PCRE JIT on OSX (2a4c447e) (@twose)
* Fixed Websocket\Server class entry of property declaration (1f197daf) (@twose)
* Fixed coroutine bound error checker of Co\Http\Client (2619cdd8) (@twose)
* Fixed gdb debugger in docker (ec815288) (@twose)
* Fixed MySQL close error (#2869) (@twose)
* Fixed Cygwin with process (#2868) (#2876) (@matyhtf)
* Fixed tls_host_name not found (d1968c26) (@twose)
* Fixed SSL renegotiation (#2847) (d8b87ebb) (@matyhtf)
* Fixed HTTP2 client empty data (37b12d72) (775aefed) (@twose)
* Fixed send yield hang (#2885) (@matyhtf) (@twose)
* Fixed null fci_cache (#2881) (@twose)
* Fixed server mode on CYGWIN (#2868) (@matyhtf)
* Fixed select null (5e23dd96) (@twose)
* Fixed #2643 #2868 (#2888) (@matyhtf)
4.4.7 Enhancement
+ Support thread context (9214411c) (@matyhtf)
+ Generate a warning if the channel has producers or consumers when the program exits (b9f37d9c) (@twose)

* Fixed reactor send bug (a1dc95f5) (@matyhtf)
* Fixed event init bug (907c84b3) (@matyhtf)
* Fixed crash on Cygwin (cfb74793) (@matyhtf)
* Fixed wrong length of string (c4f97993) (@twose)
4.4.6 Enhancement
+ Support max_request_grace (#2784) (#2808) (#2809) (@sshymko)
+ Add SameSite Cookie (@2815) (@Yurunsoft)
+ Support curl_multi_getcontent, CURLOPT_AUTOREFERER for curl hook, add ignore options (#2817) (@2818) (@2819) (@limingxinleo)
+ Support CURLOPT_SSLVERSION and CURLINFO_HEADER_OUT (f2b4c93) (@matyhtf)
+ AIO thread safe (@matyhtf)
+ Optimize numeric type conversion (aa20913) (@twose)
+ Compatibly with diseval extension for library (8b7eb16) (@GXhua)

* Fixed missing http headers (#2786) (@doubaokun)
* Defensive programming for signal callback (@twose)
* Fixed getProcess memory error (#2801) (@matyhtf)
* Fixed compilation on MacOS (@matyhtf)
* Fixed Coroutine\System methods (97c1444) (@twose)
* Fixed AIO thread task stuck (@matyhtf)
* Fixed HTTP2 HEADER_TABLE_SIZE (@twose)
* Fixed spurious waking of socket (d0b659a) (@matyhtf)
4.4.5 Enhancement
+ Better Reactor (@matyhtf)
+ Better AIO (@twose)
+ Better Redis (3608f4c2) (@twose)
+ Handle Empty upload files (#2779) (@sshymko)
+ Add File uploads array parser (#2773) (@sshymko)
+ Support PURGE (#2754) (#2764) (@sshymko)
+ Allow HTTP methods like GETX POSTX PUTX etc (#2772) (@doubaokun)
+ Reduce the default max_wait_time to 3 (ed5c838) (@twose)

* Fixed AIO memory error (@twose)
* Fixed compilation without zlib (f5a03366) (@twose)
* Fixed timeout param of stream (c8275989) (@twose)
* Fixed missing http headers (#2789) (@doubaokun)
* Fixed client type (#2771) (@doubaokun)
4.4.4 Enhancement
+ Perfect array_walk for coroutine (#2740) (@twose)
+ Add `Swoole\Constant` to replace string (@matyhtf) (@twose)
+ Add alias `Co::dnsLookup` of `swoole_async_dns_lookup_coro` (42293ef) (@matyhtf)
+ Expend default HTTP_FORM_KEYLEN to 512 (#2734) (@sshymko)
+ Better dns resolver (c6deff1) (@matyhtf)
+ Support HTTP PURGE (#2462) (@sshymko)
+ Response 400 for bad request (#2751) (@twose)
+ Decoupling sockets and reactor (internal) (@twose)
+ Add Timer::set / Process->set / Process\Pool->set (@twose)
+ Optional hugepage feature support for FreeBSD (#2757) (@devnexen)

* Fixed macOS not support extern thread_local () (@matyhtf)
* Fixed SSL dispatch (#2736) (@matyhtf)
* Fixed aio thread num (#2745) (@matyhtf)
* Fixed async_thread (#2747) (@matyhtf)
* Fixed Swoole\Client::select timeout (#2758) (@LeiZhang-Hunter)
+ Fixed #2749 (@twose)
4.4.3 Enhancement
+ Continue to maintain the Lock module (@matyhtf)
+ Add zpopmin and zpopmax for Redis 5 (#2684) (@ruesin)
+ Remove Http\Client global buffer in kernel (@twose)
+ Support ppc arch (#2692) (@matyhtf)
+ Support SSL context options for php_stream (#2717) (@twose)
+ Support multi-threading (libswoole) (@matyhtf)
+ Support SSL shutdown (#2717) (@twose)

* Fixed bug: call Request->rawContent/getData after Response->end (b989ba9) (@twose)
* Fixed OpenSSL protocol version check (c89e56f) (@twose)
* Fixed bug: MySQL double free when io error occurred (d62d543) (@twose)
* Fixed Http2 Client null pointer (537557d) (@twose)
* Fixed HTTP2 SSL settings (#2725) (@twose)
* Fixed DNS errno (@matyhtf)
* Fixed mem invalid read with fgets (5dc0670) (@matyhtf)
* Fixed swoole_async_dns_lookup_coro (b9caf5d) (@matyhtf)
+ Fixed ManagerStop failed (7977fab) (@matyhtf)
4.4.2 Enhancement
+ Added `idle_worker_num` and `task_idle_worker_num` to `Server::stats` (#2687) (@matyhtf)
+ PHP7.4 Compatibility (5bf6491) (@twose) (#2707) (@remicollet)
+ Clear reactor when error occured (61536e7) (@twose)

* Fixed `Socket->sendto` (7bd8492) (@twose)
* Fixed `WaitGroup->wait` timeout type (acf20c3) (@twose)
* Fixed #2710 (#2710) (@twose)
* Fixed event num of signal in OSX (cf32c35) (@matyhtf)
4.4.1 Enhancement
+ Support send response with non-zero Content-length without body for HEAD request (#2690) (@matyhtf)
+ Support `Coroutine::getPcid` by a random cid (#2669) (@huanghantao)

* Fixed `SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER` (#2667) (@twose)
* Fixed signal listener (#2675) (@matyhtf)
* Fixed MySQL incompatibility changes (#2674) (@twose)
* Fixed add event after server start (#2673) (@matyhtf)
* Fixed `static_handler` can not decode url (#2676) (@twose)
* Fixed task worker warning (#2689) (@Yurunsoft)
* Fixed `Http\Request->rawContent` (#2682) (@twose)
* Fixed invalid read when `Timer::clearAll` (6b0263b) (@matyhtf)
* Fixed `Coroutine\Http\Client` send failed (432259d) (@twose)
4.4.0 Backward incompatible changes

- Consistent with `PHP` official, no longer supports `PHP7.0` (@matyhtf)
- Remove the `Serialize` module, which is maintained in a separate [ext-serialize](https://github.com/swoole/ext-serialize) extension. Reason: Due to frequent changes to the `PHP` kernel, stability cannot be guaranteed
- Remove the `PostgreSQL` module and maintain it in a separate [ext-postgresql](https://github.com/swoole/ext-postgresql) extension. Reason: `PostgreSQL` uses asynchronous ways in the kernel and lacks the necessary unit tests to guarantee quality
- `Runtime::enableCoroutine` is no longer automatically compatible with the internal and external environment of the Coroutine. Once enabled, all blocking operations must be called in the Coroutine (@matyhtf)
* Due to the introduction of the new `Coroutine\MySQL` client driver, the underlying design is more standardized, but there are some small downward incompatible changes
* `Coroutine\MySQL->fetch/nextResult` is optimized for on-demand reads, which will trigger IO scheduling
* When the `defer` attribute is on, the request of `statement` needs to use `statement->recv` to receive the response
* When the `defer/fetch_mode` feature is enabled, if there is unreceived data, a new request will be banned
* Unlike asynchronous, the `connected` attribute is no longer updated based on events in real-time (It's not reliable) but is updated after the `IO` operation fails
- `Coroutine\Http\Client->set_cookie_headers` no longer have key names (#2664) (@twose)

Deprecated content

- The `Buffer` module will be discarded. Reason: It is highly replaceable and has low usage. It can be replaced by `PHP` string or `fopen("memory")`
- The `Lock` module will be discarded. Reason for discarding: There may be problems with locking in the Coroutine. You can use `Chan` to implement the Lock of the Coroutine version
- Since async `stream_socket_pair` is introduced, it is recommended to enable the hook by flag `SWOOLE_HOOK_STREAM_FUNCTION` instead of `SWOOLE_HOOK_STREAM_SELECT`

New features

+ Added [Library](https://github.com/swoole/swoole-src/tree/master/library), using pure `PHP` to write kernel functions instead of `C/C++`, providing the following features
+ Added high quality `PHP` module `Coroutine\WaitGroup` (@twose)
+ Use the `PHP` code to implement the CURL hook, one-click to make the CURL non-blocking, currently the experimental feature, you need to call `Runtime::enableCoroutine(SWOOLE_HOOK_CURL)` to open (@matyhtf) (@Yurunsoft)
+ Use `PHP` code to implement `exec`/`shell_exec` of Coroutine version (#2657) (@Yurunsof)
+ When `RuntimeHook` is turned on, the function `array_walk`, `array_walk_recursive` will be replaced by the version of Swoole, which will solve the problem that the native function cannot be reentrant, but it will not be able to traverse object (@matyhtf) (@twose)
+ Added a new Coroutine Preemptive Scheduler to prevent the Coroutine from taking too long CPU time to cause other Coroutine to starve. Open the `swoole.enable_preemptive_scheduler = On` by `php.ini`. For details, see [preemptive_scheduler](https://github.com/swoole/swoole-src/tree/master/tests/swoole_coroutine_scheduler/preemptive) (@shiguangqi)
+ Added `Timer::list()` to get `Timer\Iterator`, which can traverse all timers, `Timer\clearAll` clears all timers, `Timer\info(int $id)` gets timer information, ` Timer::stats()` gets the global timer status (#2498) (@twose)
+ Added two methods `getOption` and `setOption` for `Coroutine\Socket` (9d13c29) (@matyhtf)
+ Added `$master_pid` property and `shutdown` method to `Process\Pool` (a1d6eaa) (@matyhtf)
+ Added the 4th parameter of the constructor of `Process\Pool`, when true, the underlying layer will automatically create the Coroutine in the `onWorkerStart` callback (8ceb32cd) (@matyhtf)
+ Support non-blocking `stream_socket_pair` in Runtime hook (#2546) (@matyhtf)
+ Added `static_handler_locations` setting of `Http\Server` to set static file path (@matyhtf)
+ Added `Coroutine\Http\Client->setBasciAuth` method to automatically send `Authorization` header (#2542) (@hongbshi)
+ Added `Coroutine\Http2\Client->ping` method (40041f6) (@shiguangqi)
+ Added `task_use_object` (#2659) (aa01317) (@twose)


+ New `Coroutine\MySQL\Client` driver (#2538) (@twose)
+ The underlying programming mode using `C++` and Coroutine (sync writing, async performance)
+ Support SSL connection (configure `['ssl' => true]` when connect)
+ Support request with large data (unlimited)
+ Support response with large data (unlimited)
+ Support `fetch` to read by line (now `fetch` is read on demand, data without fetch does not consume user memory) (#2106)
+ Support `nextResult` read on demand (ibid)
+ Optimized protocol parser
+ `date` related type decimal precision support
+ Error code and information are consistent with `PDO`/`mysqli`
+ `Coroutine\Redis` compatibility mode, enabled by `$redis->set(['compatibility_mode' => true])`, which can make the result of `hmGet/hGetAll/zRange/zRevRange/zRangeByScore/zRevRangeByScore` consistent with phpredis (#2529) (@caohao-php)
+ Now `100K` Coroutine are allowed to exist at the same time by default (c69d320b) (@twose)
+ Support `bailout` (can exit the process correctly when a fatal error occurs in the Coroutine) (#2579) (@twose)
+ `Server` can display a friendly `400/404/503` when error occurred (@matyhtf) (f3f2be9d)
+ `Server` enable `reload_async` and `send_yield` by default (#2555) (9d4a4c47) (@matyhtf)
+ `Server->onFinish` callback is in Coroutine (@twose)
+ `Coroutine\Http\Client` enable `websocket_mask` by default
(c02f4f85) (@twose)
+ Scheduling operation of `Channel` outside the Coroutine is no longer allowed (519b6043) (@twose)
+ `WebSocket\Server` will close the connection when the handshake fails (#2510) (@twose)
+ Under the `Linux`, the dead parent process will automatically send a signal to kill the child process (4b833a3d) (@matyhtf)
+ Memory optimization of `Socket->recv` (642a3552) (@twose)
+ Floating point calculation optimization (#2572) (@tangl163)
+ All built-in classes prohibit cloning/serializing/unseting-declared-properties (f9c974b8) (@twose)
+ `Server->bind` will generate a warning and return false when `uid` is more than `UINT32_MAX`
+ Support `PHP7.4` (#2506) (@twose)

* Fixed `getProcess` of `Process\Pool` (#2522) (@matyhtf)
* Fixed a bug that exceptions were ignored in some special cases (@twose)
* Fixed memory leak by timer after `fork` process (8f3abee7) (@twose)
* Fixed timezone on non-Linux systems (#2584) (@devnexen)
* Fixed `enable_coroutine=false` + `task_enable_coroutine=true` (#2585) (@matyhtf)
* Fixed Http2's trailer method can not output a empty value header (#2578) (@twose)
* Fixed `Coroutine\Http\Client->setCookies` memory error in special cases (#2644) (@Yurunsoft)
* Fixed #2639 (#2656) (@mabu233)
* Fixed `arginfo_swoole_process_pool_getProcess` (#2658) (@mabu233)
* Fixed `static_handler` does not support soft links (@matyhtf)
* Fixed a bug (I don't know how to describe it) (22504dd4) (@matyhtf)
* Fixed `Server->getClientInfo` error (#2639) (@matyhtf)
* Fixed an illegal operation of the same Socket with multiple Coroutine operations (#2661) (@twose)
* Fixed swoole_table iterator coredump (#2663) (@mabu233)

Coroutine scheduler [?](https://wiki.swoole.com/wiki/page/1487.html)
+ Added `Swoole\Coroutine\Scheduler` class as the entry for the `cli` script, replacing `go() + Swoole\Event::wait()`
+ Added `Swoole\Coroutine\Run` function to provide wrapper for `Swoole\Coroutine\Scheduler`
- `go() + Swoole\Event::wait()` may be deprecated

+ Continuous underlying code quality optimization work (@swoole)
+ More unit tests, and use the assertion library [swoole/assert](https://github.com/swoole/assert) based on [webmozart/assert](https://github.com/webmozart/assert) secondary development (@twose)
+ Completely abolish the `Windows` support plan
+ `Coroutine\Http2\Client` refactor (f64874c3) (@matyhtf)
+ The faster callback function caller (@twose)

Experimental content
+ May add `Coroutine\Server` and `Coroutine\Http\Server` in `5.0`
4.3.6 Fixed
* Fixed #2661 (#2661) (@twose)
* Fixed hang on MacOS (dcb14488) (@matyhtf)
* Fixed global value (edfdc544) (@twose)
4.3.5 Fixed
* Fixed #2610
4.3.4 Fixed
* Fixed SSL certificate configuration failure (#2573) (@twose)
* Fixed onReceive callback null pointer (#2568) (@twose)
* Fixed ssl->ciphers null pointer (#2553) (@matyhtf)
* Fixed document_root can't be a relative path (#2513) (@windrunner)
* Fixed HTTP proxy that does not need to handshake (16ea176f) (@matyhtf)
4.3.3 Fixed
* Fixed Http2 ping frame bug (0f074a61) (371d0b86) (e28ed13c) (@twose) (@shiguangqi)
* Fixed OSX signal bug (6d06a2c2) (6b66f56c) (@twose)
* Fixed `Coroutine\Http\Client->setData` (53d9d1ac) (@twose)
* Remove HAVE_IPV6 (3effad3c) (@matyhtf)
* PHP7.4 compatibility (#2506) (@twose)
4.3.2 Enhancement
+ Dynamically `ipc_size`, greatly improving IPC performance in Process mode (48c1b2b) (3e85511) (@matyhtf)
+ Improve `Runtime::enableCoroutine` API, support passing in flag directly as the first parameter (464ad65) (7d4be65) (@twose)
+ SSL connection will automatically configure the ssl_host_name (563e677) (@twose)
+ Some NOTICE level information will be changed to INFO level, such as server restart information, etc (d87d63a) (@twose)
+ Add constants for`dispatch_func` return value: `SWOOLE_DISPATCH_RESULT_DISCARD_PACKET`, `SWOOLE_DISPATCH_RESULT_USERFUNC_FALLBACK` (#2451) (@windrunner414)
+ `swoole_strerror` support parse system error code and swoole error code automatically (d89c565) (#2458) (@twose) (@mabu233)
+ Built-in Socket related constants, and it would not conflict with Socket extensions (1e1b1d1) (@twose)
+ Add http_parse_cookie option (dce290ef) (@twose)
+ Decode path_info (82f8e4fc) (@twose)
+ Support PHP_STREAM_OPTION_CHECK_LIVENESS (6ff292da) (@twose)

* Fixed `CID-1478883`, `CID-1478887`, `CID-1478891`, `CID-1478894` (688713f) (17805af) (e8f1473) (58a098f) (@matyhtf)
* Fixed invalid memory access due to fd reuse (08b37fd) (@twose)
* Fixed connection reset due to fd reuse (#2444) (@twose)
* Fixed the bug where the GC didn't work during the shutdown (causing a memory leak) (836ea23) (15ba9f7) (@twose)
* Fixed the invalidation of `Co\Iterator` (db9e155) (@twose)
* Fixed`Co::exec` causes process stuck (8a1d776) (22252d7) (@matyhtf)
* Fixed BADF caused by `exportSocket` (ebbce67) (c7af14c) (c717122) (@matyhtf)
* Complete `Swoole\Buffer` property declaration (2f66319) (@twose)
* Complete `Co::exec` arg info (7da1376) (@twose)
* Fixed the wrong error code when the MySQL client host was invalid (#2367) (@twose)
* Fixed the problem that the sync client is interrupted by the signal (#2448) (@liues1992)
* Fixed build check with `i?86/aarch64` (#2460) (@dixyes)
* Fixed `poll` with timeout `0` (1143743) (@matyhtf)
* Fixed `stream_select` with `null` timeout (e8a58d5) (c166b7a) (@twose)
* Fixed `stream_select` behavior (d8e7a41) (3ce877d) (2819232) (cd8e4c7) (@twose) (@matyhtf)
* Generate Swoole Warning instead of PHP Warning (unmanageable error) (955d021) (@twose)
* Fixed `Co\Client` construct failed (#2466) (@twose)
* Fixed Http2 cookie (e18d66b) (@twose)
* Fixed `Process->getProcess` free (fe1ca17) (@matyhtf)
* Fixed Coroutine flock (23401d8) (86cf0c9) (@matyhtf)
* Fixed `Co\Http2\Client` null ptr (66c31ee) (@twose)
* Fixed `Socket->accept` return Socket object with uninitialised type (5d26b00) (@twose)
* Fixed `Co\Http\Client` with websocket protocol can not support full duplex (#2477) (523c588) (@twose)
* Complete `Event::dispatch`, `Event::isSet` method arg info (#2491) (@deminy)
* Fixed invalid `Connection\Iterator` (#2492) (@matyhtf)
* Fixed `reload_async` with Timer (9eaf32cc) (bacb5228) (@matyhtf) (@twose)
* Cannot use msgqueue when task_enable_coroutine is enable (#2497) (@matyhtf)
* Fixed `read_eof` bug (e936c764) (@matyhtf)
* Sockets C++ compatibility (3cf7dcba) (@twose)
4.3.1 Enhancement
* After `Server` enabled `ssl_verify_peer`, the client without the certificate will be forcibly disconnected (31a038f) (@shiguangqi)
* `MySQL\Statement::execute` can accept null arguments (0207ebc) (@twose)
* Now part of the fatal error message caused by illegal code will show the call stack trace, the warning will be more friendly (such as calling the coroutine method outside the coroutine) (@twose)

* Fixed`swSignalfd_set` unexpected result (#2397) (@junwei-qu)
* Fixed `Socks5`proxy memory error (9dd0b7c) (@twose)
* Fixed`Redis` backward compatibility (connect timeou configuration does not work) (21f34cc) (@twose)
* Fixed `Server` reload BUG (31a038f) (@shiguangqi)
* Fixed `Co\Http\Client` with defer mode and call `recv` with the timeout agrument but timeout does not work (2c1cd83) (@twose)
* Fixed call the coroutine method out side the coroutine core dump (2bf6b09) (@twose)
* Fixed Swoole + PHP73 with `pcre.jit` on MacOS core dump (17ccaf3) (@twose)
* Fixed build failed on 32-bit env (#2411) (@twose)
* Fixed `Co\Socket` construct failed (@twose)
* Fixed`Process\Pool` system msg queue not work (#2424) (@matyhtf)
* Fixed `user` and `group` configurations not work in `Server` with BASE mode (#2402) (@matyhtf)
* Fixed `Co\MySQL` connect timeout coredump on low version of Linux (d6736e4) (@twose)
4.3.0 New Features
+ `Co::getContext` to get the coroutine context object ([RFC-1018](https://github.com/swoole/rfc-chinese/issues/45)) (@twose)
+ `Co::getPcid` to get the parent coroutine ID ([RFC-1017](https://github.com/swoole/rfc-chinese/issues/41)) (@twose)
+ `Co::exists` to know if a coroutine exists (@twose)
+ Runtime Coroutine Hook supports `stream_select` (#2358) (@matyhtf)
+ `max_wait_time` configuration support in BASE mode (#2282) (@shiguangqi)
+ Support for one-way delivery tasks in the `Master/Manager/User` process ([RFC-1015](https://github.com/swoole/rfc-chinese/issues/38)) (@matyhtf)
+ `Co\Socket` has two new APIs `recvAll` and `sendAll` to ensure complete receive/send data until completion or error (3700cbb) (@twose)
+ `Process` supports the coroutine mode, please refer to ([Use Coroutine in Process](https://wiki.swoole.com/wiki/page/p-process_coro.html))
+ `Process->exportSocket` to export `Co\Socket` object (91d3621) (@matyhtf)
+ Added `Server->getCallback` method to get the callback function of the specified name of the Server (@matyhtf)

* The default max number of connections is 100K (instead of 10K) now. If the system configuration is less than this number, use the system configuration first (3d2e387) (@twose)
* Optimize the code for the `Timer` module, which now runs faster and accepts any number of arguments (#2347) (@twose)
* `Co::stats` will show more information such as the number of events, the number of registered signals, the number of AIO tasks, etc. (@matyhtf)
* `Co::getBackTrace` with no params is equivalent to `debug_backtrace` (@twose)
* `Co::listCoroutines` is renamed to `Co::list`, but the original name is still reserved as an alias (Backward compatibility) (@twose)
* `Table::exist`, `Server::exist` are renamed to `exists`, but the original name is still reserved as aliases (Backward compatibility) (@twose)
* Redis will automatically authenticate and select the corresponding database when it is automatically reconnected. Add API: `getOptions`, `getAuth`, `getDBNum` (#2303) (fdac8a3) (@windrunner414 & @twose)
* The default Socket buffer size on FreeBSD should be 2M (750a29c) (@twose)
* `Server->stats` will show `worker_dispatch_count` which can get the number of requests submitted by the master to the current process. The number of requests in the queue can be got by `worker_dispatch_count - worker_request_count` (a353808) (@matyhtf)
* Remove `Nghttp2` dependencies, no longer need to install it, configuring compilation parameters to open
* Coroutines now have no max nesting level limitation (there are no real nesting relations between coroutines) (5458cbc) (@twose)
* When the coroutine reaches the max limitation, the HTTP server will return a 503 error indicating that the service is temporarily unavailable (ebd377f) (@twose)
* `defer` will now accept a parameter whose value is the return value at the end of the coroutine ([example](https://github.com/swoole/swoole-src/commit/ef978b3b432615b0f392958145d999f4e66584eb)) (@twose)

* Fixed error when the task method passed a null argument (#2366) (@twose)
* Fixed Http client send big data incomplete (#2360) (@twose)
* Fixed the bug that unprocessed data in the buffer was lost when the TCP client used the eof protocol (a59ae39) (@twose)
* Fixed async security of Server Reload (022f859) (@matyhtf)
* Fixed the index value of the connection iterator (b066146) (@twose)
* Fixed the bug that Set-Cookie special characters are too long to be outputed (#2368) (@mabu233 & @twose)
* Fixed the bug that Http client did not decode the cookie (duplicated encode when sent) (069ca5d) (@twose)
* Fixed Http client download with timeout lead to coredump (#2377) (@matyhtf & @twose)
* Fixed `__call` and `call_user_func*` lead to coredump when calling MySQL client method (#2387) (@matyhtf)
* Fixed coredump when Http2 client header name passed in a number (#2375) (@mabu233)
* Fixed `Swoole\Event::dispatch` behavior not as expected (#2390) (@matyhtf)
* Fixed `Socks5` proxy handshake failed (94ef96c) (@twose)
* Fixed a memory read error caused by a connection failure in a low-version Linux kernel (5adf625) (@matyhtf & @twose)
* Fixed the bug that the server used the timer in the BASE single-process mode not work (82eca13) (@twose)
* Fixed compilation failure due to unstable ZendAPI in low-version (768b8a7) (@shiguangqi)
* Fixed `EINVAL` when calling `sendto` (#2395) (@junwei)

- Create server or customs process after using async file IO are not allowed
- Create server or customs process in coroutine are not allowed

- `Websocket\Server->exists` only shows if the connection exists. Please use the `isEstablished` method to get if it is a Websocket client.
- Remove the `swoole.fast_serialize` configuration item
- Removed the PHP Warning when the `Co\Client` method return failed
- Remove the `Server->gzip` method
- Remove `PicoHttpParser` support

Remove async modules
Remove all async modules, separate asynchronous extensions to [async-ext](https://github.com/swoole/async-ext):

- Async functions
- Redis
- Http\Client
- Memory\Pool
- MsgQueue
- RingQueue
4.2.13 Fixed (incompatible changes to be noted)
* Fixed a problem with Redis subscribe API design issues that caused duplicate subscriptions and subscription messages to be lost (see: [Subscription Mode Documentation](https://wiki.swoole.com/wiki/page/1041.html)) (#2305) (@windrunner414)
* After using coroutine, you can no longer use the traditional connection multiplexing method such as `pconnect`, otherwise it will generate the problem of multi-coroutine handle the same Socket at the same time (7b1e786) (@shiguangqi)

+ Coroutine client re-supports full duplex (#2350) (@twosee)
+ Support for secure cross-coroutine socket close (#2327) (@twosee)
+ [RFC-1015](https://github.com/swoole/rfc-chinese/issues/38): Non-Worker Process Allows One-Way Delivery Task (222043a) (@matyhtf)
+ `swoole_strerror` supports automatic convert system error code and Swoole error code to text, no need to specify parameters (c92f444) (@twosee)
+ GDB trace tool supports viewing timer and reactor and hashmap information (2beb563) (@shiguangqi)
+ When MOVED and ASK errors occurred when using Redis cluster, it will be automatically transferred to the corresponding server (#2299) (@windrunner414)
+ Underlying code optimization, reducing memory copy when receiving packages (@matyhtf)
+ Now calling `Co\Socket->close()` will immediately close the fd instead of waiting for the object to be destructed, after closed, use any other API will return a BADF error (consistent with the system API) (7a61963) (@Twosee)
+ Some illegal parameters no longer cause fatal errors but generate a warning, because external parameters are sometimes uncontrollable and there is a certain risk (cd432d3) (@twosee)
+ API compatibility enhancement after use coroutine mode (consistent with sync mode) (36687e8) (@matyhtf)
+ Now swoole\src can be used as a C\C++ library at the same time (libswoole)

* Fixed a possible coredump problem when there were a large number of objects before the extension load (4ddeedb) (@twosee)
* Fixed coredump caused by attempting to clear the uninitialized DNS cache (#2288) (@mabu233)
* When `task_enable_coroutine` is enabled, incorrectly calling `Server->finish` will trigger a fatal error (156ede6) (@twosee)
* The php.ini configuration now displays `On` and `Off` correctly (instead of 0 and 1) (fe25982) (@twosee)
* Fixed the `Co::getaddrinfo` parameter parser bug (#2273) (@mabu233)
* Fixed fd error when using dispatch_func in UDP mode (#2306) (@mabu233)
* Fixed the bug that dispatch_func does not work when specifying the function name, optimization for reducing memory copy (2bc49e4) (@twosee)
* PHP warnings will no longer be triggered when the task expires (but the underlying log warning of swoole) (54eee5e) (@matyhtf)
* Fixed enable coroutine states after process restarts (#2310)
* Fixed the user process id property (#2313) (@junwei-qu)
* Fixed the bug caused by incorrectly using the asynchronous API in the onStart callback in BASE mode (#2308) (@matyhtf)
* Fixed incorrect manager_id in BASE mode (e18e013) (@matyhtf)
* Fixed mmap using SEEK_END offset error (#2314) (@junwei-qu)
* Fixed getSocket memory leak (ec8c4b2) (@twosee)
* Optimized stream mode (47e0e9e) (@matyhtf)
* Fixed BUG caused by connection multiplexing in sync client with KEEP mode under certain conditions (4c5728b) (@matyhtf)
* Fixed an issue with `Atomic` multiple `wait` and `wakeup` overflows on MacOS (fbccb25) (@twosee)
* Fixed the problem of opening the static_handler directory traversal attack risk, this is a convenient debugging feature, please do not use for production (#2323) (@windrunner414)
* Fixed unchecked return value of futex_wait system call (#2351) (@junwei-qu)
* Fixed bugs in Redis::ZAdd API parsing parameters, and fix other potential type conversion problems (#2321) (21e0497) (a0e612f) (00134cf) (f5a331e) (5f87f17) (a15f094) (67f3285) (808f578) (d118fe3) (5294473) (48f6790) (0105c7f) (ba6c8b4) (@matyhtf)
* Fixed a third-party hook failure that could result from not using function pointers when sending data (89ba2da) (@matyhtf)
* Fixed a memory leak in the Timer::tick method when passing arguments (7e15141) (@mabu233)
* Fixed user process does not exit automatically (2901ce0) (@matyhtf)
* Fixed read operation timeout config (a990540) (@shiguangqi)
* Fixed the problem that the parameter timeout time does not take effect after the `Co\Client` open the package length check (#2346) (@twosee)
* Server is no longer in the control of `buffer_output_size` in BASE mode, only limited by `socket_buffer_size` (#2326) (@matyhtf)
* Fixed compilation error under FREEBSD (#2325) (@matyhtf)
* Compatibility: When the Mysql escape method fails, it will return an empty string instead of FALSE

* Swoole\Serialize is now supported for PHP73, but it is still marked as a deprecated feature
4.2.12 + Implement RFC-1014, add `task_enable_coroutine`, remove `task_async` (13ab0f8)
+ Support `gethostbyname` timeout, add async task thread pool (#2256)
+ `Co\PostgreSQL` supports process-oriented prepare (#2223) (#2258)
+ `Co\Redis` client adds getOptions method (#2279)
* Fixed non-coroutine after server reload (#2262) (3ac2337)
* Fixed wrong data in `Table` (#2263) (872e99d)
* Fixed `Co\Http\Client:addFile` error when optional parameter is null (#2270)
* Fixed optional parameter problem for `Co::getaddrinfo` (#2273)
* Fixed timers in user processes (#2274)
* Fixed the availability of gdb debugging tools in C++ (90d148b) (b12f62f)
4.2.11 + Support Timer in manager processes
+ Added DNS cache to improve the connection speed of external network services, default TTL60s, capacity 1000 (#2250)
+ When swoole_strerror the second param is 9, it will convert the swoole-specific error code into the text
* Fixed the problem that the connection timeout does not take effect after the client triggers the DNS query. It may cause the coroutine to hang for a long time and connection resource occupation, please update the affected version (v4.2.10) as soon as possible
* Restore Co\Client backward compatibility, connect timeout parameter will change the default timeout of the client
* Fixed the problem that the change does not take place immediately when the client calls the `set` method after the connection
* Fixed the problem that the error code was not updated after the MySQL handshake failed (#2234)
* Fixed a memory error caused by buffer expansion when MySQL executed a large amount of data (e3c5a28)
* Fixed static compilation problem (#2230)
* Async write files to increase the reference count to prevent premature shutdown (028ddf4)
* Fixed Redis Client use illegal parameter would lead to coredump (5af9f3d)
* Fixed the bug that `stack_size` set by `Co::set` is set to the page size of the PHP stack. It is recommended to use the configuration name of `c_stack_size`. Please do not set it without knowing. If your application has C extension hook to zend_execute, you need to pay special attention to setting the C stack, or you don't need to set it
- Remove `enable-debug-log` from PECL compilation configure option, kernel debug logs must be compiled manually to enable
4.2.10 + Refactor Coroutine Http Client, developers no longer need to care if the connection is broken unless the network is abnormal (auto reconnect)
+ The coroutine switch adds some operations, because PDO changes the global error handler at IO request time
+ Support for creating coroutines using internal C functions
+ Allow closed sockets across coroutines
+ Improve server-side SSL certificate verification
+ Enhanced coroutine iterators and stack traces
* swoole_event_wait is always in the first place in the shutdown function list (#2144)
* Unset properties of built-in objects are not allowed, otherwise coredump may be raised
* For most built-in classes, clone and serialization are not allowed.
* Enhanced coroutine redis, now it can use setOption to adjust the configuration after connecting and auto-reconnect like phpredis
* Fixed task wait memory leak
* Fixed epoll error core dump when waiting for writable event on coroutine socket
* Unified coroutine socket timeout (see: https://wiki.swoole.com/wiki/page/p-socket_timeout.html)
* More friendly warning info
* Fixed the enable coroutine bug in the task process
* Fixed defer function not executed when meeting exception
* Fixed a bug about the global buffer was not copied when the write yield
* Fixed Http proxy (#2195) (#2205)
* Fixed Channel push timeout bug (#2226)
* Fixed Http Client websocket mask (#2206)
* Fixed atomic wait in MacOS (#2198)
* Fixed MySQL client recv huge data more than the max length of a single package (#2208) (57fc849) (76179fa)
* Fixed swoole_get_local_mac not supported on macOS (#2199)
* Fixed php_http_parser bug when meeting the wrong header name (5e91557)
* The default sock property value is -1 (0 is STDIN)
- Remove the short name of Co\Server, This name is reserved for future coroutine services
- All asynchronous classes are marked as deprecated
- Remove Timer maximum time limit
- It is not allowed to fork a process in a coroutine
4.2.9 + Add Coroutine defer feature
* Fixed max_connection can not be bigger than 10k bug (#2134)
* Fixed prepare bug after query 'CALL' (#2132)
* Fixed sendfile EAGAIN bug in MacOS (60023b7)
* Improve onReceive/onPacket callback check
* Use fast call info cache always
* Remove cidmap, cid will never be reused again
* Fixed socket construct failed core dump
* Fixed process wait bug
* Fixed swServer_signal_handler (#2145)
* Fixed typo on Swoole\\MsgQueue::destroy
* Fixed http2 huge headers bug
* Fixed hiredis error msg buffer overflow (#2149)
4.2.8 + Better PHP stack coroutine switcher and Channel implementation
+ GDB Debugging Tool for Coroutine
* MySQL Module Optimization (#2124)
* Postgre Module Optimization (#2069)
* Fixed bugs in MySQL client using Stored Procedure (#2117)
* Fixed HTTP client large file upload BUG
* Fixed bug in the wait process of `co::exec`
* Coroutine nesting detection
4.2.7 + `Server` adds `task_async` config item, supports switching between pure sync mode and async mode, sync mode by default (backward compatibility)
+ Support `gethostbyname` in `Runtime::enableCoroutine`
+ Support `PHP7.3RC5` version
* Fixed low version `GCC` compatibility problem (#2094)
* Fixed ssl timeout bug for `client->recv`
* Fixed `Socks5` proxy not work (#2103)
* Fixed the bug that `connected` property of `Co\Redis` was not updated. (#2104)
* Fixed `taskWait` segment fault (#2098)
* Fixed `Co\Socket` reuse problem
* Fixed a bug in `Process\Pool`
- `Swoole\Serialize` will be forced to close in PHP73 (unsupported temporarily)
4.2.6 + Built-in `hiredis` dependency, no longer needed to compile it separately, refactor `Co\Redis`, more stable
+ Improve the compilation test of the Alpine system
+ Refactor `Co::exec` and functions about file to fix its execution and output issues in some scenarios
* Fixed errors about coroutine switching in multi-level nesting and multiple suspend scenarios
* Fixed connection leaks that may occur when both sides are closed at the same time
* Fixed `channel` bug in blocking scenarios
* Fixed `mysql->prepare` return true (#2080)
* Fixed the reference count problem when use `swoole_table` as an array (#2079)
* Fixed `ssl_host_name` cannot open SNI (#2085)
* Fixed `kqueue` nanosecond conversion problem under MacOS (#2087)
* Fixed all `swoole_object` dangling pointer
* Add a series of scripting tools for the underlying development
4.2.5 * Alpine compatibility (#2071)
* Fixed task_ipc_mode bug (#2072)
* Improve client proxy settings
* Fixed SSL client bug (#2053)
4.2.4 + Refactor HTTP2 client, fix disconnection reconnection problem, fix cookie problem
+ Added coroutine binding detection and friendly error prompts
+ Runtime stream hook adds error_text support
* Increase asynchronous redis callback function type detection
* Fixed http client unable to execute other requests after using the download API
* Fixed `swoole_http_response->detach` cross-function memory error
* Fixed coroutine PDO connection abnormal disconnection
* parameter parsing errors return FALSE (instead of null)
* Fixed `Exception` loss after coroutine switchover
* Fixed `task_max_request` does not work
* Optimize MySQL response packet integrity detection
* Fix coroutine flock deadlock problem
* Fixed the error that the underlying swoole_buffer did not release the object
* Fixed bugs caused by multiple `Content-Length` headers
* Enhanced zval type check, defensive programming
* Fixed the bug of the HTTP coroutine client setData using the object (stream), refactoring the properties parser of the HTTP coroutine
* openssl error cleanup optimization
* `co::fread` optimized for fseek and non-normal file reading
* swoole_server TCP and UDP mode separation
* Fixed the problem caused by passing invalid parameters when creating a server
* Fixed the bug by `addProcess` in BASE mode
* Fixed the problem that the task process uses `reload_async` (asynchronous safe restart feature)
* Improve `package_eof` illegal empty string check
- Remove code for deprecated multi-threaded mode
4.2.3 This version is mostly based on the v4.2.2 made some fixes
+ Add `Co::statvfs` to retrieve file system information
* Fixed non-array property error on swoole_http_response object
* Fixed bad version number, add automated fixing tool
4.2.2 + Task process supports asynchronous and coroutine
+ Refactor `addListener`, now developers can add new service listeners in any order
+ Support mixed server of `http`, `http2`, `websocket`, `tcp`
+ Completed coroutine redis client method parameter definition
+ `Co::readFile` supports reading non-disk files
+ Now static_handler supports more file types and skips files with length 0
* Fixed multipart/form-data in some cases parsing errors
* Fixed the dislocation of sendfile data on MacOS
* Fixed bug where SIGRTMIN processing error caused the log file to fail to reopen
* Fixed a bug where redis-client last error value was not cleared and the next request was incorrect
* Fixed a bug about connecting a connected asynchronous redis coredump
* Fixed MySQL client protocol processing parameter binding NULL bug
* Fixed segment fault caused by file hook, closed the include/require coroutine
* Fixed the socket hook construct error
* Fixed the sleep hook
* Fixed a bug that returned an illegal pointer when reading an unset object property
* Fixed the bug that after event_wait, EG(scope) is not restored in PHP70, causing private properties to be inaccessible
* Alpine dependency compatibility optimization
* Cygwin compatibility optimization
* Support log_level to block warning information
* Distinguish 204 response then skip body processing
* The underlying code is cleaned up, all TSRM macros, PHP5 compatible macros and functions are removed, useless stack allocation and multiple pointers are reduced, FASTZPP is re-enabled to improve parameter parsing performance
* Error tips optimization, error reporting guidelines will be generated when the underlying crash occurs
4.2.1 + This version is based on the previous version and made some fixes.
* Fixed compilation failure caused by no time_nanosleep in some environments
* Fixed loading error in PHP-ZTS version
* Fixed the Bad file descriptor error when using coroutine in dispatch mode 7
* Fixed exit interceptor does not work
* Fixed too long domain name DNS buffer overflow in client
4.2.0 + Add new coroutine hooks, `tcp`, `udp`, `ssl`, `tls`, `sleep`, `usleep`, and file read and write, `mkdir`...etc, be async automatically
+ New ability of the server/client to send the `swoole_websocket_frame` object directly, support any type of `frame` construction, send and receive, support `__toString`
+ Better `AIO`
+ Add the `Process\Pool::getProcess` method
+ Support `--with-hiredis-dir`, `--with-nghttp2-dir` compiling parameters
* Enhanced `send_yield`, automatic retry within the timeout
* Enhanced timer round detection, repaired millisecond-level ultra-short timer execution error
* Enable `TCP_NODELAY` by default, turn off `Nagle algorithm`, reduce latency
* More standardized PECL package
* Re-support the sending of HTTP-header with custom `content-length` of 0
* Fixed an issue that can not access the Private/Protect properties in the class after coroutine yield caused by `EG(scope)` not switched in PHP7.0.x
* Fixed the error opcode and finish status in `websocket_server`
* Fixed the `async_dns_lookup` bug
* Completed the code about `channel.c` overflow space handling
* Fixed the bug of `channel->close`
* Fixed the bug of coroutine `socket->recv_package`
* Repair MySQL Statement->execute does not support null parameters
* Support for identifying `form-data` encoding with a semicolon-separated `boundary`
* Add many high-quality unit tests, greater stability
- Remove useless time wheel algorithm
4.1.2 + Add `socket_hook`
* Fix bugs in nested coroutines
* Fixed variable reference count problem when `exit` in the coroutine
* Coroutine MySQL`query`, `prepare`, `execute` does not time out by default, conforms to the documentation API description
* The MySQL transaction operation of the coroutine is forbidden to use the defer mode, and the developer needs to use it explicitly. The concurrent open transaction can be replaced by `query`.
* Fix the problem of mmap `MAP_FAILED` return value detection
+ Add PECL package verification
4.1.1 + **Support `Redis`, `PDO`, `MySQLi`**, use `Swoole\Runtime::enableCoroutine()` to make them become Async IO by coroutine scheduler
+ **Coroutine tracking**: `Coroutine::listCoroutines()` can list all current coroutines, `Coroutine::getBackTrace($cid)` gets the function call stack of a coroutine
+ Refactoring `Co\Channel` C code to C++, solving unintended consequences of complex scenes and achieving high stability
+ Refactoring `Co\Http\Client` C code to C++ coroutine mode, solving asynchronous timing problems and achieving high stability
+ Support for using `exit` in coroutines and Servers, which will throw a catchable `\Swoole\ExitException` exception.
+ Remove PCRE dependency limits for all iterators (table/connection/coroutine_list)
+ Add the `open_websocket_close_frame` configuration to receive close frames in the onMessage event
+ Remove the `Http\Response->gzip()` method and use the `http_compression` configuration item instead. The bottom layer will automatically determine the client's incoming `Accept-Encoding` to select the appropriate compression method, add Google BR compression support
+ Add `Co\Http\Client->addData()` method to send the data in the memory as the content of the uploaded file.
+ `Solaris` system support
+ Http2 supports `MAX_FRAME_SIZE` framing transmission and `MAX_HEADER_LIST_SIZE` processing. The client adds `isStreamExist` method to detect whether there is a corresponding stream.
+ `swoole_http_response->status` increases the `reason` parameter
* Fixed an issue where unsigned arguments in MySQL prepare used signed values ​​to cause numeric overflows
* Fixed an issue with no coroutine in the `onRequest` callback for HTTP2
* Fixed the problem that `tasking_num` became `-1` in some special cases
* Fixed HTTP2-server window-update frame construction error
* Fix all levels of compile warning under all PHP versions
* Compile error will occur when GCC version is less than 4.8
* Fixed MySQL's memory allocation caused by the use of prepare statement without parameter binding
* Fixed old stream memory loss leak when HTTP2 client reconnect
* Fixed wrong package info by version 4.1.0
4.1.0 + **Support `Redis`, `PDO`, `MySQLi`**, use `Swoole\Runtime::enableCoroutine()` to make them become Async IO by coroutine scheduler
+ **Coroutine tracking**: `Coroutine::listCoroutines()` can list all current coroutines, `Coroutine::getBackTrace($cid)` gets the function call stack of a coroutine
+ Refactoring `Co\Channel` C code to C++, solving unintended consequences of complex scenes and achieving high stability
+ Refactoring `Co\Http\Client` C code to C++ coroutine mode, solving asynchronous timing problems and achieving high stability
+ Support for using `exit` in coroutines and Servers, which will throw a catchable `\Swoole\ExitException` exception.
+ Remove PCRE dependency limits for all iterators (table/connection/coroutine_list)
+ Add the `open_websocket_close_frame` configuration to receive close frames in the onMessage event
+ Remove the `Http\Response->gzip()` method and use the `http_compression` configuration item instead. The bottom layer will automatically determine the client's incoming `Accept-Encoding` to select the appropriate compression method, add Google BR compression support
+ Add `Co\Http\Client->addData()` method to send the data in the memory as the content of the uploaded file.
+ `Solaris` system support
+ Http2 supports `MAX_FRAME_SIZE` framing transmission and `MAX_HEADER_LIST_SIZE` processing. The client adds `isStreamExist` method to detect whether there is a corresponding stream.
+ `swoole_http_response->status` increases the `reason` parameter
* Fixed an issue where unsigned arguments in MySQL prepare used signed values ​​to cause numeric overflows
* Fixed an issue with no coroutine in the `onRequest` callback for HTTP2
* Fixed the problem that `tasking_num` became `-1` in some special cases
* Fixed HTTP2-server window-update frame construction error
* Fix all levels of compile warning under all PHP versions
* Compile error will occur when GCC version is less than 4.8
* Fixed MySQL's memory allocation caused by the use of prepare statement without parameter binding
* Fixed old stream memory loss leak when HTTP2 client reconnect
4.0.4 + TaskWait support coroutine scheduling now, call "taskwait" in coroutine would be no longer blocked
+ Better Http2 support, we can use "\Swoole\Coroutine\Http2\Client" to structure any GRPC client now
* Fixed a kernel level bug in an infrequent extreme case when using SWOOLE_PROCESS
* Fixed the connection closed when Coroutine WebSocket Client recv timeout
* Fixed PHP class extends without parent calls crash
* Fixed user call "__destruct" brings crash
* Fixed upload filename too long bug
* Fixed HAVE_SOCKETS macro does not exist, including static compiler
* Fixed co::suspend and co::resume assert failed
* Use SSL_pending
* Better signal handler on MacOS
4.0.3 - Fixed `Channel`core dump when high concurrency
- Add `Channel->pop(float $timeout)`, unlimited default
- Remove`Channel->select`
- Fixed call `Co\Client->close`memory error
- `WebSocket\Server` support disconnect with code and reason
- Improve `Coroutine\Http2\Client`:
- Rename `swoole_http2_response` properties to plural form.
- Add Http2 `WINDOW_SIZE_UPDATE` to solve dead lock, unlimited default
- Add `Client->recv(float $timeout)`, unlimited default
- Add `cookies` and `set_cookie_headers` properties
- Fixed all memory errors and invalid properties error
- Fixed core dump when send without recv
4.0.2 - Support ob functions in coroutine
- Better Channel
- Fixed all known bugs about Client
- Fixed all compiler warnings in PHP73
4.0.1 - Added enable_coroutine option
- Added MySQL8 caching_sha2_password supports
- Refactor channel
4.0.0 - Using c stackful coroutine
- Allow to create server in multiple processes
- Fixed issue where http2 server could not send more than 16K data to Chrome browser client
- Added Channel->peek method for peeping data
- Fixed issue where Server->pause/resume could not be used under SWOOLE_PROCESS
- Removed Linux AIO and use thread pool for asynchronous file IO anyway
- Added MySQL stored procedure supports
2.2.0 - Added Co\Socket
- Added Http\Response->detach
- Added Http\Response::create
- Added Http\Response->redirect
- Fixed udp connect no effect
- Fixed http2 server cannot send more than 16k of data
- Fixed Co\Redis connection memory leak bug
- Fixed invalid error log thrown when SOCK_DGRAM type client connection was rejected
2.1.3 - Fixed failed to compile on docker
- Fixed Http\Reponse::write is unavailable
- Fixed ProcessPool crash without onWorkerStart callback
- Fixed failed to compile with --disable-coroutine
- Fixed failed to compile with --enable-coroutinepostgresql on php-7.1
2.1.2 - Added PostgreSQL coroutine client (depends on libpg)
- Added Co::readFile
- Added Co::writeFile
- Added swoole_process_pool
- Added swoole_msgqueue
2.1.1 - Added co::fgets
- Added co::exec
- Added Client::peek
- Added Co\Redis::$connected property
- Added Co\MySQL::$connected property
2.1.0 - Added shortname
- Added channel
- Added non-namespace style API
2.0.12 - No longer support PHP5
2.0.11 - Added swoole_mysql::prepare
- Added Coroutine::fread
- Added Coroutine::fwrite
- Added Coroutine::gethostbyname
2.0.10 - Merge branch 1.9
- Improve stability
- First stable version
2.0.9 - Merge branch 1.9
- Added Server::taskCo
- Added Coroutine::sleep
2.0.8 - Merge branch 1.9
2.0.7 - Added Coroutine::create function, allows user to create coroutine
- Fixed HttpClient crash
2.0.6 - Fixed http client and redis client conflicts
- Fixed the coroutine client cannot use the SplQueue on PHP5
2.0.5 - Added native coroutine
- Added Swoole\Coroutine\Client
- Added Swoole\Coroutine\Http\Client
- Added Swoole\Coroutine\MySQL
- Added Swoole\Coroutine\Redis
- Fixed compile failure with ZTS
- The minimum version requirement upgrade to 5.5
2.0.4 - Added native coroutine
- Added Swoole\Coroutine\Client
- Added Swoole\Coroutine\Http\Client
- Added Swoole\Coroutine\MySQL
- Added Swoole\Coroutine\Redis
1.10.5 - Added Lock::destory
- Added Lock::$errCode
- Fixed RWLock unavailable
- Fixed arg of udp connect no effect
- Added setting window size support for http2 client
1.10.4 - Fixed failed to compile on docker
- Allow to add timer in master process
- Added configure options for pecl script
1.10.3 - Added swoole_event_dispatch
- Added swoole_event_isset
- Optimized accept performance
- Added before parameter to swoole_event_cycle
- Added swoole_process::setBlocking
- Added swoole_http_request::getData
1.10.2 - Fixed crash when max_request=1 was set in BASE mode
- Fixed WebSocket client unwrapping when the handshake response and the data frame are in the same transmission unit
- Fixed SSL connection cannot use sendfile
- Fixed lose process due to frequent reload in BASE mode
- Fixed swoole_async_dns_lookup crash when jemalloc is enabled
- Fixed crash when opening opcache.enable_cli=On in PHP7.2
- Modify the error information when the client fails to resolve the domain name
- Process is marked as idle during reload and no longer receives new requests
1.10.1 - Fixed Http2\Server cannot set http header
- Added http_proxy_user and http_proxy_password options
- Added Client::shutdown
- Added WebSocket\server::isEstablished
- Added debug_mode option
- HttpClient compatible with Unity3D
1.10.0 - Update Table::incr and Table::decr support signed integers
- Compatible with PHP-7.2
- Added Event::cycle function
- Fixed Event::del function can not remove the standard input handle problem
- Fixed Task process timer interval is less than the Client receive timeout, causing Client :: recv deadlock problem
- Added automatic analysis of domain names feature, asynchronous client no longer need to add additional code for domain name resolution
- Added ssl_host_name configuration items, used to verify the SSL / TLS host legitimacy
- When dispatch_mode = 3, an error log is printed when all the workers are busy
- Added a port iterator that traverses all connections to a listening port
- Fixed Table memory alignment issues on non-x86 platforms
- Fixed the issue of invalid max_request configuration in BASE mode
- Fixed WebSocket server in some client ping frame with mask data return error
- Fixed an issue where HttpClient uses the HEAD method to respond to content carrying Content-Length causing stuck
- Added STREAM module, Reactor, Worker, Task communication more flexible
- Added request_slowlog_timeout configuration, record slow request log
- Added MySQL asynchronous client support for JSON format
1.9.23 - Fixed occasional crash bugs of SSL server
1.9.22 - Fixed MacOS occasional death cycle problems
- Added Async::exec
- Added tsl_host_name option
1.9.21 - Added Atomic\long, support 64-bit signed long integer
- Optimized the underlying GlobalMemory implementation, support the creation of an unlimited number of atoms, locks, tables
- Prohibit serialization of Swoole module object
- Fixed Http\Client download method fourth argument is invalid
- Fixed FreeBSD platform compiler error report
- Fixed sendfile on the MacOS platform there is a 5 second delay problem
- Added Process::setTimeout
1.9.20 - Fixed 32-bit system compilation failed
- Fixed not available on PHP5
1.9.19 - Fixed worker process crash when the Channel::push exceeded 8K and failed to create temporary file
- Fixed MacOS event of shutdown cannot be executed
- Automatically create the task_tmpdir and upload_tmp_dir directories
- Fixed the SSL server to set the ciphers or ecdh_curve problems that cause the crash
- Optimize the performance of the Server::bind method using a spin lock
- Added the reload_async option to control the asynchronous reboot of the switch
- Added the tcp_fastopen option to turn on TCP fast handshake
1.9.18 - Fixed process::signal parent/child process repeatedly registers the same signal that causes the crash
- Optimize EOF protocol logic to reduce 64K stack memory requirements
- Fixed the client to set the HTTP_PROXY agent does not work properly
- Fixed asynchronous reloading a certain probability of missing process problems
- Allow dispatch_func to pass in PHP functions
- Fixed defer interface can not perform in the onWorkerStart callback
- Fixed EOF sync client has received an EAGIAN error when receiving data continuously
1.9.17 - Refactor the worker process reload feature
- Added document_root and enable_static_handler option
- Update Server::send method, SSL connections can use sendfile
- Added 27 unit test scripts
1.9.16 - Updated server listen fail to throw Swoole\Exception exception instead of fatal error
- Added Swoole\Async::set log_file option
- Updated the swSocket_bind error log mode and accept the log_level control
- Fixd deadlock when sending large packets in UserProcess
- Added 16 unit test scripts
1.9.15 - Added MySQL client support for transaction processing
- Added static compilation support
- Added MySQL connection timeout support
- Added Redis connection timeout support
- Added Redis password and database options
- Added Atomic->wait/wakeup function, you can use the atomic count to achieve notification and wait function
- Fixed Redis\Server received more than 8K request crashes when the request
- Added 170 unit test scripts
1.9.14 - Update HttpClient, when the connection is overtime or when the server is reset, the callback is not completed
- Update HttpClient, the underlying increase request timeout mechanism
- Update the bottom of the client support mqtt agreement
- Fixed WebSocket server custom handshake method more than the header
- Fixed onTask memory leak
- Fixed HttpServer special circumstances the release of the problem of the crash occurred
- Fixed WebSocket::unpack Passing an empty string causes a problem with parsing errors
1.9.13 - Fixed WebSocket::unpack memory leak
- Fixed server accept blocking in MacOS platform
1.9.12 - Allow the WebSocket client to send empty packets to the server
- Added the callback function cache, reduce the callback function CPU consumption
- Fixed WebSocket client memory leak
- Fixed compiler error when have not SSE instruction
1.9.11 - Fixed WebSocket server onOpen callback memory leak
- Added heartbeat detection support time wheel algorithm
- Added length parameter support for sendfile API
- Added connection timeout supports for asynchronous client
- Optimized performance, reduce branch prediction failure rate
1.9.10 - Fixed compile error with enable-ringbuffer
- Fixed unix socket client cannot connect to server
- Fxied swoole_client::close crash with SWOOLE_KEEP flag on PHP-FPM
1.9.9 - Fixed a problem with the rectifier overflow of the DNS resolver request ID
- Update swoole_table::get method, increase the parameters to support only the value of a field
- Update getClientInfo return value from_id entry to reactor_id
- Fixed the Http2 client POST data when the protocol is faulty
- Fixed swoole_async_dns_lookup target host IP contains 0 when the return value is wrong
- Fixed crash when tcmalloc and jemalloc are enabled
1.9.8 - Fix some compilation errors
1.9.7 - Added support for systemd.socket
- Added swoole\http2\client
- Added client support for http-proxy
- Added the swoole_process::close parameter, allowing only one of the pipes to be closed
- Fixed MySQL client crash when the low version gcc is compiled
- Fixed the crash in the BASE mode shutdown
- Fixed openssl-1.1 configuration detection error problem
- Fixed open_eof_split after enabling BASE mode to turn off connections in the onReceive callback function
- Fixed the problem with the Redis \ Server :: format function SET and MAP formatting errors
- Fixed a problem that caused a crash when a string type variable was passed directly when swoole.fast_serialize was enabled
- Update The reactorId variable in the onClose callback is set to -1 when the server actively shuts down the connection
1.9.6 - Added swoole_mysql::escape method to escape special characters in SQL statements
- Added support for openssl-1.1
- Fixed timer crash when more than 10,000 timers were added
- Added swoole_serialize module, PHP7 under high performance serialization library
- Fixed swoole_client->enableSSL method ssl_cert_file and ssl_key_file invalid parameters
- Added swoole_http_server support for POST multi-level KEY
- Fixed listening on UDP port setting onPacket invalid issue
1.9.5 - Fixed taskWaitMulti special case of file descriptor leak problem
- Added pid_file option to write the master PID to file
- Added listen random port support, OS will automatically be assigned an available port
- Removed DNS cache, removed swoole_clear_dns_cache function
- Added use_async_resolver option to enable real async-io DNS lookup
1.9.4 - Fixed WebSocket server default onRequest method memory leak problem
- Fixed the problem of missing zlib library compilation failures
- Added Client->reuseCount property to query the number of multiplexed sockets
1.9.3 - Added extension function args info
- Added package_length_func option
- Added http_client download method
- Fixed issue#965
- Fixed issue#966
- Fixed issue#967
1.9.2 - Fixed zend_mm_heap corrupted on PHP7
- Fixed Async::writeFile parameter FILE_APPEND is invalid on MacOS
- Disabling Async::writeFile Use the FILE_APPEND parameter in LinuxAIO mode
- Added websocket_subprotocol option WebSocket server supports setting Sec-WebSocket-Protocol
- Fixed CentOS 4.3 or lower operating system does not exist O_CLOEXEC causes compilation to fail
- Fixed server tasking_num overflow bugs
- Added ucwords parameter to response header method
1.9.1 - Fixed server cannot shutdown when using addProcess
- Fixed Async::write function does not set the callback function to crash
- Fixed a problem with the Table Iterator missing data
- Added Async::writeFile FILE_APPEND option supports
- Added file lock to Async::write/read function
- Refactor the implementation of the Async::write function, using O_APPEND
- Refactor reopen the reopen log file feature
- Fixed taskWaitMulti unable to return to the results of the successful implementation of the task after a timeout
- Timers use monotonic time to solve the system time to modify the problem caused by timer confusion
1.9.0 - Added Swoole\Redis\Server, redis compatible protocol server framework
- Added Swoole\Mmap, high-performance disk read and write function
- Added Swoole\Client::pipe method
- Added onBufferEmpty and onBufferFull event callback for Swoole\Server
- Added buffer_high_watermark and buffer_low_watermark option for Swoole\Server
- Added swoole_clear_dns_cache function
- Added Swoole\Channel, high performance shared memory queue
- Fixed redis client type method could not return a string
- Fixed an issue when the sync client length protocol package_max_length was invalid
- Fixed low-level version of gcc running under the long-term crash happened
- Fixed invalid websocket_mask for asynchronous WebSocket client
- Fixed a problem where the MySQL client crashed accidentally when there were too many records
- Fixed Mac platform task more than 8K to create a temporary file failed to lead to the problem of undeliverable tasks
- Fixed taskWaitMulti When the process returns more than 8K receive timeout problem
- Fixed atmoic add and sub return value exists data synchronization problems
1.8.13 - Fixed WebSocket\Server automatically merge the incomplete data frame exists security vulnerabilities
- Added the upload_tmp_dir option to set the Http\Server upload file temporary directory
- Added Server->sendMessage automatic stringing function, and now sendMessage PHP variables can be sent to any other work process
- Added Process::alarm high-precision timer
- Added a bug where the protocol length function crashed when the connection was closed
- Fixed swoole_select function in PHP7 can not modify the reference array problem
1.8.12 - Fixed Table Errors caused by iterator errors when deleting elements while traversing data
- Added Http\Client new option websocket_mask controls websocket client enable mask
- Repair Swoole \ Server in BASE mode can not use task_ipc_mode = 3 configuration
- Optimize the performance of Http\Server response body gzip compression
- Fixed Timer::after can only be executed once in the task process
- Added automatic splicing incomplete data frame for WebSocket\Server
- Remove the enable_reuse_port option
- Added Swoole\Async namespace class style api
- Fixed Http\Server lisnten UDP port cannot use onReceive callback function
1.8.11 - Added new package_length_type C(unsigned 8bit)/c(signed 8bit)
- Added package_length_func option, you can use the C/C++ function to parse the packet length
- Added SIGRTMIN signal handler, used to reopen the log file
- Fixed server crash on Cygwin environment
1.8.10 - Fixed Swoole\Http\Client crash when do close connection in the callback function
- Fixed Swoole\Http\Server cannot support more than 1024 concurrent
1.8.9 - Added namespace class alias
- Added Swoole\Http\Client->addFile interface, support upload file
- Added Swoole\Event namespace and class styles
- Added Swoole\Http\Client no ContentLength response
- Added --with-openssl compiler option, can specify the path of the OpenSSL Library
- Fixed Swoole\MySQL memory leak on PHP7
- Fixed Swoole\Redis memory leak on PHP7
- Fixed Swoole\Http\Client memory leak on PHP7
- Fixed Swoole\Http\Server crash when uploading files on PHP7
1.8.8 - Added Swoole\Server\Port->getSocket
- Added Swoole\Server->getClientInfo()['close_errno'] property
- Added Swoole\Event namespace and class styles
- Added Swoole\MySQL character set support
- Added Swoole\Server->taskWaitMulti can perform multiple tasks concurrently
- Added Swoole\Client->getPeerCert method
- Added Swoole\Client->pause and Swoole\Client->resume
- Fixed Swoole\Server->taskwait cannot use in BASE mode
- Fixed Swoole\MySQL client crash when receive more than 250 field query statement
- Fixed Swoole\Server->task third parameter passed Callback Crash at PHP7
- Fixed Swoole\Http\Request->files crash on PHP7 when externally referenced
1.8.7 - Fixed Swoole\Http\Server on PHP7 crash (zdata release request data memory problems)
- Fixed Swoole\Http\Client crash when no have header setting
- Fixed Swoole\MySQL parse unixsocket type host address fail
- Fixed Swoole\Http\Client crash below the Linux-2.6.18 version of the kernel
- Fixed Swoole\MySQL nested callback crash problem on PHP7
- Update Swoole\Server maximum listening port number to 60,000
- Update Swoole\Server main thread use epoll or kqueue
- Fixed swoole_async_dns_lookup crash when hit cache
- Added Swoole\Timer::exists
1.8.6 - Added `swoole_mysql` real async mysql client
- Fixed swoole_client/swoole_http_client/swoole_redis memory leak and crash bug on PHP7
- Remove gcc_aio.c
- Remove swoole_mysqli_get_socket and swoole_mysql_query
- Remove swoole_http_server->setGlobal
- Added swoole_async_dns_lookup result cache
- Optimize websocket server performance
- Added swoole_server->task complete callback parameter
1.8.5 - Fixed swoole_mysql_query insert_id error
- Fixed swoole_websocket_server crash when receiving less than 4 bytes of data
- Added bigint ID support for swoole_mysql_query
- Fixed sync Swoole\Client memory leaks
- Fixed Swoole\Http\Client crash when the connection is closed
1.8.4 - Fixed Swoole\Redis callback function memory leak bugs
- Fixed swoole_mysql_queue function memory leak bugs
- Fixed Swoole\Http\Client memory leak bugs
- Fixed issue #585
- Fixed issue #590
- Added unixsock support for async client
- Added high-precision time for Swoole\Http\Request
1.8.3 - Added swoole_server->getLastError method for getting the last error code
- Added form-data supports for Http2 protocol
- Added COOKIE support for Http2 protocol
- Added SSL/TLS encryption support for http client
- Fixed issue #527
- Fixed issue #553
- Fixed crash when the number of CPU cores than is set reactor_num
- Fixed swoole_client callback function memory leak
- Added support for asynchronous full reload of server security
1.8.2 - Added http2 supports for swoole_http_server
- Added swoole_server->stop method used to stop the worker process
- Added log_level option for swoole_server settings
- Fixed swoole_websocket_server receives data over the issue 64K crashes
- Added multi-port monitor is not set callback function causes the program to crash
- Enhance the SSL/TLS encrypted safety level, now used by default TLS1.2/ECDHA_RSA encryption algorithm
- Fixed onFinish event callbacks memory leak problem
- Fixed the problem task finish can not be used under BASE mode
1.8.1 - Added psr-4 style namespace classes alias
- Added swoole_server->protect methods used to protect the connection will not close by heartbeat thread
- Added swoole_websocker_server::pack and swoole_websocker_server::unpack static method
- Added redis subscribe and publish messages supports
- Added swoole_http_client for gzip content compression support
- Added swoole_client->reuse property
- Fixed async client incidental core dump
- Fixed async client memory leak
- Fixed compile failed with enable-openssl on MacOS
1.8.0 - Fixed swoole_process::signal core dump on PHP7
- Refactor after/tick timer
- Refactor swoole_websocket_server
- Added async redis client
- Added async http/websocket client
- Added swoole_client->reuse property
- Added swoole_server->defer/swoole_event_defer
- Added support for multi-port hybrid protocol
- Added configure option for tcmalloc and jemalloc
- Remove swoole_server->addtimer/swoole_timer_add/swoole_timer_del
- Remove swoole_server->onTimer event callback
- Remove swoole_server->handler
- Update lish.h to version-1.9.9
1.7.22 - Fixed memory leak in PHP7
- Fixed core dump in PHP7
- Added swoole_mysql_query
- Fixed swoole_table->del damage the memory
- Added swoole_websocket_server->exist
- Added swoole_server ssl_client_cert_file settings
- Fixed timer exec_time overflow cause stop
1.7.21 - Fixed memory leak swoole_client synchronous mode occurs when the server closes
- Fixed POST/Upload problem can not handle more than 8K
- Added swoole_http_response->sendfile method for sending large files
- Fixed swoole_client core dump when enable SSL/TLS encrypted
- Added swoole_server->getSocket/swoole_client->getSocket
- Fixed UDP large package in question Worker process occurs dispatch_mode = 1/3 deadlock
- Added swoole_client->sleep/wakeup method for suspend/resume data reception event
- Fixed UDP large package data is abnormal
1.7.20 - Added swoole_http_server HTTP DELETE entity supports
- Added swoole_client support for SSL/TLS tunnel encryption
- Fixed the problem of coredump when swoole_websocket_server is not set up onRequest
- Added swoole_server->getClientInfo/getClientList alias
- Fixed swoole_server->finish cannot use in BASE mode
- Added swoole_client ssl certificate supports
- Fixed swoole_http_server memory leak
1.7.19 - Added swoole_atomic module, support for atomic integer operations
- Fixed timer in the system can not recover after the resumption of the operation
- Fixed ssl_server cannot send more than 30K large packages in a slow network
- Added supports for UDP/UDP6/UNIX_DGRAM big packages(64K)
- Fixed addtimer/tick timer can't be used in BASE mode
- Added addProcess in SWOOLE_BASE mode
- Fixed SWOOLE_KEEP core dump
1.7.18 - Added onPacket event callback function
- Added PHP7 support
- Fixed swoole_http_response->header memory leak
- Added swoole_table signed integer support
- Added REUSEPORT support
- Fixed woole_client and swoole_timer memory leak
- Added swoole_server->exist function
1.7.17 - Fixed async swoole_client send data incomplete
- Removed task_dispatch_mode server configuration
- Added pipe_buffer_size server configuration
- Pipeline memory buffer default size is adjusted to 32M
- Http Server Header adjust the maximum length of 128 to 8192
- Fixed swoole_process->pop cannot use
- Fixed taskwait error in MacOS and CygWin
- Added swoole_table->exist
1.7.16 - Fixed swoole_server->addtimer and tick timer conflict
- Added server statistics items request_count and worker_request_count
- Added server connections iterator, foreach traverse server can use all the connections
- Optimize dispatch_mode = 3 model to enhance the efficiency of task assignment
- Added multipart-form http server and upload files support
- Added http server requests query_string
- Fixed invalid parameter problem task_max_request
1.7.15 - Fixed swoole_client waitall parameters failures
- Fixed swoole_table dead loop BUG
- Disable swoole_websocket_server->send method
- Added swoole_table->incr/decr methods
- Added http server gzip compression supports
- Added swoole_server open_eof_split configuration
1.7.14 - Update websocket server onOpen callback params
- Update websocket server onMessage callback params
- Added swoole_server->tick/swoole_timer_tick function
- Fixed onReceive data merge failure
- Added http server gzip compression supports
- Update http server allows sending empty body
1.7.13 - Update server session_list resized to 1M
- Update connection_info from_fd, from_port rename to server_fd, server_port
- Http server performance optimization
- WebSocket server performance optimization
- Added swoole_client->getpeername
- Added swoole_client->getsockname
- Fixed accept dead loop when server have too many connection
- Fixed sequence of onConnect/onReceive events disorder
1.7.12 - Fixed swoole_server tcp buffer error
- Fixed wrong error log
1.7.11 - Fixed udp server called connection_info wrong
- Fixed temporary files task disk space does not release
- Fixed WebSocket onOpen event callback core dump
- Fixed cannot use sendMessage in the task process
- Fixed Websocket server Sec-WebSocket-Accept handshake failed
- Fixed HttpServer in turn the KeepAlive continuous POST data coredump
- Fixed MacOS/FreeBSD error ENOBUFF occurred in a large number of concurrent
- Added HttpServer chunk transmission support
- Added PCRE detection
1.7.10 - Fixed udp server after the reload cycle of death BUG
- Fixed http server POST request segment fault error
- Added non-blocking settings for swoole_process::wait
- Fixed pecl script cannot use
- Fixed swoole_server->sendMessage to fail
- Added swoole_websocket_server
- Added swoole_server->sendto
- Optimization performance for http_server
- Optimization performance for swoole_client and swoole_event
- Added ARM platform support
1.7.9 - Added websocket protocol support
- Added swoole_process::signal
- Added swoole_server->addProcess
- Added swoole_process::name
- Added swoole_server::listen
- Added swoole_server::sendMessage and onPipeMessage event
- Added swoole_event_write
- Added swoole_process->close
- Added swoole_server user/group setting
- Added swoole_server task/finish automatic packing
1.7.8 - Fixed swoole_http_server::on no implementation parent class methods
- Fixed cannot read cookie in swoole_http_server
- Added swoole_http_server support to POST RawContent
- swoole_timer_after interface can pass a user parameter
- swoole_client->recv and onReceive zero copy
- Fixed swoole_table->set cannot be set more than 64K string
- Fixed open_length_check connection memory buffer is not reset bug
- Added dispatch_mode=4/5, dispatch data by client ip and uid
- Event callback function exception error level changed from E_WARNING to E_ERROR
1.7.7 - Added swoole_http_server
- Added swoole_server->after and swoole_timer_after
- Fixed all known issues
1.7.6 - Fixed all known issues
1.7.5 - Added swoole_client->sendfile()
- Added swoole_table
- Remove onMasterConnect/onMasterClose
- Added pipe output buffer
- TCP short connection have 50% performance improvement
1.7.4 - Task process support timer
- Repair UDP error BUG
- Add SSL-server support
- Reload is effective for task_worker.
- When the pipe is filled with poll is waiting for the write, rather than packet loss
- Increase the clang compiler support
- Repair shutdown task_worker and manager abnormal stop
1.7.3 - Fixed pipe_worker zero
- Fixed serv->connect_count wrong
- Fixed length_check dispatch error
- Optimization of large size response packet
1.7.2 - Fixed udp sendto error
- Fixed heartbeat no close connection
- Added swoole_process module
- Added swoole_server::task large package
- Added swoole_server task worker use message queue
- Added messge queue ipc move to swoole_server::set
1.7.1 - Check close fd is not timer_fd
- socket LINGER option
- Fixed eof_check memory error
- Added swoole_event_set
- Added swoole_client out_buffer
- Added socket linger option
- Fixed the swoole_server->close destroy out_buffer bug
- Using php_error_docref
- Fixed swoole_async_dns_lookup warning
1.7.0 - Fixed compile error.
1.6.12 - Added connection out_buffer
- Added async file read/write
- Added async dns lookup
- Added long tcp connection
- Added client timer
- Added swoole_server->sendfile
- Added signalfd usage
- Fixed some bugs
1.6.11 - Disable by default async_mysql
- Disable by default sockets
- Added event onWorkerError
- Added event onWorkerStart for task_worker
- swoole_server->task can assign worker_id
- swoole_server->set() save params to swoole_server::$setting
- swoole_client->send will check data length
- swoole_server->connection_info for udp
1.6.10 - Enabled by default async_mysql
- Add tcp heartbeat mechanism
- UDP send no require from_id
- swoole_client on::Receive and on::Close no need to call recv/close
- Add last_time and connect_time to tcp connection_info
- rebuild data_buffer
1.6.9 - use "pecl package"
1.6.8 - Fix all gcc wanning
- support pecl install
- new function swoole_server_taskwait
- remove *.lo files
1.6.7 - First version for pecl.net