【发布时间】:2010-11-01 18:26:31
【问题描述】:
为什么会如此令人困惑。 PHP 的 fopen 不会打开文件进行读取,除非管道中有数据等待读取(根据this 注释)。 C 的 open 的 POSIX 规范指出,根据 O_NONBLOCK 标志的状态,当打开管道进行写入时,如果没有进程打开文件进行读取,open 将阻塞调用进程或返回错误。这种差异可以调和吗?
【问题讨论】:
-
对于这种情况,其他地方的人建议调用 bash 脚本将无用的数据写入管道,一旦打开完成就可以丢弃这些数据。我目前有 php 打开和关闭一个 C 线程来执行此读取,但由于读取处于循环中,每秒运行一次左右,我想尝试以正确的方式执行此操作,而不执行任何非常昂贵的操作就像线程创建一样。
-
this comment 有帮助吗? (本质上,做一个
fopen和r+所以你也是一个作家......) -
不幸的是,我仍然无法让它工作。打开文件后,我使用 stream_select 循环,直到收集到所有输入。我认为流选择可能永远不会返回,因为总是有一个作家对流句柄有一个打开的句柄,但是张贴者说他的流选择正常工作。我的流选择已决定从不进入其循环。
while(($ss = stream_select($r, $w = null, $e = null, 0, 5000)) !=0){read...} -
实际上我通过更彻底的测试发现r+方法根本不起作用。