php одновременная загрузка файлов из одного браузера и одного и того же сценария php

<?php $filename= './get/me/me_'.rand(1,100).'.zip'; header("Content-Length: " . filesize($filename)); header('Content-Type: application/zip'); header('Content-Disposition: attachment; filename=foo.zip'); readfile($filename); ?> 

Привет, У меня есть этот простой код, который заставляет загрузку случайного файла, моя проблема в том, что если я вызову сценарий два или более раз из того же браузера, вторая загрузка не начнется, пока первая не будет завершена или прервана. Таким образом, я могу загрузить только один файл за раз. У вас есть какая-то подсказка?

Это может быть связано с обработкой сеансов PHP.

Используя обработчик сеанса по умолчанию, когда скрипт PHP открывает сеанс, он блокирует его. Последующие скрипты, которые должны получить к нему доступ, должны ждать, пока первый скрипт не завершит его и не разблокирует (что происходит автоматически при завершении работы или session_write_close ()). Это проявляется в том, что скрипт ничего не делает до тех пор, пока предыдущий не завершится точно так же, как вы описываете.

Очевидно, что вы не запускаете сеанс явно, но есть флаг конфигурации, который заставляет сеанс запускаться автоматически: session.auto_start – http://www.php.net/manual/en/session.configuration.php

Либо используйте phpinfo (), чтобы определить, установлено ли значение true, или посмотрите в вашем конфиге. Вы также можете попробовать добавить session_write_close () в начало скрипта, посмотреть, уходит ли проблема.

просто догадки. Могут быть разные причины.

во-первых, ваш сервер может ограничить количество подключений или дочерних элементов в паралелле. Но я думаю, что это не проблема

во-вторых, более вероятно, что клиент ограничивает количество подключений. «Обычный» браузер одновременно открывает только два подключения к определенному серверу. Современные браузеры поддерживают до 8 (?) Соединений. Это простое ограничение, чтобы избежать проблем, которые могут возникнуть с медленными серверами.

Одним из способов может быть размещение каждой загрузки в «виртуальном» субдомене.

попробуйте!

Я бы также исследовал предложение Ральфа о ограничениях на сервере и начинал с проверки файлов журналов, чтобы гарантировать, что второй запрос будет получен сервером вообще. Имея это знание, вы можете устранить одну из возможностей и, по крайней мере, увидеть, с какой стороны находится проблема.

В браузере клиента вы не указали, какой из них – если Firefox, попробуйте установить расширение Live Http Headers, чтобы узнать, что произойдет с запросом на отправку, и если браузер получит ответ со стороны сервера.

Просто сказать, что session_write_close(); решил проблему для меня.

Я использовал session_destroy(); (что сработало), но было не очень хорошо, если мне нужно было сохранить данные сеанса 🙂

Все, что вам нужно сделать, я session_write_close(); как раз перед началом потоковой передачи данных файла.

Пример:

 <?php $filename= './get/me/me_'.rand(1,100).'.zip'; session_write_close(); header("Content-Length: " . filesize($filename)); header('Content-Type: application/zip'); header('Content-Disposition: attachment; filename=foo.zip'); readfile($filename); ?> 

Насколько я могу найти, нет настройки конфигурации php, которая ограничивает максимальные загрузки или что-то в этом роде – кроме того, такая конфигурация выходит за рамки php.

Поэтому я могу прийти к двум выводам:

  • Во-первых, это поведение браузера, посмотрите, повторяется ли проблема в нескольких браузерах (дайте мне знать, если это так). Спецификация HTTP говорит, что только одно подключение к одному домену должно быть активным в любой момент времени, но я не знал, что это касается загрузки файлов, а также загрузки страниц. Способ обойти такое ограничение состоит в том, чтобы выделить несколько поддоменов на один и тот же сайт (или сделать запись DNS-поддоменов), а при создании ссылки на загрузку выберите случайный поддомен для загрузки из , Это должно работать с проблемой множественного запроса, если это проблема с браузером.

  • Второй и гораздо более маловероятный вариант заключается в том, что (и это применимо только при использовании Apache), ваш параметр конфигурации MaxKeepAliveRequests установлен на что-то смехотворно низкое и KeepAlives включено. Тем не менее, я очень сомневаюсь, что это проблема, поэтому я предлагаю изучить возможность браузера.

Получаете ли вы сообщение об ошибке из браузера при запуске второй загрузки или просто зависаете? Если он просто зависает, это говорит о том, что это проблема с браузером.