Назад | Перейти на главную страницу

PHP-запрос иногда очень медленный

У меня есть скрипт PHP / Mysql, работающий на сервере apache / php4 (php4 - это временно, пока не будет готов новый сервер ...), и я заметил какое-то странное поведение.

Запросы, которые используют некоторый php или несколько простых запросов mysql, обычно довольно быстрые. Но если я отправлю один и тот же запрос на сервер 10 раз (один за другим, без большой нагрузки), возможно, 8-9 раз он завершится в течение 50 мс. Но один или два запроса займут более 5 секунд каждый. Ничего промежуточного, всего ~ 50 мс или несколько секунд.

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

Есть ли у кого-нибудь идеи, что может вызвать эту проблему и как ее исправить?

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

  1. Это может быть конфигурация apache (максимальное количество клиентов может быть установлено на действительно малое количество - однако сомнительно). Пытаться Тест Apache (ab)

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

  3. Возможно, ваши PHP-скрипты действительно интенсивны, а на вашем сервере просто нет оборудования для поддержки такого уровня активности.

  4. РЕДАКТИРОВАТЬ: взгляните на Мунин который даст вам исчерпывающий обзор производительности вашего сервера, а затем будет отслеживать его по мере выполнения запросов.

Все это очень субъективно. Может быть, кто-то другой может указать на другие потенциальные проблемы.

Как отмечают другие, определить проблему может быть сложно. Однако вы можете проверить выполнение сценария. Если проблема очевидна для PHP, скорее всего, она связана с PHP или базой данных.

Вы можете проверить выполнение скрипта, выполнив что-нибудь вроде :;

function checkpoint(){
   $mtime = microtime(); 
   $mtime = explode(" ",$mtime); 
   $mtime = $mtime[1] + $mtime[0]; 
   return $mtime;
}

function measureGaps($data){
    $size = count($data);
    for($i=0; $i < $size - 1; $i++){
      $p = $i+1;
      $gap[]= $data[$p] - $data[$i];
     }
    return $gap;
}

На каждом контрольно-пропускном пункте вы можете:

$checkpointArray[] = checkpoint();

В конце скрипта вызовите другую функцию:

var_dump(measureGaps($checkpointArray));

Если вы не хотите делать var_dump, измените вывод на запись в файл.