Представилась возможность более плотно поковырять эту фичу, поэтому могу тоже немного поделиться своими ислледованиями.
PHP_SESSION_UPLOAD_PROGRESS как и задумано, исправно мониторит прогресс загрузки файла от клиента на сервер, скидывая данные в файл сессии для дальнейшей (возможной) обработки. Поэтому, как верно заметил
@dooble, если файл большой, то время жизни "полезного" файла будет увеличиваться и тогда есть 100% шансы выйграть эту гонку за пару запросов.
Но нам так же ничего не мешает, растянуть передачу маленького файла на большой промежуток времени. Поэтому, осмелюсь предположить, что вот эти странные явления:
Сообщение от
dooble
↑
файл сессии не очищался еще продолжительное время после окончания работы скрипта загрузки
Сообщение от
Gorbachev
↑
Т.е. данным кодом, который я посылал с одного сервера на сервер своей VPS, я видел гарантированное срабатывание, создание, и подхватывание сессии. А вот попробовав откуда-то ещё послать такой же запрос на свою VPS - уже не срабатывает.
Сообщение от
Gorbachev
↑
полагаю, тут имеют место быть "тайминги", т.е. по микросекундам с двух серверов было идеальное совпадение
ничто иное как подвисший или медленный коннект.
Вполне нормальный, жизненный кейс, когда у клиента замедлился интернет, ведь по сути для этого и нужен отображаемый прогресс загрузки, чтоб было веселей ждать
В общем, немного пошаманив, пришёл к такому варианту, где не досылается последний байт:
PHP код:
[COLOR="#000000"][COLOR="#0000BB"][/COLOR][COLOR="#007700"]'[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$scheme[/COLOR][COLOR="#007700"]= ([/COLOR][COLOR="#0000BB"]$ssl[/COLOR][COLOR="#007700"]?[/COLOR][COLOR="#DD0000"]'ssl://'[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]"\r\n"[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]''[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'-----------------------------xxxxxxxxxxxx'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Content-Disposition: form-data; name="PHP_SESSION_UPLOAD_PROGRESS"'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#0000BB"]$payload[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'-----------------------------xxxxxxxxxxxx'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Content-Disposition: form-data; name="file"; filename="tricky_file.is"'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Content-Type: text/plain'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#0000BB"]str_repeat[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#DD0000"]'A'[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]1024[/COLOR][COLOR="#007700"]*[/COLOR][COLOR="#0000BB"]1000[/COLOR][COLOR="#007700"]).[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'-----------------------------xxxxxxxxxxxx--'[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#DD0000"]'POST '[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$path[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]' HTTP/1.1'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Content-Type: multipart/form-data; boundary=---------------------------xxxxxxxxxxxx'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:56.0) Gecko/20160101 Firefox/56.0'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Host: '[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$host[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Cookie: PHPSESSID='[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$session_name[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Content-Length: '[/COLOR][COLOR="#007700"].([/COLOR][COLOR="#0000BB"]strlen[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"])).[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].=[/COLOR][COLOR="#DD0000"]'Connection: close'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]$fp[/COLOR][COLOR="#007700"]=[/COLOR][COLOR="#0000BB"]stream_socket_client[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$scheme[/COLOR][COLOR="#007700"].([/COLOR][COLOR="#0000BB"]$ip[/COLOR][COLOR="#007700"]?[/COLOR][COLOR="#0000BB"]$ip[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#0000BB"]$host[/COLOR][COLOR="#007700"]).[/COLOR][COLOR="#DD0000"]':'[/COLOR][COLOR="#007700"].([/COLOR][COLOR="#0000BB"]$scheme[/COLOR][COLOR="#007700"]?[/COLOR][COLOR="#0000BB"]443[/COLOR][COLOR="#007700"]:[/COLOR][COLOR="#0000BB"]80[/COLOR][COLOR="#007700"]),[/COLOR][COLOR="#0000BB"]$errno[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]$errstr[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]30[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]fwrite[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$fp[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]substr[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]0[/COLOR][COLOR="#007700"],[/COLOR][COLOR="#0000BB"]strlen[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]$header[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$body[/COLOR][COLOR="#007700"]) -[/COLOR][COLOR="#0000BB"]1[/COLOR][COLOR="#007700"]));
print[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]'Session file name is: sess_'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$session_name[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#DD0000"]'Hurry up :)'[/COLOR][COLOR="#007700"].[/COLOR][COLOR="#0000BB"]$EOL[/COLOR][COLOR="#007700"];
[/COLOR][COLOR="#0000BB"]sleep[/COLOR][COLOR="#007700"]([/COLOR][COLOR="#0000BB"]1000[/COLOR][COLOR="#007700"]);
[/COLOR][COLOR="#0000BB"]?>
[/COLOR][/COLOR]
Никаких гонок при этом нет, файл лежит очень долго. По моим наблюдениям, до обрыва соединения, т.к. ждать больше получаса не хотелось По хорошему, этот "плохой" коннект должен обрываться по таймауту и возможно тут присутствует задел на развитие/усиление DOS, но это не в кассу.
Вариант получился сильно похожий на решение от @nix_secutiry, но уже в более универсальном варианте. Который будет удерживать файл, столько, сколько потребует ваш вектор.