使用Javascript实时读取PHP数组的结果

时间:2012-09-14 20:52:33

标签: php javascript ajax real-time comet

经过几天的努力,我当然无法自己解决这个问题。这就是问题所在:

我们需要在PHP文件中实时生成的屏幕(HTML)上显示信息。

PHP正在执行非常活跃的抓取,返回大量的URL,每个URL都需要在HTML中实时显示,一旦PHP捕获它,这就是我们使用的原因Ob_flush()和flush方法在我们得到数组后立即回显和打印数组。

同时我们需要以某种方式显示此信息,以便用户在工作时可以看到它(因为它可能需要一个多小时才能完成)。

据我所知,使用AJAX是不可能完成的,因为我们只需要发出一个请求并读取数组中的信息。我不是完全确定是否彗星可以做这样的事情,因为它会在获得新信息后立即中断连接,并且阵列真的会迅速增加它的大小。

此外,只是为了使事情变得更复杂,没有必要打印或回显数组内的信息(URL),因为HTML文件被包含为正在处理和生成的同一文件的用户界面我们需要显示的数组。

长话短说;我们需要放在这里:

<ul>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    ...
</ul>

在PHP循环中生成并推送到数组内的URL的永不停止且实时更新的列表,下面1,000行。

任何帮助都会非常值得赞赏。 提前谢谢!

3 个答案:

答案 0 :(得分:3)

尝试使用网络套接字。

它们提供客户端和服务器之间的实时通信,并使用socket.io提供跨浏览器兼容性。它基本上给你与长轮询/彗星相同的结果,但是请求之间的开销更少,所以它更快。

在这种情况下,您将使用Web套接字向客户端发送有关处理当前状态(或其正在执行的任何操作)的更新。

请参阅此Using PHP with Socket.io

答案 1 :(得分:0)

我认为最好的方法是让第一个PHP脚本将每个记录保存到数据库(也许是MySQL或SQLite),然后使用第二个PHP脚本从数据库中读取并输出最新的记录。然后使用AJAX经常调用此脚本并添加它发送到表中的记录。您必须找到触发第一个脚本的方法。

javascript应该记录它已经拥有的最后一个url的id,并在AJAX请求中发送它,然后PHP可以选择id大于该值的所有行。

如果URL的数量如此之大,以至于您无法在服务器上存储大型数据库(可能会询问浏览器将如何应对这样大的表!)那么您可以始终拥有输出最新记录的PHP脚本也会从数据库中删除它们。

编辑:在进行大量MySQL插入时,您可以采取一些措施来加快速度。有一个很好的答案here详细说明了它们。简而言之,使用MyISAM,并在单个查询中输入尽可能多的行(在PHP中有一个缓冲区数组,您可以在其中添加URL,当它完整时,在一个查询中插入整个缓冲区)。

答案 2 :(得分:0)

假设您使用了PHP写入Memcached服务器的方案..

你写的每个键为rec1,rec2,rec3

您还存储了current_min和current_max

您让用户不断使用ajax进行轮询。对于每个请求,它们包括他们看到的最后一个密钥,请调用此k。然后,服务器将所有记录从k返回到最大

如果没有立即可用的记录,服务器进入等待循环最多,比如3秒,检查每100ms是否有新记录

如果记录可用,则立即发送。

每当客户端收到更新或连接终止时,他们会立即启动新请求......

编写新记录只需插入max + 1并递增min和max,其中max-min是您希望保持可用的记录数...