Swoole v4.4.0 Release Notes
Release Date: 2019-07-06 // almost 5 years ago-
Backward incompatible changes
- ๐ Consistent with
PHP
official, no longer supportsPHP7.0
(@matyhtf) - โ Remove the
Serialize
module, which is maintained in a separate ext-serialize extension. Reason: Due to frequent changes to thePHP
kernel, stability cannot be guaranteed - โ Remove the
PostgreSQL
module and maintain it in a separate 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 changesCoroutine\MySQL->fetch/nextResult
is optimized for on-demand reads, which will trigger IO scheduling- When the
defer
attribute is on, the request ofstatement
needs to usestatement->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 theIO
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 byPHP
string orfopen("memory")
- ๐ The
Lock
module will be discarded. Reason for discarding: There may be problems with locking in the Coroutine. You can useChan
to implement the Lock of the Coroutine version - Since async
stream_socket_pair
is introduced, it is recommended to enable the hook by flagSWOOLE_HOOK_STREAM_FUNCTION
instead ofSWOOLE_HOOK_STREAM_SELECT
๐ New features
- โ Added Library, using pure
PHP
to write kernel functions instead ofC/C++
, providing the following features- Added high quality
PHP
moduleCoroutine\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 callRuntime::enableCoroutine(SWOOLE_HOOK_CURL)
to open (@matyhtf) (@Yurunsoft) - Use
PHP
code to implementexec
/shell_exec
of Coroutine version (#2657) (@Yurunsoft) - When
RuntimeHook
is turned on, the functionarray_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 high quality
- 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
byphp.ini
. For details, see preemptive_scheduler (@shiguangqi) - โ Added
Timer::list()
to getTimer\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
andsetOption
forCoroutine\Socket
(9d13c29) (@matyhtf) - โ Added
$master_pid
property andshutdown
method toProcess\Pool
(a1d6eaa) (@matyhtf) - โ Added the 4th parameter of the constructor of
Process\Pool
, when true, the underlying layer will automatically create the Coroutine in theonWorkerStart
callback (8ceb32c) (@matyhtf) - Support non-blocking
stream_socket_pair
in Runtime hook (#2546) (@matyhtf) - ๐ Added
static_handler_locations
setting ofHttp\Server
to set static file path (@matyhtf) - โ Added
Coroutine\Http\Client->setBasciAuth
method to automatically sendAuthorization
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 (nowfetch
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
- The underlying programming mode using
Coroutine\Redis
compatibility mode, enabled by$redis->set(['compatibility_mode' => true])
, which can make the result ofhmGet/hGetAll/zRange/zRevRange/zRangeByScore/zRevRangeByScore
consistent with phpredis (#2529) (@caohao-php)- 0๏ธโฃ Now
100K
Coroutine are allowed to exist at the same time by default (c69d320) (@twose) - ๐ Support
bailout
(can exit the process correctly when a fatal error occurs in the Coroutine) (#2579) (@twose) Server
can display a friendly400/404/503
when error occurred (@matyhtf) (f3f2be9)Server
enablereload_async
andsend_yield
by default (#2555) (9d4a4c4) (@matyhtf)Server->onFinish
callback is in Coroutine (@twose)- 0๏ธโฃ
Coroutine\Http\Client
enablewebsocket_mask
by default
(c02f4f8) (@twose) - โฑ Scheduling operation of
Channel
outside the Coroutine is no longer allowed (519b604) (@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 (4b833a3) (@matyhtf) - Memory optimization of
Socket->recv
(642a355) (@twose) - Floating point calculation optimization (#2572) (@tangl163)
- All built-in classes prohibit cloning/serializing/unseting-declared-properties (f9c974b) (@twose)
- โ
Server->bind
will generate a warning and return false whenuid
is more thanUINT32_MAX
- ๐ Support
PHP7.4
(#2506) (@twose)
๐ Fixed
- ๐ Fixed
getProcess
ofProcess\Pool
(#2522) (@matyhtf) - ๐ Fixed a bug that exceptions were ignored in some special cases (@twose)
- ๐ Fixed memory leak by timer after
fork
process (8f3abee) (@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) (22504dd) (@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 ?
- โ Added
Swoole\Coroutine\Scheduler
class as the entry for thecli
script, replacinggo() + Swoole\Event::wait()
โ Added
Swoole\Coroutine\Run
function to provide wrapper forSwoole\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 based on webmozart/assert secondary development (@twose)
- ๐ Completely abolish the
Windows
support plan - ๐จ
Coroutine\Http2\Client
refactor (f64874c) (@matyhtf) - The faster callback function caller (@twose)
Experimental content
- May add
Coroutine\Server
andCoroutine\Http\Server
in5.0
- ๐ Consistent with