Долгое время до значения первого байта для пустого файла php

Несколько месяцев у меня был такой вопрос тому назад. Теперь, чтобы изолировать проблему, я попробовал новый подход. Я кладу на свой сервер пустой файл.

Имя файла - «foobar.php». Его содержание следующее:

<?php
echo "hello world";

Но когда я пытаюсь войти на example.com/foobar.php, я получаю

DNS 203 миллисекунды
Подключиться 3,33 секунды
Отправлено 0 миллисекунд
Время до первого байта 17,35 секунды
Получено 1 миллисекунды Общее время загрузки 20,88 секунды

Затем я помещаю другой файл под названием «foobar.txt». Его содержание следующее:

hello world<br/>

Время загрузки foobar.txt составляет примерно 0,2 секунды.

Этот веб-сайт находится на общем хостинге, поэтому я не могу получить root-доступ к Linux. Я пытаюсь выяснить, что замедляет работу моего сайта.

  • Когда я получаю эти результаты, у меня на сайте 60 посетителей. И они отправляют запросы AJAX, когда они активны. Когда они активны, они отправляют запрос AJAX почти каждые 3 секунды.
  • Обычно на моем сайте 5-20 запросов в секунду.
  • Мой хостинг-провайдер говорит, что перегрузки процессора не происходит, в целом она очень низкая.
  • Я спросил хостинговую компанию об ограничениях Apache. Я получаю эти значения для всего разделяемого сервера:

MaxClients 300
MaxRequestsPerChild 4000
ThreadsPerChild 25

  • Страницы example.com/mybigpage.php и example.com/foobar.php открываются почти одновременно.
  • Если на странице есть txt, jpeg или другие расширения, они открываются мгновенно. Если расширение - php, оно открывается очень медленно.
  • CakePHP хранит файлы сессий в папке «/ httpdocs / app / tmp / sessions». Файлы сеанса удаляются через два часа после создания. Теперь в этой папке 3653 файла. Самый старый файл создан 2,5 часа назад.
  • В моей конфигурации обработчик PHP - это модуль Apache mod_php

Новое редактирование. Я разговаривал со своей хостинговой компанией. И сказал им, что «foobar.php» открывается почти за 20 секунд. Хотя в этом файле вообще нет кода. Они сказали мне, что помещают "foobar.php" на другие веб-сайты, которые мы используем на том же сервере. Я также попробовал "othersite.com/foobar.php". Он открылся мгновенно. Но «mysite.com/foobar.php» открылся почти за 15 секунд. Что могло бы вызвать такое поведение? Мы используем ту же конфигурацию PHP с другими сайтами, но они открываются мгновенно .. Может это из-за моих правил .htaccess? Или другое?

Новый Edit2: мой провайдер сказал мне, что на сервере не существует файла "apd.so". Похоже, я не могу использовать APD.

Что мне следует искать, чтобы найти узкое место?
Что может ограничить мой сайт?


Дополнительные данные: из phpinfo я получаю следующее:

