PHP休眠无限While循环

PHP休眠无限While循环,php,loops,while-loop,sleep,Php,Loops,While Loop,Sleep,我做错了什么?我是否错过了while循环在PHP中的工作方式?我希望它在服务器上的后台保持循环,即使在页面关闭之后也是如此 $querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'"; 重要提示:即使我保持页面打开,也不起作用。 $querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'"; 我觉得我在使用PHP时犯了一个明显的语法

我做错了什么?我是否错过了while循环在PHP中的工作方式?我希望它在服务器上的后台保持循环,即使在页面关闭之后也是如此

$querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'";
重要提示:即使我保持页面打开,也不起作用。

$querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'";
我觉得我在使用PHP时犯了一个明显的语法错误

        ignore_user_abort(true);
        set_time_limit(0);

        while(1){
            $dbConnection = mysqli_connect($servername, $username, $password, $dbname); 
            $query = "SELECT user_id FROM users WHERE email = '$user_email'";
            $id = mysqli_query($dbConnection, $query);
            $idrow = mysqli_fetch_assoc($id);
            $result = $idrow['user_id'];

            $querydata1 = "SELECT data1 FROM queue WHERE user_id = '$result'";
            $data1 = mysqli_query($dbConnection, $querydata1);
            $data1row = mysqli_fetch_assoc($data1);
            $resultdata1 = $data1row['data1'];

            if($resultdata1 != NULL){
                $querydata2 = "SELECT data2 FROM queue WHERE user_id = '$result'";
                $data2 = mysqli_query($dbConnection, $querydata2);
                $data2row = mysqli_fetch_assoc($data2);
                $resultdata2 = $data2row['data2'];

                include 'PHPMailerAutoload.php';

                $mail = new PHPMailer;

                $mail->isSMTP();
                $mail->Host = 'smtp.mandrillapp.com';
                $mail->SMTPAuth = true;
                $mail->Username = 'username';
                $mail->Password = 'password';
                $mail->SMTPSecure = 'tls';
                $mail->Port = 587;

                $mail->From = 'test@test.com';
                $mail->FromName = 'test';
                $mail->addAddress($user_email);

                $mail->Subject = 'Test';
                $mail->Body = "$resultdata2"; 

                $mail->send();

            } else {
                break;
            }

            time_sleep_until(microtime(true)+10);
        }
$querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'";
嘿,伙计们,我又回来了

$querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'";
因此,我想编写代码的目的是:

$querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'";
  • 接受用户输入
  • 使用用户输入查询数据库
  • 每60秒通过电子邮件发送一次结果
  • 我的解决方案是将最后两个阶段放在while循环中,然后让脚本在最后休眠60秒

    $querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'";
    

    结果:我收到一封电子邮件,里面有有用的数据。

    大多数服务器对php脚本的执行都有时间限制。在大多数情况下,脚本在超时之前只运行30秒。如果您有权访问服务器配置,可以将其更改为无限

    $querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'";
    
    Set\u time\u limit(0)
    有时不起作用,具体取决于服务器配置。不久前,我尝试了同样的事情,但什么也没有做,但改变了服务器的设置,我做到了这一点

    $querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'";
    
    编辑

    $querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'";
    
    由于抱怨更改服务器上的默认设置可能会造成安全风险,您可以采取其他措施。查看您的评论,您想查询数据,然后通过电子邮件表示提及数据

    $querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'";
    
    通过创建一个独立的php脚本(而不是while循环),只需遵循一次逻辑,就可以很容易地做到这一点。使用Jquery,您可以在加载网页时根据需要多次调用此脚本

    $querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'";
    

    要使此脚本在后台运行而无需用户交互,您需要创建一个cronjob,该cronjob每隔一段时间调用此脚本(您可以定义时间间隔)。

    问题在于您使用了
    break
    。当队列中没有数据时,发出中断。这将关闭循环,从而结束脚本的执行

    $querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'";
    
    continue
    在这里继续循环的下一个迭代是合乎逻辑的,但这也会跳过循环底部的休眠。因此,我认为在循环的末尾不需要
    else{}
    块。只要让它点击sleep部分,如果数据为NULL,则继续正常循环即可

    $querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'";
    

    请注意,为什么不只对以下各项进行一次查询:

    $querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'";
    

    为了得到两个不同的列,用相同的参数背靠背地进行两个查询似乎是多余的。

    什么是
    White
    循环?或者这是一种避开可能的欺骗的方法?那
    T
    与键盘上的
    L
    相去甚远。它根本不工作,或者它运行了一段时间后就停止了?如果您使用的是共享主机,则提供商可能有一个脚本,用于检查长时间运行的脚本并将其杀死。您如何知道它不起作用?安全模式是否启用?“警告当PHP在安全模式下运行时,此函数无效。除了关闭安全模式或更改PHP.ini中的时间限制外,没有其他解决方法。”是否每10秒发送一封电子邮件?你确实看到了
    set\u time\u limit(0)在问题中?@arkascha有时该功能根据服务器配置不起作用。不久前,我尝试了同样的方法,但什么也没做,但更改服务器的设置对我来说是可行的。然后你应该在回答中写下这一点。特别是你提到要用管理权来改变某些东西。通常,在php配置中更改这一点将是一个巨大的安全问题。这真是个糟糕的建议。如果您有管理权限,那么您应该建议如何更改配置,以使此命令生效。让我们看看OP有什么要说的。希望他们一开始就公布了完整的代码。弗雷德,快点,停下来。我只是想寻求一点帮助。你太不受欢迎了。@Devon,我拿走了else{}块,它仍然不工作,奇怪。@gregjw,它会发送第一封电子邮件吗?执行是否在10秒或更长时间后停止?@gregjw Fred是对的。我可能超越了其他人在Stackoverflow的预期。对于脚本,添加一些调试参数,echo跟踪循环的运行次数,查看最后一次输出以了解循环何时退出,确保有错误报告(E_ALL)并显示错误。
    
    $querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'";