繁体   English   中英

如何将php cronjob分成几部分

[英]How to split php cronjob into parts

有一个PHP脚本。 它从外部API获取数据并导入(更新/删除)数据到WordPress数据库(Woocommerce的产品)。 有很多产品......要导入所有这些产品,脚本需要大约2-3个小时。

问题是当脚本执行时,内存不会被清除,导致溢出。 之后,脚本只是默默地死掉而没有任何错误。

简而言之,脚本如下所示:

$products = getProductsFromApi();
foreach ($products as $key => $product) {
    $this->import($product);
}

我们的想法是将cronjob脚本分成几部分:如果$currentMemory > 100Mb则停止脚本并再次运行它,但不是从一开始就停止它。

怎么能实现呢? 如果服务器有限制:每2小时只有1个cronjob脚本。

还有其他想法吗?

您可以使用Gearman之类的工具创建队列和工作人员以导入进程。 您可以对每个工作程序进行编程,以处理需要时间少于服务器最长执行时间的一定数量的产品。

Gearman还允许您控制可以同时运行的工人数量。 因此,导入过程会更快,您将确保服务器资源不被工作人员完全消耗。

当$ currentMemory> 100Mb到文件时,您可以将$ products数组进行serilize,然后再次执行脚本:

$limit = 100*1000*1000;
$store  = 'products.bin';
$products = [];

if ( !file_exists($store)) {
    $products = getProductsFromApi();    
} else {
    $products = unserialize(file_get_contents($store));
}

foreach ($products as $key => $product) {
    $this->import($product);
    unset($products[$key]);
    if (memory_get_usage() > $limit) {
        file_put_contents($store,serialize($products));
        exec('nohup /usr/bin/php -f myscript.php');
        exit(1);
    }    
}
unlink ($store);

你可以使用睡眠功能

例如

  $products = getProductsFromApi();
    $i=0;
    foreach ($products as $key => $product) {
    // you can use your condition here instead of this 
    if($i%10==0){// run ten times then sleep for 100 second    
sleep(100);
    }
        $this->import($product);
    $i++;
    }

https://php.net/manual/en/function.sleep.php

暂无
暂无

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

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