3

经过几天的尝试,我当然不能自己解决这个问题。这就是问题:

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

PHP 正在执行非常主动的爬取,返回大量的 URL 数组,每个 URL 都需要在 HTML 中实时显示,一旦 PHP 捕获它,这就是我们使用 Ob_flush() 和 flush 方法来回显和打印的原因我们一拿到数组就可以了。

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

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

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

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

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

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

任何帮助都会非常感激。提前致谢!

4

5 回答 5

3

尝试网络套接字。

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

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

看到这个使用 Socket.io 的 PHP

于 2012-09-14T21:00:38.250 回答
0

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

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

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

编辑:当做很多 MySQL 插入时,你可以做几件事来加速它。这里有一个很好的答案,详细说明了它们。简而言之,使用 MyISAM,并在单个查询中输入尽可能多的行(在 PHP 中有一个缓冲区数组,您可以将 URL 添加到其中,当它已满时,将整个缓冲区插入一个查询中)。

于 2012-09-14T20:59:04.980 回答
0

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

您写为 rec1、rec2、rec3 的每个键

您还存储一个 current_min 和一个 current_max

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

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

如果记录可用,它们会立即发送。

每当客户端收到更新或连接终止时,它们会立即开始一个新的请求......

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

于 2012-09-14T21:11:13.430 回答
0

网络套接字的替代品是 COMET

我写了一篇关于这个的文章,以及描述我的经历的后续文章。

根据我的经验,COMET很快。Web 套接字绝对是未来,但如果您只需要完成它,您可以在一小时内启动并运行 COMET。

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

于 2012-09-14T21:18:13.710 回答
0
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 

当列表更新时,它会自动更新自己。就像一个带有 js 的 cronjob 。

第二种方式,如果你说我在处理时无法输出,所以我认为使用数据插入到 mysql 是没有意义的,使用 MongoDb 等来提高速度。顺便说一句,您将使用您的密钥达到您需要的内容,并且永远不会重复插入的值。

于 2012-09-14T21:30:42.140 回答