我正在尝试以非阻塞方式将大量数据(~250K)写入流。
抽象出复杂性和对象结构,这就是我正在运行的:
$fp = fsockopen('host', 80);
socket_set_blocking( $fp, false );
fwrite( $fp, $string, $length ); // Where $string is a 250K string
然而,数据并没有全部被写入。假设这是 PHP 的写入缓冲区开始发挥作用,我设置stream_set_write_buffer( $fp, 0 )
了但这也没有解决问题。
我将我的 fwrite 分成 4096B 的块——看起来客户端发送了 3 个完整的批次(4096 字节)和第四批次的 ~1500B。对 fwrite 的任何和所有连续调用都返回写入的 0 个字节。
有谁知道如何将这些数据排队以非阻塞方式发送出去?如果我删除socket_set_blocking( $fp, false );
- 一切正常。很明显,异步运行它是一个问题。
你怎么认为?套接字扩展在这里有帮助吗?它是否以不同的方式处理缓冲区?
注意:出于各种原因,我有意编写此套接字传输层以避免使用 curl。使用curl_multi()
不是一种选择。