'./configure' '--prefix = / usr / local / lsws / lsphp5' '--build = x86_64-redhat-linux-gnu' '--host = x86_64-redhat-linux-gnu' '--target = x86_64-redhat-linux-gnu '' --sysconfdir = / etc '' --datadir = / usr / share '' --includedir = / usr / include '' --libdir = / usr / lib64 '' --libexecdir = / usr / libexec '' --localstatedir = / var '' --sharedstatedir = / usr / com '' --mandir = / usr / share / man '' --infodir = / usr / share / info '' - -cache-file = .. / config.cache '' --with-libdir = lib64 '' --with-config-file-path = / etc '' --with-config-file-scan-dir = / etc /php.dd '' --disable-debug '' --with-pic '' --disable-rpath '' --without-pear '' --with-bz2 '' --with-curl '' - with-exec-dir = / usr / bin '' --with-freetype-dir = / usr '' --with-png-dir = / usr '' --without-gdbm '' --with-gettext '' --with-gmp '' --with-iconv '' --with-jpeg-dir = / usr '' --with-openssl '' --with-libexpat-dir = / usr / lib64 '' --with -pcre-regex = / usr '' --with-zlib '' --with-layout = GNU '' --enable-exif '' --enable-ftp '' --enable-magic-quotes '' - включить-сокеты '' --enable-sysvsem '' --enabl e-sysvshm '' --enable-sysvmsg '' --enable-wddx '' --with-kerberos '' --enable-ucd-snmp-hack '' --with-unixODBC = shared, / usr '' - -enable-shmop '' --enable-calendar '' --with-libxml-dir = / usr '' --with-mysql '' --with-mysqli '' --with-gd '' --enable- dom '' --disable-dba '' --without-unixODBC '' --enable-xmlreader '' --enable-xmlwriter '' --with-mcrypt '' --enable-mbstring '' --with-litespeed '' --enable-soap '' --with-xsl '' --with-pdo-mysql '' --with-pdo-sqlite '' --enable-sqlite-utf8 '' --with-pspell '' --with-sqlite = shared '' --with-xmlrpc '' --with-mhash '' --enable-pdo '' --with-imap '' --with-imap-ssl '' --without- suhosin '' --with-tidy '' --enable-zip '' --enable-inline-optimisation '' --enable-gd-native-ttf '' --enable-bcmath '


person Community    schedule 22.12.2012    source источник
comment
Возможно, вы захотите взглянуть на профилировщик xdebug, он даст вам хороший визуальный обзор того, какая часть требует времени.   -  person Michel Feldheim    schedule 26.12.2012
comment
@MichelFeldheim Должен ли запуск xDebug на моем локальном компьютере давать оценку? Потому что моя хостинговая компания не разрешает мне использовать xDebug.   -  person trante    schedule 26.12.2012
comment
Да, запуска xdebug на вашем локальном компьютере достаточно, чтобы определить потребителей времени.   -  person Michel Feldheim    schedule 26.12.2012
comment
поместите print_r(get_included_files()); в свой пустой файл php - если вы не загружаете пустой файл - он сообщит вам, какие файлы вы загрузили первыми. если у вас нет app/webroot/ в качестве корневого каталога документов вашего домена - вы должны учитывать любые добавленные вами правила mod_rewrite.   -  person AD7six    schedule 29.12.2012
comment
@ AD7six Я ​​написал и получил такой результат: Array ([0] = ›/var/www/vhosts/example.com/httpdocs/app/webroot/foobar.php)   -  person trante    schedule 29.12.2012
comment
@trante, то это не связано с фреймворком - у вас что-то не так с настройкой apache или каким-либо другим аспектом настройки вашего домена.   -  person AD7six    schedule 29.12.2012


Ответы (4)


Кажется очевидным, что это проблема PHP, поскольку Apache не имеет проблем с обслуживанием статических файлов. Вы пробовали установить APD из PECL?

Использование профилировщика PHP, такого как APD, покажет вам, есть ли узкое место в PHP, и если да, то где оно. Например, медлительность в используемой вами структуре? Или, может быть, просто мошенническое расширение?

Перефразируя официальное руководство:

С APD вы просто добавляете инструкцию в точку входа:

<?php
apd_set_pprof_trace();
?>

APD сохранит данные профилирования в * apd.dumpdir / pprof_pid.ext *.

Затем pprofp использует ваши файлы дампа и сообщает вам, какие методы сокращают время отклика:

bash-2.05b$ pprofp -R /tmp/pprof.22141.0

Trace for /home/dan/testapd.php
Total Elapsed Time = 0.00
Total System Time  = 0.00
Total User Time    = 0.00


Real         User        System             secs/    cumm
%Time (excl/cumm)  (excl/cumm)  (excl/cumm) Calls    call    s/call  Memory Usage Name
--------------------------------------------------------------------------------------
100.0 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0000   0.0009            0 main
56.9 0.00 0.00  0.00 0.00  0.00 0.00     1  0.0005   0.0005            0 apd_set_pprof_trace
28.0 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 preg_replace
14.3 0.00 0.00  0.00 0.00  0.00 0.00    10  0.0000   0.0000            0 str_replace

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

