ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
swoole还提供了直接操作底层epoll/kqueue事件循环的接口。可将其他扩展创建的socket,PHP代码中stream/socket扩展创建的socket等加入到Swoole的[EventLoop](https://wiki.swoole.com/wiki/page/242.html)中。 swoole_event_add函数用于将一个socket加入到swoole的reactor事件监听中。 函数原型: ``` bool swoole_event_add(int $sock, mixed $read_callback, mixed $write_callback = null, int `$flags` = null); ``` - `$sock`支持文件描述符、stream资源、sockets资源。 - `$read_callback`为可读回调函数。 - `$write_callback`为可写事件回调。 - `$flags`为事件类型的掩码,可选择关闭/开启可读可写事件,如`SWOOLE_EVENT_READ`,`SWOOLE_EVENT_WRITE`,或者`SWOOLE_EVENT_READ | SWOOLE_EVENT_WRITE`。 在Server程序中使用,可以理解为在worker/taskworker进程中将此socket注册到epoll事件中。 在Client程序中使用,可以理解为在客户端进程中将此socket注册到epoll事件中。 示例: ``` php <?php $fp = stream_socket_client("tcp://www.52fhy.com:80", $errno, $errstr, 30); fwrite($fp, "GET / HTTP/1.1\r\nHost: www.52fhy.com\r\n\r\n"); swoole_event_add($fp, function($fp) { echo $resp = fread($fp, 1024); //socket处理完成后,从epoll事件中移除socket swoole_event_del($fp); fclose($fp); }); echo "Finish\n"; //swoole_event_add不会阻塞进程,这行代码会顺序执行 ``` 对比一下,下面这个会阻塞进程: ``` <?php $fp = stream_socket_client ( "tcp://www.52fhy.com:80" , $errno , $errstr , 30 ); if (! $fp ) { echo " $errstr ( $errno )<br />\n" ; } else { fwrite ( $fp , "GET / HTTP/1.1\r\nHost: www.52fhy.com\r\n\r\n" ); while (! feof ( $fp )) { echo fgets ( $fp , 1024 ); } fclose ( $fp ); } echo "Finish\n"; ```