PHP,暂停脚本执行,直到另一个正在运行的脚本发出事件信号?

时间:2011-02-04 03:16:15

标签: php events notifications libevent waitforsingleobject

我想要一个PHP脚本等待在执行另一个脚本期间发送的事件。

用户A和用户B都是我网站的访问者。当用户A访问index.php时,页面开始执行但直到用户B也访问index.php才返回。 (该页面仅在两个用户连接到Web服务器时显示,例如:两个警卫同时通过转动钥匙打开保险箱。)

实现此目的的一种方法是使index.php暂停执行,直到收到其他用户访问index.php的通知为止。

为此,我看了

  1. 的libevent;但它似乎不允许在信令期间发送“ID”或“字符串”。
  2. 来自pear的Event_Dispatcher;但它不能在“脚本之间”工作。
  3. PHP共享内存函数;但似乎无法等到内存发生变化。

4 个答案:

答案 0 :(得分:3)

您可能不希望PHP脚本完全暂停。用户有点只是坐在那里认为页面冻结。相反,我会使用AJAX将USER-A的状态保存在数据库中,然后使用AJAX再次检查USER-B是否也保存了状态。想法是让AJAX在后台静默检查USER-B的状态。当它确实检测到登录时,让你的回调函数对页面执行操作!

答案 1 :(得分:1)

使用sleep和db怎么样?

客户端1登录,PHP插入“等待条目”,然后以设定的间隔(可能使用time_nanosleep)轮询数据库,以查找标记为“完成”的内容。
客户端2登录后,PHP更新“等待条目”以将其设置为“完成” 客户1看到流程已经完成,就会以愉快的方式进行。

如果您没有数据库,可以使用简单的临时文件来完成。

答案 2 :(得分:1)

在“等待”请求的代码(用户A)中,创建一个绑定到本地主机地址和端口的新侦听套接字(http://php.net/manual/en/sockets.examples.php),该地址和端口不会与其他任何内容冲突(例如,127.12。 34.56端口7890)然后通过调用socket_accept等待连接。如果已经有一个请求在该状态中等待,则这将失败,否则它将在那里等待连接。

在“信令”请求(用户B)中,创建一个新套接字,并连接到您的侦听套接字。等待用户A的请求的PHP处理程序将立即从它被阻止的socket_accept调用返回,您可以继续。如果您需要在两者之间传递任何消息,您只需在套接字中读取和写入消息即可。

这是为聊天室和显示服务器发送事件的通知页等应用程序执行的一项非常常见的任务。这种方法比轮询方法有一些优点,轮询方法一直在调用sleep并在循环中检查数据库或文件(或者在JavaScript循环中将许多请求返回给服务器):

- 它不会创建不必要的HTTP请求或数据库查询或消耗资源和网络流量的CPU循环

- 当触发事件没有任何延迟时立即动作

- 它不依赖于数据库或文件

主要缺点是您的PHP必须具有打开套接字并连接到它们的权限,这在共享托管环境中通常不是这样。

有关示例,请参阅https://gist.github.com/root9b/e1f0b82769296b06c079e53c7362bb94

答案 3 :(得分:0)

你正在寻找守护进程,有一些信息如何创建:

http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/