我正在构建一个PHP应用程序,其中包含一个包含大约140个URL的数据库。
目标是下载这些网页内容的副本。
我已编写代码,从我的数据库中读取网址,然后使用curl获取该网页的副本。然后它获取<body> </body>
之间的所有内容,并将其写入文件。它还考虑了重定向,例如如果我转到URL并且响应代码是302,它将遵循相应的链接。到目前为止一切都很好。
这一切都适用于许多网址(可能是20个左右),但由于max_execution_time
被设置为30秒,我的脚本会超时。我不想覆盖或增加这一点,因为我认为这是一个糟糕的解决方案。
我已经想过2种解决方法,但想知道这些是好/坏的方法,还是有更好的方法。
第一种方法是在数据库查询上使用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个网址,这可能会随着时间的推移而增加。因此,我正在寻找一种可以在不超出任何超时限制的情况下进行扩展的解决方案。
答案 0 :(得分:2)
我不同意你的逻辑,如果脚本运行正常并且需要更多时间才能完成,只需给它更多时间它不是一个糟糕的解决方案。你建议什么使事情变得更复杂,如果你的网址增加了。
我建议将脚本移动到没有时间限制且不使用浏览器执行的命令行。
答案 1 :(得分:1)
当你有一个未知的列表时,将花费不明的时间进行异步调用。
将您的脚本拆分为单页下载(就像您提议的那样,download.php?id=X
)。
从“main”脚本中获取数据库中的列表,迭代它并为每个脚本发送一个ajax调用脚本。由于所有呼叫都将立即触发,请检查您的带宽和CPU时间。您可以使用成功回调将其分解为“X活动任务”。
您可以将download.php
文件设置为返回成功数据,或者将其保存到具有网站ID和调用结果的数据库中。我建议使用后者,因为您可以离开主脚本并稍后获取结果。
你不能无限制地增加时间限制,不能无限期地等待完成请求,所以你需要“一见不醒”,这就是异步调用最好的。
正如@apokryfos指出的那样,根据这种“备份”的时间安排,你可以将其纳入任务调度程序(如chron)。如果你“按需”调用它,把它放在一个gui中,如果你“每隔x次”调用一个chron任务指向主脚本,它也会这样做。
答案 2 :(得分:0)
您所描述的内容听起来像是控制台的工作。浏览器供用户查看,但您的任务是程序员将运行的任务,因此请使用控制台。或者安排文件与cron-job或开发人员处理的任何类似的东西一起运行。
答案 3 :(得分:0)
使用stream_socket_client()同时执行所有请求。将所有套接字ID保存在数组中
然后使用stream_select()遍历ID数组以读取响应。
它几乎就像PHP中的多任务一样。