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)

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)

Enhancement
---
* 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)

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

Removed
---
- `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

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)

Enhancement
---
+ 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)

+ 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

+ 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

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

+ 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

+ 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

+ **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

+ **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 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

- 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

- 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

- 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

- 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

- 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