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";
```