person mjk    schedule 26.12.2012
comment
Похоже, что php_apd.so не был загружен в конфигурацию хостинговой компании. Я отредактировал вопрос и добавил список расширений. - person trante; 26.12.2012
comment
Seems clear to be a PHP problem - разочарование, что этот ответ был награжден бонусом, начиная с теперь очевидного ложного утверждения. - person AD7six; 01.01.2013
comment
Проблема может заключаться в том, что Apache также полагается на ответ ... с той же проблемой сейчас, скрипт php запускается в течение 0,2 секунды, но ответ занимает 0,65 секунды. возврат статического содержимого за 0,02 секунды. - person Wazime; 28.05.2016

Вы пишете, что в то время, когда возникает эта проблема, у вас есть несколько клиентов, выполняющих запросы AJAX каждые 3 секунды. Это делает вероятным, что все рабочие PHP, доступные на вашем сервере, заблокированы этими запросами AJAX. Ваш веб-сервер получает ваш запрос на /foobar.php, а затем должен ждать, пока работник PHP освободится для обработки вашего запроса.

Итак, среди возможных решений вашей проблемы (если вы не уточняете, для чего нужен AJAX, мне нужно сохранить это общее):

  • запросы AJAX переходят в статический файл
  • убедитесь, что PHP действительно закрывает соединение по завершении запроса (AJAX), например, с помощью header("Connection: close"); (хотя этого может быть недостаточно, проверьте комментарии в Руководство PHP по обработке соединений)
  • уменьшить количество сделанных запросов AJAX (до количества, разработанного в сотрудничестве с вашим провайдером)

Как правило, в решении этой проблемы вам понадобится помощь вашего провайдера. Вы не указали, какой метод использует ваш провайдер для обслуживания PHP, например, в fpm есть параметр process.max, который может ограничивать способность ваших веб-серверов обрабатывать так много файлов PHP параллельно.

person akirk    schedule 30.12.2012
comment
Я уже спрашивал об этом: MaxClients 300, MaxRequestsPerChild 4000, ThreadsPerChild 25 .. Я был бы рад, если бы вы сказали мне, какие дополнительные параметры мне следует запросить у своего провайдера для получения дополнительной информации об этой проблеме .. - person trante; 31.12.2012
comment
- Для меня выполнение AJAX запроса обязательно. Для моего сайта очень важно, чтобы пользователи легко решали свои проблемы. Эти запросы должны указывать на функцию PHP. -Вы не писали, какой метод использует ваш провайдер для обслуживания PHP. Какие для этого есть варианты? Если вы можете подсказать мне альтернативы, я могу обратиться к своему провайдеру. Вы имеете в виду это. -Я использую jQuery для запросов AJAX. Итак, я полагаю, что jQuery закрывает соединение после получения ответа AJAX. - person trante; 31.12.2012
comment
Да, я имею в виду что-то в этом роде. MaxClients применяется, только если используется mod_php. Если они используют fpm, то применяется настройка, о которой я говорил выше. - person akirk; 31.12.2012
comment
Спасибо. Провайдер сказал мне, что обработчик PHP - это модуль Apache. Так о чем бы мне еще спросить? MaxProcessCount или еще что-нибудь? - person trante; 31.12.2012

Без сотрудничества с вашим провайдером у вас нет возможности выяснить, что не так.

Я бы предположил, что это что-то вроде проблем с диском io сеанса.

Еще один интересный момент заключается в том, что ваш провайдер использует: http://www.litespeedtech.com/php-litespeed-sapi.html Никогда не слышал об этом.

Если ваш провайдер будет следовать тому, что вам посоветовал mjk, вам просто нужно сменить провайдера. Похоже, что они не держат их под контролем.

