Никита Полевой, заметил такую вещь, что многие не понимают суть PHP, им кажется что они работают с документами в реальном времени, а не запрос/ответ. Как они при этом могут кодить? Ведь им это удаётся.
Olek1, так-то оно так, но мне казалось, что если я правильно угадал и ТС действительно хочет прекращать передачу данных если клиент закрыл страницу, то это делается как-то так: фронт по unload посылает запрос на сервер (который вероятно на PHP), PHP наверное просит nginx прекратить передачу. Я неправильно понимаю?
Olek1, так-то оно так, но мне казалось, что если я правильно угадал и ТС действительно хочет прекращать передачу данных если клиент закрыл страницу, то это делается как-то так: фронт по unload посылает запрос на сервер (который вероятно на PHP), PHP наверное просит nginx прекратить передачу. Я неправильно понимаю?
Все верно. Задача прервать загрузку файла при закрытии вкладки браузера.
Владимир Муковоз, а как попросить nginx прервать передачу? И вероятно nginx должен не просто прервать передачу, а как-то еще сигнализировать об ошибке, чтобы передача в браузере завершилась моментально.
Никита Полевой, не совсем представляю как можно попросить об этом nginx, есть конечно пару идей, но не проверенных на практике. Зато ты можешь отдавать файл через php и там я думаю не составит проблемы прервать передачу)
Владимир Муковоз, отдавать файл через PHP - редчайшее извращение. Если у ТС встал вопрос о сбрасывании отвалившихся клиентов, то скорее всего вопрос уперся в производительность сервера и попытки снизить нагрузку. В этом случае попытка отдавать файлы с помощью PHP только повысит нагрузку. Если же у ТС проблем с производительностью нет, то тогда вопрос вообще из категории спортивного интереса, и заморачиваться им не стоит - сервера умеют подчищать соединения.
Задача удержать пользователя от закрытия вкладки на период скачивания файла. По этому и требуется в случае закрытия вкладки, принудительно оборвать закачку.
Юрий Татаркин, То есть, у вас есть страничка, пользователь начал с нее скачивать файл (менеджером закачек или браузером - не принципиально), и вам нужно каким-то образом мониторить оба соединения. Если вкладку закрыли - тогда сбросить закачку этому же клиенту?
Не буду спрашивать зачем :)
Родными средствами Nginx не получится. Для начала - для сервера это 2 разных, независимых соединения, Nginx понятия не имеет что они связаны. Далее - закачка может длиться какое-то время, держа соединение открытым, а страница во вкладке загрузилась и это соединение держится открытым ровно до keepalive_timeout. После таймаута оно закроется, и все, никакой связи.
Я хз даже что вам тут посоветовать. Если мне память не изменяет, для Nginx есть модули стримминга, есть x-accel-redirect. Страничка ваша может по вебсокету постоянно пинговать сервер / приложение. Они, в свою очередь, могут контролировать поток и отрубать его. Можно попробовать поковырять Lua и попробовать решить на уровне скриптинга Nginx. Возможно, заюзать memcached и прямой доступ к нему с помощью модуля - там можно держать флаги или какие-нибудь идентификаторы процессов. Теоретически, думаю, задачу решить можно. Но на практике - хз как.