当前位置: 首页 > 后端技术 > PHP

Swoolev4.6.0发布,支持原生curl协程客户端

时间:2023-03-29 15:46:50 PHP

Swoolev4.6.0发布,也是2021年的第一个版本更新。作为y版本发布,本次更新还包含不兼容的修改和许多新功能。我们来看看都有哪些变化?从版本v4.6.0开始,向后不兼容的更改将不再支持PHP7.1。PHP官方对PHP7.1的支持也于2019年底结束。MarkEvent::rshutdown()asdeprecated,请改用Coroutine\run之前的版本,如果直接在index.php中使用go创建协程go(function(){var_dump(Co\System::gethostbyname('www.baidu.com'));});这是正常的,但是在这个版本中,你会收到一个过时的警告PHPDeprecated:Swoole\Event::rshutdown():Event::wait()inshutdownfunctionisdeprecatedinUnknownonline0建议使用Coroutine\run而不是这个方法:Swoole\Coroutine\run(function(){var_dump(Co\System::gethostbyname('www.baidu.com'));});Swoole\Coroutine\run(function(){go(function(){var_dump(Co\System::gethostbyname('www.baidu.com'));});go(function(){var_dump(Co\System::gethostbyname('www.zhihu.com'));});});默认开启Coroutinehook使用上面提到的Coroutine\run之后,会有一个新变化:默认开启Coroutinehook,即自动设置SWOOLE_HOOK_ALLuseSwoole\Runtime;Swoole\Coroutine\run(function(){$flags=Runtime::getHookFlags();assert($flags===SWOOLE_HOOK_ALL);var_dump($flags);});当然你可以设置需要的flagsSwoole\Runtime;Runtime::setHookFlags(SWOOLE_HOOK_TCP);Swoole\Coroutine\run(函数(){$flags=Runtime::getHookFlags();断言($flags===SWOOLE_HOOK_TCP);var_dump($标志);});使用协程时禁用不安全函数,包括pcntl_fork/pcntl_wait/pcntl_waitpid/pcntl_sigtimedwaitSwoole\Coroutine\run(function(){$pid=pcntl_fork();var_dump($pid);});在这个版本中使用上面的示例代码,会得到一个Warning错误PHPWarning:pcntl_fork()hasbeendisabled为了安全起见,去掉了session_id的最大限制,服务器的session_id由int24改为int64,所以可以继续增加,不再重复之前的int24,session_id可以达到1600万左右,可能有重复的问题。NewAPI&enhancednativecurlcoroutineclient(SWOOLE_HOOK_NATIVE_CURL)这个版本最大的变化是支持nativecurlcoroutineclient,有什么用?用过SWOOLE_HOOK_CURL的朋友应该知道,这里有一些不受支持的选项,可能是因为某些SDK不兼容导致的错误,例如:PHPNotice:ObjectofclassSwoole\Curl\HandlercouldnotbeconvertedtointPHP警告:curl_multi_add_handle()expectsparameter2toberesource,objectgiven原因是hook之后的curl不再是资源类型,而是对象类型。如果出现这种问题,也建议联系SDK修改代码,因为curl在PHP8中不再是资源类型,而是对象类型,而经常使用的阿里云OSSSDK不支持SWOOLE_HOOK_CURL,以及你会遇到一些奇怪的事情。从v4.6.0版本开始,可以使用SWOOLE_HOOK_NATIVE_CURL代替SWOOLE_HOOK_CURL来解决上述问题。使用SWOOLE_HOOK_NATIVE_CURL需要在编译Swoole扩展时加上--enable-swoole-curl编译参数。启用该选项后,会自动设置SWOOLE_HOOK_NATIVE_CURL,关闭SWOOLE_HOOK_CURL。,SWOOLE_HOOK_ALL也会包含SWOOLE_HOOK_NATIVE_CURLpeclv4.6.0版本暂不添加该选项,请使用手动编译开启,下个版本添加。编译成功后使用--ri查看信息,可以看到curl-native$php--riswoole|grepcurlcurl-native=>enabled从下面的例子可以看出两者的区别($curl),(int)$curl);//PHP注意:类Swoole\Curl\Handler的对象无法转换为int//string(19)"Swoole\Curl\Handler"//int(1)});Swoole\Coroutine\run(function(){$curl=curl_init();var_dump($curl,(int)$curl);//resource(4)oftype(Swoole-Coroutine-cURLHandle)//int(4)});SWOOLE_HOOK_SOCKETS添加了对ext-sockets的支持。constN=8;$GLOBALS['时间']=[];$s=微时间(真);Swoole\Runtime::setHookFlags(SWOOLE_HOOK_SOCKETS);Swoole\Coroutine\run(function(){$n=N;while($n--){go(function(){$s=microtime(true);$domain='www.baidu.com';$sock=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);socket_connect($sock,$domain,80);socket_write($sock,"GET/HTTP/1.0\r\nHost:$domain\r\nConnection:close\r\nKeep-Alive:off\r\n\r\n");$html='';while(true){$data=socket_read($sock,8192);如果($data==''){中断;}$html.=$数据;}socket_close($sock);$GLOBALS['time'][]=microtime(true)-$s;});}});echo"Done\n";var_dump(microtime(true)-$s,array_sum($GLOBALS['time'])/3);支持Server事件回调函数传递对象式参数,即默认不启用通过设置event_object参数启用它。以下事件回调将使用对象样式onConnectonReceiveonCloseonPacketonPipeMessageonWorkerErroronTaskonFinish。以onConnect为例。详见文档回调对象$server->on('Connect',function(Swoole\Server$server,int$fd,int$reactorId){var_dump($fd);});$server->set(['event_object'=>true,]);$server->on('Connect',function(Swoole\Server$serv,Swoole\Server\Event$object){var_dump($object);});支持重复headers支持重复设置同一个$key的HTTPheader,$value支持多种类型,比如array,object,int,float,底层会进行toString转换,去掉尾部空格和换行符$http=newSwoole\Http\Server('0.0.0.0',9501);$http->on('request',function($request,$response){$response->header('测试值',["a\r\n",'d5678',"e\n",null,5678,3.1415926,]);$response->header('Foo',newSplFileInfo('bar'));});$http->start();$curl-Ihttp://127.0.0.1:9501HTTP/1.1200OKTest-Value:aTest-Value:d5678Test-Value:eTest-Value:5678Test-Value:3.1415926Foo:barServer:swoole-http-serverConnection:keep-aliveContent-Type:text/htmlDate:Wed,06Jan202105:16:17GMTContent-Length:39默认开启协程死锁检测,可以在协程中设置::set设置enable_deadlock_check在EventLoop终止后关闭,如果有协程死锁,底层会输出相关栈信息:=======================================================================[致命错误]:所有协程(计数:1)都在睡觉-死锁!===========================================================================[Coroutine-2]------------------------------------------------------------------#0Swoole\Coroutine::printBackTrace()在[@swoole-src/library/core/Coroutine/functions.php:74]调用#1Swoole\Coroutine\deadlock_check()#2curl_getinfo()calledat[/mnt/c/code/php/hyperf-skeleton/vendor/aliyuncs/oss-sdk-php/src/OSS/Http/RequestCore.php:492]更新日志以下是完整的更新日志。向下不兼容的更改删除了最大会话id限制,不重复(#3879)(@matyhtf)使用协程时禁用不安全的功能,包括pcntl_fork/pcntl_wait/pcntl_waitpid/pcntl_sigtimedwait(#3880)(@matyhtf)默认启用协程钩子(#3903)(@垫yhtf)删除了对PHP7.1的不支持(4a963df)(9de8d9e)(@matyhtf)过时标记Event::rshutdown()已弃用,改用Coroutine\run(#3881)(@matyhtf)添加API支持setPriority/getPriority(#3876)(@matyhtf)支持native-curlhook(#3863)(@matyhtf)(@huanghantao)支持服务端事件回调函数传递object-style参数,默认不传递object-style参数(#3888)(@matyhtf)支持hook套接字扩展(#3898)(@matyhtf)支持重复标头(#3905)(@matyhtf)支持SSLsni(#3908)(@matyhtf)支持hookstdio(#3924)(@matyhtf))支持stream_socket的capture_peer_cert选项(#3930)(@matyhtf)添加Http\Request::create/parse/isCompleted(#3938)(@matyhtf)添加Http\Response::isWritable(db56827)(@matyhtf)EnhanceServerAlltime精度由int改为double(#3882)(@matyhtf)检查swoole_client_select函数中poll函数的EINTR(#3909)(@shiguangqi)添加协程死锁检测(#3911)(@matyhtf)supportUseSWOOLE_BASEmodetoclosetheconnectioninanotherprocess(#3916)(@matyhtf)优化Servermaster进程与worker进程通信性能,减少内存拷贝(#3910)(@huanghantao)(@matyhtf)Fix当Coroutine\Channel被阻塞时,关闭时弹出其中所有数据(960431d)(@matyhtf)修复使用JIT时内存错误(#3907)(@twose)修复port->set()dtls编译翻译错误(#3947)(@Yurunsoft)修复connection_list错误(#3948)(@sy-records)修复sslverify(#3954)(@matyhtf)修复Table自增自减无法清除所有列的问题(#3956)(@matyhtf)(@sy-records)修复LibreSSL2.7.5编译失败(#3962)(@matyhtf)修复未定义常量CURLOPT_HEADEROPT和CURLOPT_PROXYHEADER(swoole/library#77)(@sy-records)内核默认忽略SIGPIPE信号(9647678)(@matyhtf)支持同时运行PHP协程和C协程(c94bfd8)(@matyhtf)添加get_elapsed测试(#3961)(@luolaifa000)添加get_init_msec测试(#3964)(@luffluo)