我正在编写一个函数,该函数应该更新所有woocommerce产品的价格..我将使用amazon api从amazon获取来自亚马逊的价格数据,该API每秒有一定的x查询限制,这就是为什么我必须在每个产品上睡觉的原因环。我打算将其作为cron作业运行。下面的函数只是我打算这样做的一个示例,请忽略缺少的变量声明等。
我知道我可以增加php超时限制,但我想像一下如果我有杂物或成千上万种产品,并且在每次查询时我都必须睡一会儿以避免查询受到限制,以便更新可能需要的所有产品在这种情况下需要数小时,所以我想知道什么是最好的和最简单的解决方案,以使该函数循环运行数小时并在到达$ products_ids数组中的最后一个id之后停止?
function text(){
foreach ($products_ids as $products_id) {
//apm_single_lookup func do an API call which has max query/sec limit thats why i added the next sleep
$lookup_data = apm_single_lookup($eu_asin, $amazon_domain);
update_post_meta($products_id, $field_name, esc_attr($lookup_data['price']));
sleep(1);
}
}
答案 0 :(得分:1)
您可以更改服务器的max_execution_time
。
或使用: http://php.net/manual/fr/function.set-time-limit.php
像这样:
set_time_limit(3600);
function text(){
...
}
或其他解决方案:
将您的循环拆分为多个Ajax调用(或cronjobs),这样您就可以停下来做自己想做的事情。
答案 1 :(得分:1)
赞:
function text(){
foreach ($products_ids as $products_id) {
set_time_limit(60); //timelimit per loop iteration
//apm_single_lookup func do an API call which has max query/sec limit thats why i added the next sleep
$lookup_data = apm_single_lookup($eu_asin, $amazon_domain);
update_post_meta($products_id, $field_name, esc_attr($lookup_data['price']));
sleep(1);
}
//set_time_limit(5*60); //set back to longer after the loop if you want etc.
}
我认为在循环的情况下最好在每次迭代时重置计时器。
调用时,set_time_limit()从零重新启动超时计数器。
这样,您可以在每次迭代中保持较小的时序,而不必担心是否有很多迭代。这在我脑海中更有意义....
最好在CLI(命令行)中执行此操作。即使您设置了PHP的最大执行时间,Apache也有它自己的时间限制(可能在mod_fcgi
中)。
答案 2 :(得分:0)
将此代码放在循环前:-
ini_set('max_execution_time', 0);
或
set_time_limit(0);