Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.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
使用Javascript实时读取PHP数组的结果_Php_Javascript_Ajax_Real Time_Comet - Fatal编程技术网

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

使用Javascript实时读取PHP数组的结果,php,javascript,ajax,real-time,comet,Php,Javascript,Ajax,Real Time,Comet,经过几天的努力,我自己肯定解决不了这个问题。这就是问题所在: 我们需要在PHP文件中实时生成的屏幕(HTML)上显示信息。 PHP正在执行一个非常活跃的爬网,返回大量URL数组,每个URL需要在PHP捕获后立即以HTML实时显示,这就是为什么我们使用Ob_flush()和flush方法在获得数组后立即回显和打印数组 同时,我们需要以某种方式显示这些信息,以便用户可以在它工作时看到它(因为它可能需要一个多小时才能完成) 据我所知,使用AJAX不可能做到这一点,因为我们只需要发出一个请求并读取阵列中

经过几天的努力,我自己肯定解决不了这个问题。这就是问题所在:

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

PHP正在执行一个非常活跃的爬网,返回大量URL数组,每个URL需要在PHP捕获后立即以HTML实时显示,这就是为什么我们使用Ob_flush()和flush方法在获得数组后立即回显和打印数组

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

据我所知,使用AJAX不可能做到这一点,因为我们只需要发出一个请求并读取阵列中的信息。我也不完全确定comet是否可以这样做,因为它会在获得新信息后立即中断连接,而且阵列的大小确实在快速增加

此外,为了使事情更加复杂,实际上不需要打印或回显数组中的信息(URL),因为HTML文件包含在处理和生成需要显示的数组的同一文件的用户界面中

长话短说;我们需要在此处放置:

<ul>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    ...
</ul>
  • ...
在PHP循环中,在1000行以下的数组中生成并推送的URL的无休止的实时更新列表。

任何帮助都将不胜感激。
提前谢谢

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

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

如果URL的数量如此之多,以至于您无法在服务器上存储如此大的数据库(有人可能会问浏览器如何处理如此大的表!),那么您可以始终让输出最新记录的PHP脚本从数据库中删除这些记录

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

尝试web套接字

它们提供客户端和服务器之间的实时通信,并使用socket.io提供跨浏览器兼容性。它基本上提供与长轮询/comet相同的结果,但请求之间的开销较小,因此速度更快

在本例中,您将使用web套接字向客户机发送有关当前处理状态(或它正在执行的任何操作)的更新


请参见此

假设您使用了一个方案,其中PHP正在写入Memcached服务器

您编写的每个键都是rec1、rec2、rec3

您还可以存储当前_最小值和当前_最大值

您可以让用户不断使用ajax进行轮询。对于每个请求,它们都包含最后一个看到的键,称之为k。然后服务器返回从k到max的所有记录

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

如果记录可用,将立即发送

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


编写新记录只需插入max+1并增加min和max,其中max-min是要保持可用的记录数…

web套接字的替代方法是COMET

我写了这篇文章,并描述了我的经历

根据我的经验,彗星速度很快。Web套接字肯定是未来的发展方向,但如果您只需要完成它,您可以在一小时内启动COMET并运行它

这里肯定需要某种共享内存结构——可能是数据库中的内存临时表,或者是stephen建议的Memcached。

如果我是你,我会尝试用两种方法来解决这个问题。
If I were you , I try to solve this with two way .
First of all I encode the output part array  with json and with the setTimeout function with javascript I'll decode it and append with <ul id="appendHere"></ul> so 
首先,我使用json对输出部分数组进行编码,并使用javascript的setTimeout函数对其进行解码,然后使用
    进行追加
    当列表更新时,它将自动更新自身。就像js的cronjob

    第二种方法,如果你说我不能在处理过程中获取输出,那么 我认为,将数据插入mysql毫无意义,可以使用MongoDb等来提高速度。
    顺便说一句,您可以通过密钥获得所需的内容,并且永远不会复制插入的值。

    将PHP数组写入文件并用Javascript解析是否可行?您可以随时使用ajax创建文件,当PHP不断添加到文件中时,它将获得所有结果。嗨,Jon,非常感谢您的快速响应,这是一种很好的方法,我们已经在考虑这一点,但是这是不可能的,因为负载已经非常大了。我很好奇Socket是否适合你……我在这里受到了很多压力,不仅仅是发布链接作为答案,我建议你也这样做,解释为什么WebSocket比已经发布的答案更理想,你是对的,这是最好的解决办法……)我是fami