以下是我正在做的事情的简要概述,它非常简单:
出去从数据库表中获取记录.
遍历所有这些记录,并且每个包含URL的列都会出去(使用cURL)并确保URL仍然有效.
对于每个记录,使用当前时间戳更新列,该时间戳指示上次检查的时间以及发生的其他数据库处理.
无论如何,这一切都运作良好,并且完全符合预期.问题是我认为在使用cURL验证URL的方式方面,性能可以大大提高.
以下是我的代码中的简短(简化)摘录,演示了如何使用cURL:
$ch = curl_init(); while($dbo = pg_fetch_object($dbres)) { // for each iteration set url to db record url curl_setopt($ch, CURLOPT_URL, $dbo->url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_exec($ch); // perform a cURL session $ihttp_code = intval(curl_getinfo($ch, CURLINFO_HTTP_CODE)); // do checks on $ihttp_code and update db } // do other stuff here curl_close($ch);
正如您所看到的那样,我只是在整个时间内重复使用相同的cURL句柄,但即使我在处理过程中(数据库或其他方式),脚本仍然需要很长时间才能运行.更改任何cURL选项有助于提高性能吗?调整超时值/等?任何输入将不胜感激.
谢谢,
尼古拉斯
slacy.. 9
将CURLOPT_NOBODY设置为1(请参阅curl文档)告诉curl不要求响应的正文.这将联系Web服务器并发出HEAD请求.响应代码将告诉您URL是否有效,并且不会传回大部分数据.
如果这仍然太慢,那么通过运行N个线程(或进程),每个执行1/N的工作,您可能会看到很大的改进.瓶颈可能不在您的代码中,而是在远程服务器的响应时间内.如果它们响应缓慢,那么你的循环运行起来会很慢.
将CURLOPT_NOBODY设置为1(请参阅curl文档)告诉curl不要求响应的正文.这将联系Web服务器并发出HEAD请求.响应代码将告诉您URL是否有效,并且不会传回大部分数据.
如果这仍然太慢,那么通过运行N个线程(或进程),每个执行1/N的工作,您可能会看到很大的改进.瓶颈可能不在您的代码中,而是在远程服务器的响应时间内.如果它们响应缓慢,那么你的循环运行起来会很慢.