PHP спит бесконечно во время цикла

Что я здесь не так делаю? Я скучаю по тому, как циклы 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);
}

Эй, ребята, я снова вернулся!

Итак, я хочу написать код:

  1. Принять пользовательский ввод
  2. Запрос к базе данных с использованием пользовательского ввода
  3. Отправляйте результаты по электронной почте каждые 60 секунд.

Мое решение состояло в том, чтобы поместить последние два этапа в цикл while, а затем перевести скрипт на 60 секунд в конце.

Результат: я получаю одно письмо с полезными данными.

-2

Решение

Большинство серверов имеют ограничение по времени выполнения для сценариев php. в большинстве случаев скрипт будет работать только в течение 30 секунд до истечения времени ожидания. Если у вас есть доступ к конфигурации сервера, вы можете изменить его на бесконечный.

Set_time_limit(0) иногда не работает в зависимости от конфигурации сервера. Некоторое время назад я попробовал то же самое и ничего, но изменение настроек на сервере сделало это для меня.

редактировать

Из-за жалоб, что изменение настроек по умолчанию на вашем сервере может создать угрозу безопасности, вы можете сделать что-то другое. Глядя на ваши комментарии, вы хотите запросить данные, а затем по электронной почте сказал упомянутые данные.

Вы можете сделать это очень легко, создав автономный php-скрипт (не в цикле while), который один раз будет следовать вашей логике. Используя Jquery, вы можете вызывать этот скрипт столько раз и сколько захотите, когда загружается веб-страница.

Чтобы этот скрипт работал в фоновом режиме без взаимодействия с пользователем, вы хотите создать cronjob, который вызывает этот скрипт очень часто (вы можете определить временной интервал).

0

Другие решения

Проблема в том, что вы используете break, Если у вас нет данных в очереди, вы делаете перерыв. Это закроет ваш цикл и, таким образом, завершит выполнение вашего скрипта.

continue здесь было бы логично перейти к следующей итерации цикла, но это также позволило бы пропустить режим ожидания в нижней части цикла. Поэтому я не думаю, что есть необходимость else{} блок в конце вашего цикла. Просто дайте ему дойти до секции сна и продолжите цикл как обычно, если данные равны NULL.


Постскриптум почему бы просто не сделать один запрос с:

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

Кажется излишним делать два запроса подряд с одинаковыми параметрами, чтобы получить два разных столбца.

0

По вопросам рекламы [email protected]