swoole 4.4.0

Event-driven asynchronous and concurrent networking engine with high performance for PHP.


Event-driven asynchronous and concurrent networking engine with high performance for PHP.
- event-driven
- coroutine
- asynchronous non-blocking
- multi-thread reactor
- multi-process worker
- multi-protocol
- millisecond timer
- built-in tcp/http/websocket/http2 server
- coroutine tcp/http/websocket client
- coroutine mysql client
- coroutine redis client
- coroutine read/write file system
- coroutine dns lookup
- support IPv4/IPv6/UnixSocket/TCP/UDP
- support SSL/TLS encrypted transmission

License: Apache2.0

Changes

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)

Enhancement
---

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

Internal
---
+ 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`