典型的 PHP 套接字功能是同步的,并在等待传入的连接和数据时暂停线程。 (例如 socket_read
和 socket_listen
)
如何异步执行相同的操作?这样我就可以在数据接收事件中响应数据,而不是轮询数据等。
最佳答案
是的,这就是 socket_set_nonblock()
的用途。考虑到错误代码 11、EWOULDBLOCK
和 115、EINPROGRESS
假定的特殊含义,您的套接字交互代码需要以不同的方式编写。
根据要求,这里有一些来自 PHP 同步套接字轮询循环的虚构示例代码:
$buf = '';
$done = false;
do {
$chunk = socket_read($sock, 4096);
if($chunk === false) {
$error = socket_last_error($sock);
if($error != 11 && $error != 115) {
my_error_handler(socket_strerror($error), $error);
$done = true;
}
break;
} elseif($chunk == '') {
$done = true;
break;
} else {
$buf .= $chunk;
}
} while(true);
关于php - PHP 可以异步使用套接字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1432477/