cronjob执行带有约100个curl url的脚本-不良做法?

时间:2018-07-02 09:08:14

标签: php curl cron php-curl

我正在编写一个cron作业,它将执行一个脚本,该脚本最多可以加载100个网址,每个网址中的数据都会在执行时进行内存缓存。每个URL结束/加载的时间可能需要10秒到15分钟,每个URL从数据库加载数据并将结果返回为json并缓存结果。 该脚本的要点是在早上(00:00-最多缓存所有内容的时间)缓存结果数据,因此在早上人们不必等待数据再次缓存

URL是api URL。 curl是否会等待每次执行结束?这被认为是不良做法吗?到目前为止,还没有缓存,因此我正在尝试实现它,将最常用的url数据缓存24小时或类似时间。

2 个答案:

答案 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()
  • 设置URL和其他参数
  • 使用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(我怀疑你已经在做)。