如何在上一次执行完成时仅在循环中执行函数?
我使用一个API,我需要自动向每个会话的2000个用户发送电子邮件。我使用玉米工作,但我需要在数据库中创建某种分页因为我目前有50.000用户。我知道如何创建分页并发送循环但问题是服务器时间。执行脚本是5分钟,返回错误500.提供商不允许我扩展执行时间。
我需要在PHP中发送前2000封电子邮件,执行后开始新的执行等。我尝试使用ajax并且工作完美,但cronjob不执行HTML。
怎么办?
这是AJAX解决方案:
(function($){
var setup = {
page : 0,
total : 30
},
sendAjax = function(page){
if(page > setup.total)
{
return false;
}
else
{
$.ajax({
url: "/ajax/daily-request.php",
type:"POST",
data: "page="+page+"&total="+setup.total
}).fail(function(jqXHR, textStatus){
console.log("AJAX Request failed: " + textStatus);
}).done(function(num){
num = $.trim(num);
setTimeout(function(){
sendAjax(num);
console.log("User Group "+num+" Request Send!");
////////// DEBUG //////////
// sendAjax(setup.page);
// console.log(setup.page);
// setup.page++;
},1);
});
}
}
$(document).ready(function(){
sendAjax(setup.page);
});
}(jQuery));
答案 0 :(得分:1)
<?php
$page = isset($_GET["page"]) $_GET["page"] : 0 ;//get page or handle first 1st page
using $page you can use your pagination to handle pages 0-infinate
.... your email loop for first 1000 emails
.... check that there is more
if($page != $lastpage){
header("location: daily-request.php?page=".($page+1));
}
//end of the file
?>
这将强制文件使用新页面重新加载,直到它没有剩余 将其设置为1000可确保您不会在页面上发送许多信息,从而允许服务器有时间切换页面而不会超时。
对于sql位,你需要做的就是
$start = $page*1000;
SELECT * FROM `table` LIMIT $start, 1000;
这样你就不必编辑cron job就让它运行,文件将在它的第一个ini之后接管,然后它会在页面用完并停止循环时停止;
答案 1 :(得分:1)
我非常仔细地阅读了您的问题。您需要做的只是在php中使用'sleep()'函数,这将使您的服务器在给定的最小时间内休眠,这样您的服务器就不会给出500错误。