Всем привет, задался таким вопросом, я начал писать бота на php, мне нужно чтоб при запуске скрипта в браузере скрипт выполнялся не малый промежуток времени, допустим это минут 5-10, но выдаст ошибку 504 Gateway Time-out на секундах 30.
Мне не нужна оптимизация кода, мне нужно избежать ошибку 504.
Возможно я не правильно пишу бота ?
Можно ли сделать чтоб скрипт выполнялся столько сколько ему нужно ?
Судя по 504 Gateway Time-out у вас перед PHP стоит nginx. Если это так - добавьте в конфигурацию сайта настройку для ожидания времени ответа upstream. Если у вас используется FastCGI то: fastcgi_read_timeout 30m;
если используется проксирование, то: proxy_read_timeout 30m;
А вообще такие скрипты запускают не через веб-сервер, а из консоли, устанавливая при этом set_time_limit(0);
Со стороны nginx - вряд ли, но нужно помнить что TCP соединения не поддерживаются живыми автоматически, поэтому реальная ситуация может отличаться в зависимости от деталей вашей конфигурации
При запросе скрипта из браузера на самом деле создаётся соединение "браузер-nginx" и, возможно, соединение "nginx-upstream" в зависимости от того какова у вас конфигурация. Если второго соединения (nginx-upstream) может и не быть (к примеру там подключение через unix socket, а не через tcp) то соединение с браузером есть и никто не будет гонять там дополнительные пакеты чтобы поддержать его в живом состоянии, оно просто будет закрыто через какое-то время, причём не обязательно по инициативе nginx. В итоге если вы хотите запускать что-то что работает долго, но отдаёт результат в браузер, а не просто использовать браузер для запуска удалённого скрипта - то реальная схема несколько другая. Если же вы просто хотите запускать скрипт на сервере - то лучше делать это из консоли, а не через браузер.
Dmitry, вам же будет легче, если вы примете за аксиому, что ответа от скрипта, выполняющегося дольше 5 минут, никто никогда не дождется. И построите решение, которое это учитывает.
Ну то есть как, скрипт просто обрабатывается, по сути его нужно просто запустить и чтоб он работал, сейчас подвох в том, что пол кода написано в веб интерфейсе, и переписывать под консоль времени нету.
Как я понимаю если я даже настрою сервер там допустим на отклик в течении 5 минут, браузер сам может отключить, тем самым все сорвав и это уже настроить нельзя ? Правильно я понимаю ?
Dmitry да, правильно. вы, конечно, можете закинуть в браузер скрипт который будет поддерживать соединение, но в целом это решение сложнее чем просто запускать скрипт из консоли. при условии что ваш скрипт использует какой-нибудь современный framework - переделать его на запуск из консоли в целом будет весьма тривиальной задачей.
Сочувствую :) Тогда как вариант - делать отдельный shell скрипт с каким-нибудь curl'ом который будет дёргать ваш скрипт и в нём уже ставить необходимые timeout'ы. Вот здесь можно посмотреть их описание. Так вы хотя бы обеспечите управляемость окружения в условиях специфики вашего проекта.
По поводу реализации - копать в сторону идеи о том что будет 3 компонента:
реальный долгоиграющий скрипт, как-то отдающий информацию о своём состоянии
серверный скрипт который может читать это состояние
клиенский скрипт в браузере который будет запрашивать состояние и, возможно, подавать управляющие команды.
Клиентский скрипт (3) загружается в браузер и начинает время от времени запрашивать статус долгоиграющего скрипта (1) у сервера. На сервере отвечает скрипт (2) который читает актуальный статус долгоиграющего скрипта (1) и информирует о нём клиента (3).