Как сохранить PHP-скрипт работающим даже после ухода пользователя? - PullRequest
2 голосов
/ 18 июля 2011

У меня есть скрипт PHP, который проверяет, когда база данных SQLite обновлялась в последний раз (30 минут), когда пользователь заходит на страницу.Если это было дольше 30 минут, сценарий извлечет новую информацию в базу данных.Тем не менее, я обеспокоен тем, что пользователь может уйти во время обновления базы данных, поэтому пренебрегает обновлением некоторых записей.Что я могу сделать, чтобы скрипт продолжал выполняться даже после того, как пользователь ушел?

Я посмотрел некоторые из подобных вопросов здесь и нашел людей, предлагающих использовать ignore_user_abort(), однако при этом возникают проблемы, когдаданные не могут быть отправлены обратно клиенту.Любые другие предложения будут с благодарностью.Спасибо!

Ответы [ 2 ]

1 голос
/ 18 июля 2011

Асинхронный вызов PHP

Один из вариантов - сделать асинхронный вызов PHP (Запрос). См. Асинхронные вызовы PHP? для получения дополнительной информации. Но имейте в виду, что при этом вы порождаете множество фоновых процессов, которые могут убить ваш сервер.

P.S .: Также, когда вы используете виртуальный хостинг, выполнение этого материала, как правило, не очень ценится

очередь сообщений

Лучшим способом сделать это было бы использование очереди сообщений (MQ). Вы можете использовать Redis или Beanstalkd только для того, чтобы назвать два популярных MQ. Вам предоставляется бесплатный экземпляр redis благодаря http://redistogo.com/. От клиента / производителя (пользователя, посещающего вашу страницу) вы затем добавляете сообщение в очередь, используя RPUSH . От потребителя (SQLite), который является PHP-процессом, выполняющимся в фоновом режиме бесконечно (CLI), вы можете получить сообщения, помещенные в очередь, используя BLPOP . Процессы порождения являются дорогостоящими и избегаются при использовании очереди сообщений.

1 голос
/ 18 июля 2011

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

$fp = fsockopen($host, 80, $errno, $errstr, 10);
if (!$fp) {
    echo "$errstr ($errno)\n";
} else {
   $header = "GET /cron.php HTTP/1.1\r\n";
   $header .= "Host: $host\r\n";
   $header .= "Connection: close\r\n\r\n";
   fputs($fp, $header);
   fclose($fp);
}

//do another stuff

это отправит сигнал в /cron.php, чтобы делать то, что вы хотите, и ТАКЖЕ не замедляет работу пользователя;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...