Я потратил часы на поиск в Google, а также на поиск сайта Apache, и я не могу найти документацию о том, как Apache обрабатывает загрузку файлов – особенно большие. Я читал анекдотические сообщения о том, что PHP не участвует, пока загрузка не будет завершена, и это то, чего я ожидал. Но что касается Apache во время загрузки, я ничего не могу найти.
Причина, по которой я горячая для документации, заключается в том, что Apache полностью сохраняет загрузки в памяти, вместо того, чтобы передавать их на диск. httpd
будет использовать каждый байт доступной памяти на сервере, который я использую, пока он не сработает. Как правило, объем потребляемой физической памяти составляет 3 раза от размера загружаемого файла и увеличивается около 5 МБ / с (где-то рядом с моей скоростью загрузки).
Я тестировал этот же запрос на другом стеке LAMP, который я использую, и использование памяти Apache вообще не изменяется во время загрузки.
Может ли кто-нибудь объяснить мне, как Apache может обрабатывать одну и ту же загрузку по-разному на двух разных серверах? Любая мысль очень ценится.
Технически PHP обрабатывает загрузку от имени Apache и буферизует файл в ram до его завершения. Однако ваш скрипт не получит контроля до тех пор, пока загрузка не завершится (или не будет отменена). Apache сам по себе не будет выгружаться на диск, если это не нужно. Подумайте об этом как о невидимом вызове функции handle_upload (), который прозрачно вставлен как самое первое в вашем скрипте.
Назад в тегах «все – cgi-скрипт», когда языковые интерпретаторы, такие как PHP, не были внедрены в процесс веб-сервера, данные POST были отправлены в CGI-скрипт через стандартный ввод. Файл будет проходить через Apache непосредственно в процесс CGI и может быть читайте байты по байтам, когда они вошли.
Ответ неудовлетворен. Я не нашел никакой документации.
Я продолжал трястись в темноте, наконец, наткнувшись на модернизацию mod_fcgid
(от 2.2 до 2.3.6), которая сделала трюк. Возможно, в 2.2 была ошибка.
Использование памяти по-прежнему растет в 2.3.6, но гораздо менее резко. Только несколько мегабайт для файла размером 100 МБ. (Однако, когда загрузка завершается, и файл перемещается, использование памяти мгновенно срабатывает ~ 100-200 МБ, но затем, кажется, сразу же освобождается.)
Это может вам помочь, поскольку на сервере WAMP есть Apache.