我在这里做错了什么?我错过了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);
}
嘿伙计们,我又回来了!
所以,我想要编写代码的是:
我的解决方案是将最后两个阶段放在while循环中,然后让脚本在结束时休眠60秒。
结果:我收到一封包含有用数据的电子邮件。
答案 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'";
似乎是多余的,使用相同的参数连接两个查询以获得两个不同的列。