swoole提供了swoole_event_add函数,可以实现异步。此功能可在服务器或客户端模式下使用。swoole_event_add属于AsyncIO,必须在CLI模式下运行。异步tcp客户端stream_socket_client实现tcp同步客户端示例:$sock,swoole_process->$pipe或者其他fdstream资源是stream_socket_client/fsockopen创建的资源ckets资源是由sockets扩展中的socket_create创建的资源。需要在编译时加上/configure--enable-socketsobject,swoole_process或swoole_client,底层自动转为pipe或client-connectedsocket。多个tcp客户端实时交互。比如已经实现了异步tcp客户端,接下来的例子会比较复杂:可以在客户端A上输入,客户端B可以实时接收,反之亦然。首先,我们创建一个tcp_server:swoole_tcp_server.phpon('Start',function(){echo"Tcpserverstart.Waiting客户端...\n";});$serv->on('Connect',function($serv,$fd){echo"Newclientfd:{$fd}.\n";});$serv->on('Receive',function($serv,$fd,$from_id,$data){echo"Recvmsgfromfd:{$fd}:{$data}\n";foreach($serv->connections作为$client){if($fd!=$client){$serv->send($client,$data);}}});$serv->on('关闭',function($serv,$fd){echo"Clientfd:{$fd}closed.\n";});$serv->start();然后实际现客户端:event_add_tcp_client.phpon("connect",function(swoole_client$cli){});$client->on("receive",function(swoole_client$cli,$data){echo"Receive:$data";$cli->send(str_repeat('A',100)."\n");睡眠(1);});$client->on("error",function(swoole_client$cli){echo"error\n";});$client->on("close",function(swoole_client$cli){echo"连接关闭\n";});$client->connect('127.0.0.1',9001);还有一个swoole实现的tcp/udp同步阻塞客户端:$client=newswoole_client(SWOOLE_SOCK_TCP);if(!$client->connect('127.0.0.1',9001,-1)){exit("connectfailed.错误:{$client->errCode}\n");}$client->send("helloworld\n");echo$client->recv();$client->close();swoole_client函数原型:swoole_client->__construct(int$sock_type,int$is_sync=SWOOLE_SOCK_SYNC,string$key);可以使用swoole提供的宏来指定类型,参考swoole常量定义$sock_type来表示socket的类型,如TCP/UDP使用$sock_type|SWOOLE_SSL启用SSL加密。$is_sync表示同步阻塞或异步非阻塞。默认是同步阻塞。$key用作长连接的密钥。默认情况下,IP:PORT用作密钥。具有相同密钥的连接将被重用在php-fpm/apache环境中只能使用同步客户端。异步客户端只能在cli命令行环境下使用。异步http客户端curl或file_get_contents同步发送http请求并阻塞。基于swoole_event_add包可以实现异步。swoole_event_add实现异常http客户端event_add_http_client.phphttp($url,$method,$postfields,$headers);$worker->write($response);},true);$进程->开始();//异步读取swoole_event_add($process->pipe,function($pipe)use($process){$response=$process->read();//print_r($response);if(is_callable($this->callback)){call_user_func($this->callback,$response);//回调}swoole_event_del($pipe);});}publicfunctionsetCallback($callback){$this->callback=$callback;}/***http请求*/privatefunctionhttp($url,$method,$postfields=NULL,$headers=array()){try{$ssl=stripos($url,'https://')===0?真假;$ci=curl_init();/*卷曲设置*/curl_setopt($ci,CURLOPT_USERAGENT,@$_SERVER['HTTP_USER_AGENT']);//在HTTP请求中包含一个“User-Agent:”头字符串curl_setopt($ci,CURLOPT_CONNECTTIMEOUT,30);curl_setopt($ci,CURLOPT_TIMEOUT,30);curl_setopt($ci,CURLOPT_RETURNTRANSFER,TRUE);curl_setopt($ci,CURLOPT_ENCODING,"");如果($ssl){curl_setopt($ci,CURLOPT_SSL_VERIFYPEER,0);//检查认证证书的来源curl_setopt($ci,CURLOPT_SSL_VERIFYHOST,2);//从证书中判断SSL加密算法是否存在}curl_setopt($ci,CURLOPT_HEADER,FALSE);开关($ci,CURLOPT_HEADER,FALSE);方法){case'POST':curl_setopt($ci,CURLOPT_POST,TRUE);如果(!empty($postfields)){curl_setopt($ci,CURLOPT_POSTFIELDS,$postfields);}休息;}curl_setopt($ci,CURLOPT_URL,$url);curl_setopt($ci,CURLOPT_HTTPHEADER,$headers);curl_setopt($ci,CURLINFO_HEADER_OUT,TRUE);$回应=curl_exec($ci);$httpCode=curl_getinfo($ci,CURLINFO_HTTP_CODE);$httpInfo=curl_getinfo($ci);如果(FALSE===$response)thrownewException(curl_error($ci),curl_errno($ci));}catch(Exception$e){抛出$e;}//echo'
';//var_dump($response);//var_dump($httpInfo);curl_close($ci);返回$响应;}}$client=newHttpClient('http://www.52fhy.com/test.json');$client->setCallback(function($response){print_r($response);});echo"OK\n";运行:$phpevent_add_http_client.phpOK{"url":"http://52fhy.com"}[从返回结果可以看出客户端请求是异步执行的swoole_http_clientswoole也内置了http异步客户端(swoole>=1.8.0)。与curl、file_get_contents等PHP提供的Http客户端相比,swoole_http_client最大的优势在于支持大量并发。file_get_contents只能同时请求一个URL,并发只能通过开启多进程来实现。curl提供了curl_multi函数来实现基于select和多线程的并发。并发性很差。swoole_http_client是一个基于epoll的异步客户端。它没有并发限制,可以在一个进程中并发发送数万个请求。有关更多详细信息,请参阅swoole文档。示例:get:$cli=newswoole_http_client('www.52fhy.com',80);$cli->setHeaders(['User-Agent'=>"swoole"]);$cli->get('/test.json',function($cli){echo$cli->body;});echo"ok\n";输出:ok{"url":"http://52fhy.com"}post:$cli=newswoole_http_client('127.0.0.1',81);$cli->post('/post_demo.php',array("a"=>'1234','b'=>'456'),function($cli){echo"长度:".strlen($cli->body)."\n";echo$cli->body;});echo"ok\n";websocket:on('message',function($_cli,$frame){//var_dump($frame);echo$frame->data;});$cli->upgrade('/',function($cli){$cli->push("你好世界");});echo"确定\n";发送后客户端会立即关闭。参考1.swoole_event_addhttps://wiki.swoole.com/wiki/...2.客户端https://wiki.swoole.com/wiki/...3.使用swoole_process和eventloop实现php异步编程https://segmentfault.com/a/11...4、swoole_process使用的一些疑惑https://group.swoole.com/ques...5、swoole多进程运行https://blog.csdn。网/koastal...6。swoole教程第一节:进程管理模块(Process)-中(消息队列)https://segmentfault.com/a/11...7。PHP编程尝试程序并发的几种方法总结http://www.jb51.net/article/8...8,1.8.0使用内置Http异步客户端https://wiki.swoole.com/wiki/...9、异步Http/WebSocket客户端https://wiki.swoole.com/wiki/...