«Load-scripts.php» зависает и время ожидания при запросе plupload

У меня проблема с WordPress. Когда страницы под / admin / загружают «load-scripts.php» с «plupload» в качестве одного из аргументов, он зависает навсегда. Страница «Добавить новую почту» – одна из таких страниц. Например, этот URL-адрес зависает навсегда:

http://example.com/wp-admin/load-scripts.php?c=0&load%5B%5D=jquery-core,jquery-migrate,utils,plupload,json2&ver=3.9.1

Хотя это немедленно возвращается:

http://example.com/wp-admin/load-scripts.php?c=0&load%5B%5D=jquery-core,jquery-migrate,utils,json2&ver=3.9.1

Когда я говорю «зависать вечно», я имею в виду, что он висит несколько минут и, наконец, просто возвращает частичный результат без ошибок. Частичным результатом я имею в виду миниатюрный Javascript, который внезапно заканчивается в середине выражения.

Я запустил WordPress версии 3.9.1 и 3.8 на Apache с libapache2-mod-php5, Nginx с php5-fpm и просто используя встроенный сервер разработки PHP. Во всех случаях эта проблема все еще возникает.

Я понизил рейтинг до версии 3.0, и проблема исчезла. В этой версии «load-scripts.php» не пытается извлечь plupload. Поскольку мне не удалось найти решение этой проблемы с помощью Google, я предполагаю, что это проблема с моим сервером, а не с ошибкой WordPress.

Использование set_time_limit имеет никакого эффекта, сценарий все еще висит навсегда. Я не ошибаюсь ни в каких журналах, ни в консоли при использовании сервера разработки php.

По какой-то причине, заменив это (самые нижние строки load-scripts.php):

 header('Content-Type: application/x-javascript; charset=UTF-8'); header('Expires: ' . gmdate( "D, d MYH:i:s", time() + $expires_offset ) . ' GMT'); header("Cache-Control: public, max-age=$expires_offset"); if ( $compress && ! ini_get('zlib.output_compression') && 'ob_gzhandler' != ini_get('output_handler') && isset($_SERVER['HTTP_ACCEPT_ENCODING']) ) { header('Vary: Accept-Encoding'); // Handle proxies if ( false !== stripos($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') && function_exists('gzdeflate') && ! $force_gzip ) { header('Content-Encoding: deflate'); $out = gzdeflate( $out, 3 ); } elseif ( false !== stripos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && function_exists('gzencode') ) { header('Content-Encoding: gzip'); $out = gzencode( $out, 3 ); } } echo $out; exit; 

С этим:

 header('Content-Type: application/x-javascript; charset=UTF-8'); header('Expires: ' . gmdate( "D, d MYH:i:s", time() + $expires_offset ) . ' GMT'); header("Cache-Control: public, max-age=$expires_offset"); // if ( $compress && ! ini_get('zlib.output_compression') && 'ob_gzhandler' != ini_get('output_handler') && isset($_SERVER['HTTP_ACCEPT_ENCODING']) ) { // header('Vary: Accept-Encoding'); // Handle proxies // if ( false !== stripos($_SERVER['HTTP_ACCEPT_ENCODING'], 'deflate') && function_exists('gzdeflate') && ! $force_gzip ) { // header('Content-Encoding: deflate'); // $out = gzdeflate( $out, 3 ); // } elseif ( false !== stripos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') && function_exists('gzencode') ) { // header('Content-Encoding: gzip'); // $out = gzencode( $out, 3 ); // } // } echo "SUCCESS"; exit; echo $out; exit; 

Заставляет сценарий мгновенно возвращать «УСПЕХ». Если я не закомментирую блок сжатия, возвращаются нежелательные данные. По-видимому, скрипт зависает на echo $out . Я предполагаю, что эта ошибка связана с сжатием, но я не знаю, что делать с этой информацией.

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

Спасибо заранее за любые предложения.


Изменить: я просмотрел сценарий дальше, используя CURL. Я попытался запросить «load-scripts.php» с «Accept-Encoding», установленным в gzip, deflate и ничего. Это не имело значения. Во всех случаях скрипт мгновенно возвращает кучу данных, затем зависает в середине оператора Javascript. Кажется, что он останавливается в случайном месте на выходном Javascript для каждого запроса. Я включил все отчеты об ошибках и установил допустимую память на 2048M, что тоже не имело никакого значения. Я начинаю думать, что здесь есть некоторые проблемы с низким уровнем PHP, которые я не смогу понять.


Новое редактирование: я уже экспериментировал. Оказывается, если я просто var_dump($out); и exit; сразу после построения $out скрипт все еще зависает. Это должно иметь какое-то отношение к размеру печатной строки (216459 символов.) Часть строки отправляется в браузер, тогда запрос просто зависает (в одном случае длиной до 6 минут), прежде чем просто умирает, не вызывая остаток строки. Никаких ошибок не сообщается нигде.


Еще одно редактирование: я положил это в начало скрипта:

 header('Content-Type: application/x-javascript; charset=UTF-8'); header('Expires: ' . gmdate( "D, d MYH:i:s", time() + $expires_offset ) . ' GMT'); header("Cache-Control: public, max-age=$expires_offset"); var_dump(str_repeat("foo", 350000)); exit; 

И 1 050 000 символов str быстро и успешно отправляется в браузер без проблем. Это не имеет ничего общего с размером вывода.

Короткий и антикризисный ответ: большой корпоративный брандмауэр, защищающий сервер, был настроен на режим «приложения» HTTP. Мы переключили его на простое разрешение всего трафика на порт «80», и проблема была решена. Rarst ♦ был прав!

Я знаю, что вы сказали, что у вас тоже есть проблема с Apache, но я могу говорить только для Nginx. Я нашел это во время поиска в Google, чтобы решить то, что кажется этой точной проблемой. Я исправил запуск sudo chown -R www-data:www-data /var/lib/nginx .