person GreenRover    schedule 29.12.2012
comment
Спасибо за ответ. Я не мог понять последнее предложение. Вы имеете в виду, если провайдер не даст разрешения? - person trante; 29.12.2012
comment
Вам понадобится root-доступ к серверу, чтобы делать то, что вам сказал пользователь MJK (сообщение выше меня). Но хостер сегментов noz предоставит вам это. Но вы можете тогда попросить об этом. Но если они не связываются для отладки вашей проблемы и дают простой ответ, что процессор только простаивает. Я бы посоветовал вам сменить провайдера. - person GreenRover; 29.12.2012
comment
Что бы провайдер предоставил для решения MJK? Что я должен им сказать? относительно этого Они должны показать каталог apd.so, установить путь к каталогу дампа и Перезагрузить Apache? - person trante; 29.12.2012
comment
Это будет путь. Но потому что вы платите им за услуги. Я бы только поместил вас hello_world.php на сервер и сказал провайдеру, что недопустимо, чтобы у вас время загрузки было больше 0,01 секунды. - person GreenRover; 29.12.2012
comment
Обсуждаю с провайдером использование APD. Но я сомневаюсь в следующем: большую часть времени ожидания я занимаю из-за времени до первого байта. Значит, добавление apd_set_pprof_trace (); в первую строку моего кода покажет причину задержки? - person trante; 30.12.2012
comment
1.) Ваш провайдер должен это скомпилировать. Похоже, ваш провайдер не имеет ни малейшего представления о том, что он делает. 2.) Ваш провайдер должен устранить эту проблему. что бы я попробовал: запустить скрипт на cli, чтобы проверить время. Запустите сценарий per или другой cgi для проверки производительности. Когда у per также есть эта проблема, это проблема с apache / Webserver. В противном случае можно было бы отследить проблему с APD. 3.) Я все еще уверен, что это проблема с disk io. Также я попытаюсь отключить автоматический запуск сеанса и ведение журнала apache для тестирования. Если что-то из этого улучшает производительность, значит, у вас есть провайдер для отключения хостинга на одном хосте. - person GreenRover; 30.12.2012
comment
1-2) Мой провайдер не интересуется APD. Они не хотят перекомпилировать. Потому что они говорят мне, что я единственный клиент, у которого есть проблемы с этим сервером. 3) Если я отключу запись файлов сеансов, я не смогу проверить ситуацию. Может быть, отключение журнала apache может помочь, но это также зависит от провайдера .. 4) Есть ли что-нибудь и переменная, которые могут дать мне информацию о проблемах ввода-вывода диска. Поэтому я могу попросить поставщика указать значения параметров и т. Д. - person trante; 31.12.2012
comment
извините, но если ваш провайдер не заинтересован в помощи в поиске проблем, поищите другого провайдера. Вашему провайдеру не нужно перекомпилировать, вам нужно только скомпилировать один модуль. Первая идея состоит в том, чтобы отследить, насколько у них непреодолимый непрерывный процесс выполнения задач. unixhelp.ed.ac.uk/CGI/man-cgi?ps - person GreenRover; 31.12.2012

Если тот же пустой файл PHP загружается мгновенно при перемещении на другой сайт, это не может быть связано с какими-либо фреймворками или включенными файлами, потому что в этот момент не были загружены.

Это может быть проблема конфигурации на стороне php или Apache, или это может быть вызвано вашими правилами перезаписи. Я бы порекомендовал попробовать следующее:

1.) Если разрешены настройки PHP для каждого сайта, попросите хостинговую компанию переименовать ваш конкретный php.ini на другое имя, скопируйте php.ini с другого сайта и перезапустите Apache, посмотрите, поможет ли это. У меня была аналогичная проблема в Windows, и это было связано с проблемами доступа к файлам на php.ini, так что это может помочь.

2.) Временно переименуйте ваш .htaccess и снова получите доступ к файлу php. Если время загрузки уменьшается, у вас будет ошибочное условие перезаписи или другая директива. Не могли бы вы также опубликовать содержимое вашего .htaccess?

