Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 捕获事件的进程间推送_Php_Ajax_Events_Polling - Fatal编程技术网

Php 捕获事件的进程间推送

Php 捕获事件的进程间推送,php,ajax,events,polling,Php,Ajax,Events,Polling,我有一个基于php的web应用程序,可以捕获数据库表中的某些事件。它还具有捕获事件的可视化功能:一个html表,列出由ajax控制的事件 我想添加一个可选的“实时”功能:按下按钮(“打开”)后,从该时刻开始捕获的所有事件都将插入到已经可见的表中。必须发生三件事:注意事件、获取事件数据并将其插入表中。为了使服务器负载保持在合理的范围内,我不想用ajax请求轮询新事件,相反,我更喜欢长轮询策略 这显然是一个问题,当执行一个长轮询ajax调用时,服务器的对等方必须监视一个事件。由于事件是由php脚本注

我有一个基于php的web应用程序,可以捕获数据库表中的某些事件。它还具有捕获事件的可视化功能:一个html表,列出由ajax控制的事件

我想添加一个可选的“实时”功能:按下按钮(“打开”)后,从该时刻开始捕获的所有事件都将插入到已经可见的表中。必须发生三件事:注意事件、获取事件数据并将其插入表中。为了使服务器负载保持在合理的范围内,我不想用ajax请求轮询新事件,相反,我更喜欢长轮询策略

这显然是一个问题,当执行一个长轮询ajax调用时,服务器的对等方必须监视一个事件。由于事件是由php脚本注册的,因此如果不再次轮询数据库以进行更改,就无法轻松地注意到该事件。这是因为捕获操作在观察长轮询请求之外的另一个进程中运行。我环顾四周,寻找一种用于进程间通信的可用机制,正如我从linux下的富客户机中了解到的那样。事实上,有针对信号量、共享内存甚至posix的php扩展。然而,它们都只存在于linux(或类unix)系统下。虽然不典型,但在极少数情况下,该应用程序可能会在MS Windows系统下使用


因此,我的简单问题是:在所有(大多数)系统上,是否有任何方法可以将此类事件推送到为长轮询ajax请求提供服务的php脚本?不经常轮询文件或数据库的东西,因为我在别处已经有事件了

因此,最初的警告是:如果不做一些“特殊”的事情,尝试使用香草PHP进行长时间轮询将耗尽资源,直到您杀死服务器

下面是一个很好的基本指南,介绍了基于PHP的基本长轮询,以及与走“简单”道路相关的一些挑战:

就真正跨平台(并且开始时足够简单)执行此操作而言,您可能需要退回到某种简单的内部轮询——但目标应该是确保此操作的成本比客户端轮询低得多

一种方法是将其本质上视为缓存数据库调用(现在就是这样),并使用一些标准缓存方法。从APC到memcached,再到轮询一个文件,所有这些对服务器的负载都可能比让客户端每秒设置并断开一个连接要少。让一个进程将数据放置在正确的键中,然后定期在脚本中轮询它们

下面是对各种缓存选项的一个很好的概述,这些选项对于您来说可能已经足够跨平台了:

一旦达到了这种方法的极限,无论如何,您可能必须转移到不同的服务器体系结构上