好的,这里的情况。 比方说,我有一个PHP脚本,应该等待某些信息变得可用,我想这是一个很好的解决scheme,如果我可以使这个脚本块,而不是忙碌循环,直到信息变得可用。 信息本身将由另一个php脚本实例提供。 并且可以说我想要X个这样的请求阻塞,直到这个脚本实例传递这个信息。 我想我可以使用命名pipe道,读者进程将阻止等待pipe道被写入,作者将写入并通过pipe道或其他方式提供所需的信息,立即解锁所有的读者。 我发现posix_mkfifo,但它不能在Windows上工作,是否有任何其他的方式来做到这一点,可以在Windows和* nix的工作。 或者,也许有一些方法可以让一堆请求被阻塞,而另一个请求是一次性“设置它们自由”。 我真的不想诉诸繁忙的循环,我想不使用1秒的延迟和sutch备用CPU。
如果你有套接字扩展可用(或stream_socket_server()
),你可以在脚本中创建一个套接字服务器,将信息提供给其他脚本 – 让我们把这个脚本称为“主”。 然后你可以把你想要阻塞的所有脚本 – “奴隶” – 做一个fsockopen()
到localhost,然后设置它们,这样fgets()
, fwrite()
等将被阻塞,直到数据可用那些插座。
这不是最有效的方法,因为您必须将IPC分配给TCP堆栈,但是如果您希望它在Windoze上运行,则不能使用* nix域套接字,所以这就是您所坚持的。
唯一能想到的是你可以做的事情是涉及临时文件和flock()
,因为默认情况下它会阻塞,直到它可以获得一个锁。 这可能是最便携的选择,因为flock()
的行为自古以来就一直是相同的,但它也可能不会(也可能不会)作为ISAPI模块运行的PHP实例(参见PHP手册 )。