PHP在Windows上命名管道

时间:2011-08-18 23:36:40

标签: php windows named-pipes

好的,这是场景。假设我有一个PHP脚本应该等待某些信息可用,我认为如果我可以使这个脚本块而不是繁忙的循环,直到该信息可用,这将是一个很好的解决方案。信息本身将由另一个php脚本实例提供。并且假设我想要阻止X个这样的请求,直到脚本的这个实例传递此信息。 我想我可以使用命名管道,读取器进程将阻止等待管道写入,并且编写器将通过管道或其他方式提供所需的信息来编写并立即解锁所有读取器。 我找到了posix_mkfifo,但它在Windows上无法正常工作,有没有其他方法可以在windows和* nix上工作。 或者也许有一种方法可以让一堆请求阻塞,并且可以用另一个请求“一次”将它们“释放”。 我真的不想求助于繁忙的循环,我想在没有使用1秒延迟和sutch的情况下节省cpu。

1 个答案:

答案 0 :(得分:2)

如果您有套接字扩展可用(或stream_socket_server()),您可以在脚本中创建一个套接字服务器,为其他脚本提供信息 - 让我们将该脚本称为“主”。然后,您可以拥有要阻止的所有脚本 - “从属” - 对{local}进行fsockopen(),然后对其进行设置,以便fgets()fwrite()等阻塞,直到数据通过这些套接字提供。

这不是最有效的方法,因为您必须将IPC分配到TCP堆栈,但如果您希望它在Windoze上工作,则不能使用* nix域套接字,这就是您所坚持的。

我能想到的唯一可以做的是涉及临时文件和flock()的事情,因为默认情况下它会阻塞直到它可以获得锁定。这可能是最便携的选项,因为flock()的行为自远古以来在任何地方都是相同的,但它也可能(并且可能不会)在作为ISAPI模块运行的PHP实例上工作(参见{{ 3}})。