PHP执行函数时,上一次执行是在循环中完成的


PHP execute function when is previous execution done in loop

如何仅在上次执行完成的情况下执行循环中的函数?

我使用一个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个错误。