Что я здесь не так делаю? Я скучаю по тому, как циклы 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 = '[email protected]';
$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 секунд в конце.
Результат: я получаю одно письмо с полезными данными.
Большинство серверов имеют ограничение по времени выполнения для сценариев php. в большинстве случаев скрипт будет работать только в течение 30 секунд до истечения времени ожидания. Если у вас есть доступ к конфигурации сервера, вы можете изменить его на бесконечный.
Set_time_limit(0)
иногда не работает в зависимости от конфигурации сервера. Некоторое время назад я попробовал то же самое и ничего, но изменение настроек на сервере сделало это для меня.
редактировать
Из-за жалоб, что изменение настроек по умолчанию на вашем сервере может создать угрозу безопасности, вы можете сделать что-то другое. Глядя на ваши комментарии, вы хотите запросить данные, а затем по электронной почте сказал упомянутые данные.
Вы можете сделать это очень легко, создав автономный php-скрипт (не в цикле while), который один раз будет следовать вашей логике. Используя Jquery, вы можете вызывать этот скрипт столько раз и сколько захотите, когда загружается веб-страница.
Чтобы этот скрипт работал в фоновом режиме без взаимодействия с пользователем, вы хотите создать cronjob, который вызывает этот скрипт очень часто (вы можете определить временной интервал).
Проблема в том, что вы используете break
, Если у вас нет данных в очереди, вы делаете перерыв. Это закроет ваш цикл и, таким образом, завершит выполнение вашего скрипта.
continue
здесь было бы логично перейти к следующей итерации цикла, но это также позволило бы пропустить режим ожидания в нижней части цикла. Поэтому я не думаю, что есть необходимость else{}
блок в конце вашего цикла. Просто дайте ему дойти до секции сна и продолжите цикл как обычно, если данные равны NULL.
Постскриптум почему бы просто не сделать один запрос с:
$querydata = "SELECT data1,data2 FROM queue WHERE user_id = '$result'";
Кажется излишним делать два запроса подряд с одинаковыми параметрами, чтобы получить два разных столбца.