我试图以非阻塞的方式将大量数据(〜250K)写入流中。PHP Stream Write Buffer
抽象掉的复杂性和对象结构,这就是我运行:
$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_multi()
不是一个选项。
你应该使用'socket_select()'来找出套接字是否准备好写入。 –
由于文件限制问题,无法重新编译PHP而无法使用socket_select。 select()系统调用相对较差。 - 这是我唯一的选择吗? –
你是什么意思的文件限制问题?你有多少个插座? –