我正在编写一个cron作业,它将执行一个脚本,该脚本最多可以加载100个网址,每个网址中的数据都会在执行时进行内存缓存。每个URL结束/加载的时间可能需要10秒到15分钟,每个URL从数据库加载数据并将结果返回为json并缓存结果。 该脚本的要点是在早上(00:00-最多缓存所有内容的时间)缓存结果数据,因此在早上人们不必等待数据再次缓存
URL是api URL。 curl是否会等待每次执行结束?这被认为是不良做法吗?到目前为止,还没有缓存,因此我正在尝试实现它,将最常用的url数据缓存24小时或类似时间。
答案 0 :(得分:1)
请确保您的脚本不会超时,因此请通过BASH或其他方式(而不是通过服务器(Apache,NGINX等))运行脚本。
另外:确保您的curl命令等待足够长的时间,查找curl规范。
https://unix.stackexchange.com/questions/94604/does-curl-have-a-timeout/94612
最后一次:如果100个问题中有1个不好,请确保您不会出错。
如果您可以合理地满足/解决这3个可能的问题,我认为您应该没问题。 (我总是将输出发送到我自己的邮件中,以保持关注)
答案 1 :(得分:1)
关于curl
集成...
curl是否会等待每次执行结束?
这取决于您如何使用curl库。您已经用'php'和'php-curl'标记了问题-看来您正在从PHP访问curl的例程。
如果您以类似以下方式使用curl的easy
界面:
$req = curl_init()
初始化一个简单的句柄curl_setopt()
curl_exec($req)
执行(单个)请求curl_close($req)
或curl_reset($req)
关闭或重置请求然后,自然地,您将必须等到每个请求完成后才能开始下一个请求。
替代方法是使用multi
接口(请参见下文)-该接口允许多个请求同时运行。
这被认为是不好的做法吗?
如果您发送大量的网络请求-每个请求都可能花费很长时间-我认为这肯定不是理想的选择。如果可能的话,最好使用curl的 multi 接口。
multi
界面正如curl's documentation所述,多界面(与“简单”界面相反)
在同一线程中启用多个同时传输,而不会导致应用程序复杂化...
我的PHP很弱,所以-我不会自己发布完整的示例-而是请您参考curl_multi_exec()
和相关功能的PHP文档。
不过,总之,您的想法是您仍然以相同的方式初始化curl句柄。 (PHP的文档没有明确提及这一点,但是有时将普通的卷曲句柄称为“简单”句柄-区别于“多”句柄。)
$req1 = curl_init();
$req2 = curl_init();
// Set URL and other options using `curl_setopt(...)`
(为简洁起见,我在这里省略了所有错误检查。)
但是,您无需创建curl_exec(...)
实例,而无需调用multi
$mh = curl_multi_init();
将easy
句柄添加到您新创建的multi
实例中,
curl_multi_add_handle($mh, $req1);
curl_multi_add_handle($mh, $req2);
然后(而不是为单个curl_exec()
句柄调用easy
)在循环中定期调用curl_multi_exec(...)
:
curl_multi_exec($mh, $running);
$running
变量将被更新,以指示是否仍在进行请求,因此-一旦$ running为false,您就可以退出循环并结束。
完成后,别忘了收拾东西。
curl_multi_remove_handle($mh, $req1);
curl_multi_remove_handle($mh, $req2);
curl_multi_cleanup($mh);
您可以使用一系列请求,而不是为每个请求使用不同的变量(如$req1
,$req2
等),或者可以从文本文件中加载相关的URL(我怀疑你已经在做)。