使用PHP curl下载许多网页



我正在构建一个PHP应用程序,该应用程序的数据库包含大约140个URL。

目标是下载这些网页内容的副本。

我已经编写了从数据库中读取URL的代码,然后使用curl获取页面的副本。然后,它获取<body> </body>之间的所有内容,并将其写入一个文件。它还考虑了重定向,例如,如果我转到一个URL,并且响应代码是302,它将遵循适当的链接。到目前为止还不错。

对于许多URL(可能20个左右),这一切都可以正常工作,但由于max_execution_time设置为30秒,我的脚本超时了。我不想推翻或增加这一点,因为我觉得这是一个糟糕的解决方案。

我想了两种解决方法,但我想知道这些方法是好是坏,或者是否有更好的方法。

第一种方法是对数据库查询使用LIMIT,这样它一次将任务拆分为20行(即,如果有140行,则单独运行脚本7次)。我从这种方法中了解到,它仍然需要调用脚本download.php 7次,因此需要传入LIMIT数字。

第二种方法是使用一个脚本,在该脚本中,我传入我想要URL的每个单独数据库记录的ID(例如download.php?id=2),然后对它们执行多个Ajax请求(download.php?id=2, download.php?id=3, download.php?id=4等)。基于$_GET['id'],它可以进行查询以在数据库中找到URL等。理论上,我会进行140个单独的请求,因为每个URL设置1个请求。

我读过其他一些关于排队系统的帖子,但这些都超出了我的知识范围。如果这是最好的方法,那么是否有一个特定的系统值得一看?

编辑

目前有140个URL,而且随着时间的推移,这个数字可能还会增加。因此,我正在寻找一种解决方案,它可以在不超过任何超时限制的情况下进行扩展。

我不同意你的逻辑,如果脚本运行正常,需要更多的时间来完成,只要给它更多的时间,这不是一个糟糕的解决方案。你的建议会使事情变得更加复杂,如果你的url增加,也不会很好地扩展。

我建议将您的脚本移动到没有时间限制的命令行,并且不要使用浏览器来执行它

当您有一个未知列表时,异步调用将花费未知的时间。

将您的脚本拆分为单页下载(就像您提议的download.php?id=X)。

从"main"脚本获取数据库中的列表,对其进行迭代,并为每个列表向脚本发送ajax调用。由于所有呼叫都将同时启动,请检查您的带宽和CPU时间。您可以使用成功回调将其分解为"X活动任务"。

您可以将download.php文件设置为返回成功数据,也可以将其保存到具有网站id和调用结果的数据库中。我建议稍后使用,因为您可以离开主脚本,稍后再获取结果。

你不能无限期地增加时间限制,也不能无限期的等待时间来完成请求,所以你需要一个"fire-and-forget",这就是异步调用的最佳效果。

正如@apokryfos所指出的,根据这种"备份"的时间,您可以将其放入任务调度程序(如chron)中。如果你称之为"随需应变",把它放在gui中,如果你称它为"每x次",把一个chron任务指向主脚本,它也会这样做。

您所描述的内容听起来像是控制台的工作。浏览器是给用户看的,但你的任务是程序员要运行的,所以使用控制台。或者安排文件与cron作业或开发人员处理的任何类似作业一起运行。

使用stream_socket_client()同时执行所有请求。将所有套接字ID保存在一个数组中

然后使用stream_select()遍历ID数组以读取响应

这几乎就像PHP中的多任务处理。

最新更新