如何仅在上次执行完成的情况下执行循环中的函数?
我使用一个API,每个会话需要自动向2000名用户发送电子邮件。我使用玉米作业,但我需要在数据库中创建某种分页,因为我目前有大约50000个用户。我知道如何创建分页和循环发送,但问题是服务器时间。脚本执行大约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));
在您的PHP 中
<?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作业,只需让它运行,文件就会在它的第一个ini之后接管,然后当页面用完时就会停止,并停止循环;
我仔细阅读了你的问题。你只需要在php中使用'sleep()'函数,它会让你的服务器睡眠给定的分钟,这样你的服务器就不会给出500个错误。