Производительность PHP+IIS+Oracle
Установлено следующее:
На машине1 (3ГГц Dual Core, 1GB RAM) с Windows XP SP2:
- IIS
- PHP Version 5.1.2 как ISAPI модуль к IIS
- Oracle 9 Client, подружен с PHP
На машине2 (2.8ГГц, 512Mb RAM) с Windows 2003 Server Enterprise Edition SP1:
- Oracle 9 Enterprise Edition
На машине1 выполняется весьма ресурсоёмкий PHP скрипт вывода графика, который открывает курсор в Oracle, последовательно вытягивает около 10000 строк данных при помощи ocifetchinto.
Собственно, кусок кода вот, если нужно:
{
if ($direction == 0) // forward direction
{
$from_value = $ARow[0];
$to_value = $ARow[1];
}
else // reverse direction
{
$from_value = $ARow[1];
$to_value = $ARow[0];
}
if ($from_value == $from_menuid && in_array($to_value, $c_menuid))
{
$event_val = $ARow[2];
$color = DBColor2RGBArray($plot_colours[$to_value]
$s_time = $ARow[3];
// convert sql time to unix
$time_parts = explode(”-”, $s_time);
$event_time = mktime((integer)$time_parts[3], (integer)$time_parts[4], (integer)$time_parts[5], (integer)$time_parts[1], (integer)$time_parts[2], (integer)$time_parts[0]);
$shift1 = (integer)array_search($to_value, $c_menuid);
$event_time = date_adjust_DST($from_time, $event_time);
//calc the difference in days (event_time - from_time)
$diff_hours=hours_diff($from_time, $event_time);
//calc the difference in days (event_time - from_time)
$diff_hours=hours_diff($from_time, $event_time);
$bar_x = ($diff_hours * $c_menuid_count + $shift1) * $LgX;
// calc bar height
$bar_y = $plot_Ln * $event_val;
imagefilledrectangle($im, $plot_Ox + $bar_x, $plot_Oy, $plot_Ox+$bar_x+$LgX, $plot_Oy - $bar_y, imagecolorallocatealpha($im, $color[0], $color[1], $color[2], C_GFX_FILLTRANSPARENCY));
imagerectangle ($im, $plot_Ox + $bar_x, $plot_Oy, $plot_Ox+$bar_x+$LgX, $plot_Oy - $bar_y, $black);
}
}
Скрипт выполняется довольно долгое время: 10-15 секунд. Хотя, если ставить метки в начале и в конце скрипта, PHP на его выполнение тратит всего 4 секунды.
Я проанализировал трафик при помощи WireShark (Ethereal), и увидел, что все 10 секунд по сети передаются данные с машины2 на машину1. Скрипт просто медленно вытягивает данные из БД, при том, что средняя загрузка ЦП на обеих машинах не превышает 10%, память почти не растёт, и занята на уровне 40-50% RAM. Загрузка сети - 8%. Как только график заканчивает строиться, загрузка падает. Это данные из Task Manager.
Во время выполнения, на машине1, процессорное время максимальное у inetinfo (процесс IIS).
Подскажите пожалуйста, где здесь может быть узкое место. Возможно ли связке PHP+ISS выделить больше системных ресурсов с целью ускорения выполнения скрипта? Скрипт выполняется на небольшом объеме тестовых данных, а в реальной жизни время выполнения может быть порядка 2х минут. ![]()