PHP睡觉无限而循环

时间:2015-05-11 16:56:58

标签: php loops while-loop sleep

我在这里做错了什么?我错过了while循环在PHP中的工作方式吗?我希望即使页面关闭后,它仍然在服务器的后台循环。

重要说明:即使我保持页面打开也无效。

我觉得这是我用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);
        }
嘿伙计们,我又回来了!

所以,我想要编写代码的是:

  1. 接受用户输入
  2. 使用用户输入查询数据库
  3. 每60秒通过电子邮件发送一次结果。
  4. 我的解决方案是将最后两个阶段放在while循环中,然后让脚本在结束时休眠60秒。

    结果:我收到一封包含有用数据的电子邮件。

2 个答案:

答案 0 :(得分:0)

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

Set_time_limit(0)有时根据服务器配置不起作用。不久前,我尝试了同样的事情,但没有,但更改服务器中的设置为我做了。

  

修改

由于抱怨更改服务器上的默认设置可能会产生安全风险,因此您可以执行不同的操作。查看您想要查询数据的评论,然后通过电子邮件发送提及数据。

你可以通过创建一个独立的PHP脚本(而不是循环)来非常容易地做到这一点,这个脚本遵循你的逻辑一次。使用Jquery,您可以在加载网页时多次调用此脚本。

要在没有用户交互的情况下在后台运行此脚本,您需要创建一个经常调用此脚本的cronjob(您可以定义时间间隔)。

答案 1 :(得分:0)

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

continue在这里继续下一次循环迭代是合乎逻辑的,但这也会跳过循环底部的睡眠。因此,我认为在循环结束时不需要else{}块。如果数据为NULL,只需让它进入睡眠部分并继续正常循环。

P.S。为什么不用一个查询:

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

似乎是多余的,使用相同的参数连接两个查询以获得两个不同的列。