PHP可以异步使用套接字吗?

Rob*_*cks 20 php sockets scripting webserver asynchronous

典型的PHP套接字功能是同步的,并在等待传入连接和数据时停止线程.(例如.socket_readsocket_listen)

我如何异步地做同样的事情?所以我可以响应数据接收事件中的数据,而不是轮询数据等.

cha*_*aos 18

是的,这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);
Run Code Online (Sandbox Code Playgroud)

  • 不,它是异步的,基于轮询.代码来自更大的轮询机制.据我所知,PHP不支持像你要求的中断/信号驱动的套接字I/O事件.您可以使用不等待完成但立即返回的操作来实现异步通信,如果操作尚未就绪,则使用指示性错误代码.就像读取非阻塞套接字一样.在C中有很多关于异步套接字使用的教程,这些教程将详细介绍.PHP的支持只是标准C的一个层面. (3认同)