Фон
Это то, что сводит меня с ума на несколько недель. Я использую скрипт PHP Minify MrClay для минимизации и объединения моих JS и CSS. Это прекрасно работает, все мои файлы объединены в common.css и common.js, которые являются виртуальными файлами, переведенными для ссылки на скрипт следующим образом:
RewriteRule ^common.js$ /tynamic/min/?g=js [L,QSA]
RewriteRule ^common.css$ /tynamic/min/?g=css [L,QSA]
Строка запроса также добавлена для обозначения версии этих файлов, и они имеют кеширование продолжительностью 3 года, поэтому человеку, посетившему мой сайт, скорее всего, никогда не придется загружать какие-либо CSS или JS при любом будущем посещении этого сайта (если они не меняйся, очевидно). Пока все работает.
Эта проблема
Часто (к сожалению, не всегда), когда мой браузер запрашивает эти 2 файла (что делается одновременно), один из файлов занимает секунду, чтобы вернуться. Это всегда тот, чей запрос поступает позже на сервер, поэтому его обычно тот, который позже в HTML, но это не правило.
Смотрите эти скриншоты:
Я бы согласился с тем, что сервер помещает другой файл в очередь и обрабатывает его после первого, но это не займет целую секунду.
Еще несколько вещей: никакие действия, такие как конкатенация или gzipping не выполняются в этом случае … скрипт только выполняет fpassthru () из существующего предварительно сжатого файла. Однако это происходит не всегда … там становится немного странно, если я выполняю большое количество последовательных загрузок страниц, например, 30 или более, он возвращается к «нормальному», когда оба файла обрабатываются за тривиальное время , Затем, когда я проверяю через некоторое время, он снова на втором зависании. Время всегда немного больше секунды.
Что я уже пробовал
if($_GET["g"]=="js") exit;
прямо в начале сценария.Это верно, это не помогло. Файл все еще задерживался, ничего не выводя. Просто exit;
(для обоих файлов) однако работает … 🙂
Оба прогона сообщают о минимальном времени (единицах или десятках миллисекунд) своих прогонов, поэтому нет функции, которая бы задерживала это.
Без справки, 3 разных сервера и хостинг провайдеры. Это не связано с хостингом.
Поэтому я сделал копию полного каталога скриптов, чтобы оба запуска выполнялись с использованием разных файлов — без помощи.
Пока я ничего не придумал 🙁
Это было интересно, изменяя файлы, чтобы сделать что-то еще, например, сделать скандир и выбрать файл тоже не помогло. Другой анализ показал, что PHP-скрипты присваиваются свободным потокам процессора. каждую секунду. Так что, если есть, например, 5 потоков и 6 сценариев должны быть запущены одновременно, первые 5 выполняются примерно за 10 мсек, но 6-й должен ждать целую секунду, чтобы даже начать обрабатываться … Почему это происходит?
Большое спасибо заранее за любые усилия, приложенные, чтобы помочь мне
CBroe, вероятно, прав. Если вы используете сессии (session_start ()), PHP будет одновременно обслуживать только один запрос к одному клиенту (session_id). Пока один запрос обслуживается, другой ставится в очередь, пока первый сеанс не записывает сеанс. Файл сеанса заблокирован для предотвращения записи нескольких запросов в один сеанс, что может привести к неожиданным результатам. Сессия записывается либо по завершении сценария, либо путем вызова session_write_close (). Это освободит вашу сессию для следующего запроса.
Однако я чувствую себя обязанным сказать вам, что вы делаете это неправильно. Вы не должны минимизировать JS и CSS с помощью PHP. Вот причины:
Я предлагаю вам лучше потратить свое время не на написание сценариев минификации, а на изучение инструментов сборки (Grunt или Gulp), которые будут выполнять эту работу за вас и гораздо больше, чем вы захотите / сможете написать на PHP.
В двух словах, как весь этот процесс работает
Умение настроить это очень пригодится любому веб-разработчику. Кроме того, это освободит ваше время для создания самого веб-приложения.
Вопрос не решен, однако я нашел хостинг-провайдера, с которым эта проблема просто не появляется. Тогда это проблема хостинга, и это должно быть связано с тем, как он назначает потоки PHP запросам — кажется, что мои старые хосты делали это ТОЛЬКО с помощью одной секунды. Это все, что я знаю сейчас.