person SaschaM78    schedule 29.12.2012
comment
У меня было несколько строк gzip и перенаправления. Я почти опустошил свой htaccess, попробовал еще раз. Но это не помогло ... Я вставил свои файлы htaccess сюда - person trante; 29.12.2012
comment
Просто в целях тестирования, что произойдет, если вы временно удалите свой htaccess полностью? - person SaschaM78; 29.12.2012
comment
После удаления файла .htaccess я начал получать 500 Internal Server Error, поэтому я восстановил файл. - person trante; 29.12.2012
comment
Удаление файла htaccess не может быть причиной внутренней ошибки сервера. Предполагая, что ваш корневой веб-сайт будет чем-то вроде / usr / htdocs /, размещение foobar.php в корневом веб-каталоге и переход на www.mysite.com/foobar.php всегда должны работать без наличия какого-либо файла htaccess в каталоге. Итак, что произойдет, если вы удалите .htaccess, поместите phpinfo.php в корневой каталог с <?php phpinfo(); ?> в качестве содержимого и откроете его в браузере? - person SaschaM78; 29.12.2012
comment
Я не могу поместить какой-либо файл в свой / usr / htdocs, потому что CakePHP требует, чтобы мои корневые файлы были помещены в / usr / htdocs / app / webroot. Итак, из своего корня я перенаправляю пользователя в корневую папку для доступа к корневым файлам с помощью файлов .htaccess. Удаление .htaccess внутри моей корневой папки приведет к сбою всего моего сайта. В такой ситуации никто не будет посещать мой сайт, поэтому нагрузка будет очень низкой, и я не увижу разницы во времени. - person trante; 29.12.2012
comment
Вот почему я написал предполагая, потому что я не знал путь к вашему корневому веб-каталогу ;-) Чтобы выяснить, что на самом деле вызывает проблемы, может это быть php.ini, конфигурация Apache или .htaccess, вы временно необходимо переименовать .htaccess после того, как вы поместите phpinfo.php в корневой каталог, затем откройте www.mysite.com/phpinfo.php, и если он откроется мгновенно, это будут правила htaccess. - person SaschaM78; 29.12.2012
comment
Я не могу поместить какой-либо файл в свой / usr / htdocs, потому что CakePHP диктует [...] - это ерунда, и указывает, что у вас есть development-style install то, что вам нужно сделать, это поместить файлы корневого веб-каталога прямо в /user/htdocs/ дополнительная информация в книге. это также означает, что example.com/foobar.php не указывает прямо на ваш php файл - вы полагаетесь на mod_rewrite, чтобы переписать запрос на example.com/app/webroot/foobar.php - person AD7six; 29.12.2012
comment
Да, я полагаюсь на mod_rewrte для перенаправления пользовательского запроса в папку webroot. Но поскольку это общий хостинг, могу ли я изменить DocumentRoot ценность Apache? - person trante; 29.12.2012
comment
Так вы хоть раз пытались проверить, не вызвано ли замедление правилами htaccess? Я понимаю, что вы хотите использовать правила перезаписи, но какой толк в модных URL-адресах, если все ваши страницы загружаются ужасно медленно? Люди, как правило, не посещают страницы, если загрузка страниц занимает 20 секунд. По поводу вашего вопроса об изменениях DocumentRoot: некоторые провайдеры предлагают изменить базовый каталог для данного веб-сайта с помощью CPanel или любого другого интерфейса управления, который они предлагают. В противном случае попробуйте следовать этому руководству: CakePHP на Общие хосты - person SaschaM78; 31.12.2012
comment
@ SaschaM78 @ AD7six Я ​​поменял свой DocumentRoot на /usr/htdocs/app/webroot. Сейчас я не использую .htaccess из /usr/htdocs. Я использую только htaccess из /usr/htdocs/app/webroot. - person trante; 31.12.2012
comment
Хорошо, где вы могли изменить docroot, но вы также тестировали время доступа к скрипту с временно удаленным htaccess? - person SaschaM78; 01.01.2013