За последние 24 часа нас посетили 21903 программиста и 987 роботов. Сейчас ищут 614 программистов ...

499 Client Closed Request

Тема в разделе "Laravel", создана пользователем lordconst, 13 июн 2021.

  1. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Имеется страница, на которой пользователь вводит число и запускается цикл на это число итераций. Внутри цикла происходит отправка запросов на внешний сервер через Http фасад. Проблема в том, что на большом количестве итераций страница вскоре отваливается с ошибкой 499 Client Closed Request. Уже узнал что она означает, вопрос: как можно этого избежать?
    Пробовал вариант с созданием джоба, получилось, но когда пришло время настраивать супервизор, в поддержке хостинга сказали, что это возможно только на vps, а это для меня не вариант по финансам.
    При этом даже если и уходит в ошибку, цикл корректно выполняется до конца, все нормально.
    В беседе тематической спрашивал, посоветовали клиенту (т.е. мне) что-то отправлять, чтобы без ответа не сидеть и не провоцировать ошибку. Но толком и не понял что конкретно имеют ввиду.
    Кто-нибудь знает?
    p.s. отлавливать ошибку невозможно, т.к. это не исключение и не ошибка от сервера, сервер наоборот каждую итерацию цикла корректно отрабатывает.
    p.p.s. цитирую ответ поддержки хостинга: "Данную проблему необходимо решать на стороне клиента, нужно увеличивать время соединения со стороны клиента.".
     
  2. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    858
    Симпатии:
    132
    Можно между итерациями по 30-50кб пробелов выкидывать в вывод в скрытых div-ах, после делать flush(), но это то ещё извращение и не гарантирует устойчивого соединения.
    На хостинге cron'ом можете php-скрипт пускать с бесконечным временем жизни?
     
  3. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Над кроном думал, я его для другого типа заданий использую. А здесь мне нужно немедленно приступить к выполнению
     
  4. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    858
    Симпатии:
    132
    Создаётся "демон", скрипт по крону раз в минуту (чаще, вроде, нельзя) запускается, проверяет наличие какого-нить файла, когда нужно запустить тяжёлый долгий процесс, создаёте этот файл, демон пишет прогресс выполнения в файл, бд или куда ещё отправляет.
     
  5. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    главное чтобы "Betruger" успел выполнить поставленную задачу за 55 секунд.
    --- Добавлено ---
    Иначе lock триггеры нужны.
     
  6. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    858
    Симпатии:
    132
    А, что-то затупил, их есть у меня ))) donbidon/lib-process: PHP-process Lock library (github.com)
     
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
  8. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    858
    Симпатии:
    132
    не, там либа, чтобы лок создавать (код в репе умеет только лок в файлухе создавать, можно свой класс написать для других хранилищ лока).
    а из демона в цикле апить лок надо, если первый демон долго лок не апил, следующий демон его может порушить и начать работать, а в первом демоне при попытке апнуть потерянный лок исключение вылетит, я там README.md чутка подшаманил, комментов добавил
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    Мой вариант, когда крон дергает скрипт раз в минуту, чтобы не было казусов

    PHP:
    1. $exists = file_exists ( CRON_LOCK );
    2.  
    3. $resourse = fopen ( CRON_LOCK, 'w' );
    4.  
    5. if ( ! flock ( $resourse, LOCK_EX | LOCK_NB ) )
    6. {
    7.     exit;
    8. }
    9.  
    10. /* ... */
    11.  
    12. if ( $exists )
    13. {
    14.     if ( file_exists ( CRON_MESSAGE_LOCK ) )
    15.     {
    16.         exit;
    17.     }
    18.  
    19.     // send message err
    20.  
    21.     file_put_contents ( CRON_MESSAGE_LOCK, null );
    22.  
    23.     exit;
    24. }
    25.  
    26. register_shutdown_function ( static function ( string $dir ) use ( $resourse )
    27. {
    28.     flock ( $resourse, LOCK_UN );
    29.  
    30.     if ( is_null ( error_get_last () ) )
    31.     {
    32.         unlink ( $dir . DIRECTORY_SEPARATOR . CRON_LOCK );
    33.     }
    34. }, __DIR__ );
    35.  
    36. // code...
    --- Добавлено ---
    всегда путаю resourse resourсe, где правильно, а где нет.
     
  10. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Господа, крон не вариант, еще раз, надо немедленно начать выполнение. Даже минута ожидания слишком много
     
  11. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    клиент зачем ждет ?
     
  12. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Не совсем понял вопроса. В этих запросах я не жду ответа, я их просто отправляю. Сервер их обрабатывает сразу же, здесь никаких проблем нет.
    Клиент (т.е. пользователь, запустивший у меня цикл), ждет его окончания. После цикла у меня return на эту же страницу с flash-сообщением
     
  13. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    всмысле ??
    А зачем клиенту ждать то ? можно так:
    В личном кабинете отправил запрос и ему в ответ светится "ваш запрос в обработке" а ajax чекает php, который обращается к БД и смотрит. Статус запроса завершен или нет ?
    Далее при успехе, этому аяксу прилетает url для редиректа и шлем юзера куда подальше нужно.
     
  14. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    858
    Симпатии:
    132
    Ещё раз, можно на хостинге по крону пускать скрипт без ограничения времени?
    что-то мешает из него чекать файл раз в секунду на предмет старта основного процесса?
     
    #14 don.bidon, 14 июн 2021
    Последнее редактирование: 14 июн 2021
  15. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    https://habr.com/ru/post/179399/
    --- Добавлено ---
    Мой бот на пхп жил 9 часов и умер в среде Win OS, необъяснив почему тварь сдохла.
     
  16. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Что за DDOS-атака?
     
  17. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    1000 лайков в ГовноВконтакте
     
  18. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Ни то, ни другое. Бот для браузерной онлайн-игры. Что за токсичность?
     
  19. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    858
    Симпатии:
    132
    логгируй каждый пердок, если торчит выяснить причину.
    на боевых писался вочер-магистр, что стартовал недостающие [пля, не преследнут ли за разглашение ))))))))))))]
     
  20. lordconst

    lordconst Новичок

    С нами с:
    7 дек 2019
    Сообщения:
    151
    Симпатии:
    1
    Благодарю всех за участие в обсуждении, кажется, решил проблему. Переделал метод на бэке не на цикл, а на единичное выполнение операции, а цикл запихнул в ajax.
    Неактуально