Одна из страниц в одном из моих приложений работает очень медленно на веб-сервере по сравнению с моим локальным тестовым сервером.Существуют некоторые радикальные различия в средах, которые могут это объяснить, но я надеюсь на более решаемое решение, чем это.
Сервер:
Solaris 10
Apache 2.2.9 Prefork
PHP 5.2.6
Сервер запущен в кластере из 4-х блоков Sun, которым нет даже года, и не должен иметь проблем с производительностью.
Локальный тестовый сервер:
Windows XP
Apache 2.2.14 WinNT
PHP 5.3.1
На самом деле это мой собственный рабочий стол - приличная машина, но должна бледнеть по сравнению с блоками Sun.
Приложение написано с использованием CodeIgniter, и я использовал функции профилирования, чтобы отследить замедление до Model :: Model ().Например, Model :: Model () запускается в 0,0006 с локально и 0,0045 с на сервере.Когда вы загружаете сотни моделей на страницу, это, очевидно, проблема.
Я добавил это здесь из ServerFault, так как он может быть более тесно связан с CodeIgniter.
С локальной страницы загрузка занимает 2-3 секунды.С сервера это 11-15.
Модули на локальном, но не удаленном:
- mod_actions
- mod_asis
- mod_dav mod_dav_fs
- mod_dav_lock
- mod_isapi mod_autoindex_color
Модули на удаленном, а не локальном:
- mod_authn_dbm
- mod_authn_anon
- mod_authz_dbm
- mod_authz_owner
- mod_cache
- mod_mem_cache
- mod_deflate
- mod_authnz_ldap
- 1055
- * mod_mime_magic
- mod_expires
- mod_unique_id
- mod_autoindex
- mod_suexec
- mod_userdir
- libphp5
- 1069mod_dtrace
- mod_security2
Редактировать:
Я постепенно сдвигал свой бенчмаркинг, уровень за уровнем иобнаружил, что наибольшее расхождение лежит в этом фрагменте кода (который находится в функции CodeIgniter Model :: _ assign_libraries и называетсяво время конструктора модели):
$time = microtime()*1000;
foreach (array_keys(get_object_vars($CI)) as $key)
{
if ( ! isset($this->$key) AND $key != $this->_parent_name)
{
// In some cases using references can cause
// problems so we'll conditionally use them
if ($use_reference == TRUE)
{
$this->$key = NULL; // Needed to prevent reference errors with some configurations
$this->$key =& $CI->$key;
}
else
{
$this->$key = $CI->$key;
}
}
}
if (get_class($this) == 'SeatType')
echo sprintf('%.5f ms|', (microtime()*1000 - $time));
Локально, это печатает около 0,48 мс за каждую итерацию.В кластере он печатает около 3,9 мс за каждую итерацию.
Я начинаю задумываться, не связана ли эта проблема с Apache / PHP - я скопировал файлы php.ini и htconf на свой локальный сервер, и(после удаления mod_dtrace и практически ничего другого) я действительно увидел увеличение производительности.(Приведенная выше проверка теперь печатает .2ms локально.)