我正在构建一个包含大约140个URL的数据库的PHP应用程序。使用PHP curl下载许多网页
目标是下载这些网页内容的副本。
我已经编写了从我的数据库中读取URL的代码,然后使用curl来获取页面的副本。然后它获取<body> </body>
之间的所有内容,并将其写入文件。它还考虑到重定向,例如如果我转到一个URL并且响应代码是302,它将遵循适当的链接。到现在为止还挺好。
这一切都适用于一些网址(也许20左右),但然后我的脚本超时由于max_execution_time
设置为30秒。我不想重写或增加这个,因为我觉得这是一个糟糕的解决方案。
我想到了2个解决方法,但想知道这些是好还是坏的方法,或者如果有更好的方法。
第一种方法是在数据库查询上使用LIMIT
,以便一次将任务分成20行(即如果有140行,则分别运行脚本7次)。我从这个方法中明白,它仍然需要调用script,download.php,7个不同的时间,所以需要通过限制数字。
第二种方法是在脚本中传入我想要的URL(例如download.php?id=2
)的每个数据库记录的ID,然后对它们执行多个Ajax请求(download.php?id=2, download.php?id=3, download.php?id=4
等)。基于$_GET['id']
它可以做一个查询来查找数据库中的URL等。理论上我会做140个单独的请求,因为它是每个URL设置1个请求。
我读过一些其他指出排队系统的帖子,但这些都超出了我的理解。如果这是最好的方法,那么是否有一个值得一看的特定系统?
任何帮助,将不胜感激。
编辑:目前有140个网址,而且这个网址可能会随着时间推移而增加。所以我正在寻找一种解决方案,可以在没有超时限制的情况下进行扩展。
更改max_execution_time可能是最好的解决方案,因为您确实不知道要花费多长时间才能抓取140页,或者服务器是否会滞后,并使某些请求比其他请求花费更长的时间。 – Brogan
延长超时并不是一个糟糕的解决方案。使用['set_time_limit(30)'](http://php.net/manual/en/function.set-time-limit.php)循环的每个步骤(或任何对于单个页面合理的)。这是一个合理的说法,“我将允许每CURL呼叫X秒”。 – apokryfos
我会用ajax调用方法。所以你可以抓住数据库中的所有记录,迭代它发送ajax调用,然后在完成时报告。接收到调用(并进行工作)的脚本可能会报告并说出如下内容:“X中的X已完成,Y中有错误” – LordNeo