Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
?>
Долгие операции нужно выносить за пределы, и выполнять их, например, в кроне.вообще-то, в конце я написал о том, что долгие операции следует выполнять в фоновом режиме (в кроне это делать или запускать в качестве фонового процесса — зависит от задачи и особого значения не имеет)
SET SESSION wait_timeout (ну и interactive_timeout тоже) = 9999To indicate explicitly that a variable is a session variable, precede its name by SESSION, @@session., or @@. Setting a session variable requires no special privilege, but a client can change only its own session variables, not those of any other client.
При необходимости можно периодически проверять состояние обработки при помощи AJAX запросов.
для nginx send_timeout и fastcgi_read_timeout (если PHP работает через FastCGI)Потрудитесь объяснить причем тут вообще send_timeout.
Если скрипт запускается в ответ на HTTP-запрос, то пользователь может остановить выполнение запроса в своем браузере, в этом случае прекратит свою работу и PHP скрипт.Это, мягко говоря, не всегда так.
Потрудитесь объяснить причем тут вообще send_timeout.
Таймаут устанавливается не на всю передачу ответа, а только между двумя операциями записями. Если по истечении этого времени клиент ничего не примет, соединение будет закрыто.
Это, мягко говоря, не всегда так.
На сколько я понимаю, если скрипт отправит что-то клиенту, после чего долгое время (больше чем указано в send_timeout) будет «молчать», то соединение закроется. Поправьте если я ошибаюсьСкрипт ничего клиенту не отправляет, этим в данном случае nginx занимается.
Ну как я и написал за это в PHP отвечает параметр ignore_user_abort. Если вам есть что добавить, то я готов это добавить в статью.Я в том сообщении процитировал конкретное ваше заявление. Вы полагаете, что у сервера всегда есть возможность узнать о том, что клиент нажал кнопку stop в браузере и закрыл соединение (если вообще закрыл). Нет, часто это невозможно сделать, пока не начнешь писать в сокет, а писать нечего, пока ваш скрипт не вернул ответ. Более того, если вы ещё и кэш включите, то даже в случае когда закрытие соединения было четко детектировано, с точки зрения php ничего не произойдет, поскольку нам нужно заполнить ячейку кэша. Даже если кэш не используются, то могут быть включены опции: fastcgi_ignore_client_abort и proxy_ignore_client_abort. PHP не общается с клиентом напрямую, а полагается только на то, как поведет себя сервер приложений, который взаимодействует с веб-сервером, но даже у последнего не всегда есть достаточно информации о том, что проихошло на той стороне.
if (lockStart('script.php')) { // основной код скрипта ... lockStop('script.php'); }
Если скрипт запускается в ответ на HTTP-запрос, то пользователь может остановить выполнение запроса в своем браузере, в этом случае прекратит свою работу и PHP скрипт.
Проблемы «долгих» скриптов PHP