2011-08-18 72 views
2

好的,這裏的情況。比方說,我有一個應該等待某些信息可用的PHP腳本,並且我認爲這將是一個很好的解決方案,如果我可以製作此腳本塊而不是忙碌循環,直到該信息可用。信息本身將由另一個php腳本實例提供。並且可以說我希望X個這樣的請求阻塞,直到這個腳本的這個實例傳遞這個信息。 我想我可以使用命名管道,讀者進程將阻止等待管道寫入,並且作者將通過管道或其他方式提供所需的信息,並立即解鎖所有讀者。 我找到了posix_mkfifo,但它不能在Windows上工作,是否有任何其他方式來做到這一點,可以在Windows和* nix上工作。 或者也許有一些方法可以讓一堆請求被阻止,並且另一個請求是在他們的時間「設置它們自由」。 我真的不想訴諸繁忙的循環,我想不使用1秒的延遲和sutch來節省CPU。PHP在窗口上命名管道

+0

你的返回鍵發生了什麼?它是否因爲不需要而離開? :-P – DaveRandom

+0

你已經告訴我們你認爲問題的解決方案是什麼,但是如果你告訴我們問題可能會有更好的方法。 – 2011-08-18 23:43:06

回答

2

如果您有套接字擴展可用(或stream_socket_server()),您可以在腳本中爲其他腳本提供信息創建套接字服務器 - 讓我們將該腳本稱爲「主」。然後,您可以將所有要阻止的腳本 - 「奴隸」 - 對本地主機執行fsockopen(),然後將其設置爲使得fgets()fwrite()等會阻塞,直到數據通過這些套接字可用。

這不是最有效的方法,因爲您必須將IPC分配給TCP堆棧,但是如果您希望它在Windoze上工作,則不能使用* nix域套接字,所以這就是您堅持的。

我能想到的唯一可以做的事情是涉及臨時文件和flock(),因爲默認情況下它會阻塞,直到它可以獲得鎖定。這可能是最便攜的選擇,因爲flock()的行爲自遠古以來一直都是相同的,但它也可能不會(也可能不會)在作爲ISAPI模塊運行的PHP實例上工作(請參閱PHP manual)。