繁体   English   中英

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

[英]cronjob executing a script with around 100 curl url's - bad practice?

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

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

确保脚本没有超时,因此请通过BASH或其他方式(而不是通过服务器(Apache,NGINX等))运行脚本。

另外:确保您的curl命令等待足够长的时间,查找curl规格。

https://unix.stackexchange.com/questions/94604/does-curl-have-a-timeout/94612

最后:如果百分之一出现问题,请确保您不会出错。

如果您可以合理地满足/解决这3个可能的问题,我认为您应该可以。 (我总是将输出发送到我自己的邮件中,以保持关注)

关于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接口

正如curl的文档所解释的,多接口(与“简单”接口相反)

在同一线程中启用多个同时传输,而不会使应用程序变得复杂...

我的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(我怀疑您已经在这样做)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM