Что я могу сделать, чтобы повысить скорость чтения файлов на PHP-сервере IIS?

Я столкнулся с конфигурацией PHP-сервера WINDOWS IIS6, и, судя по моим тестам, скорость чтения файлов очень плохая.

Я получаю скорость чтения для файла размером менее 300 000 байт от 0,89 до 1,8 секунды. Сравните это с настройкой сервера Linux, где тот же код возвращает скорость 0,017752170562744 секунды.

Я тестировал как с readfile, так и с fopen.

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

Вот код, который я использую для тестирования

//updated
$file = '../assets/cache/siteCache.idx.php';

$time_start = microtime(true);
readfile($file);
$time_end = microtime(true);

$time2 = $time_end - $time_start;
echo $file . ': ' . filesize($file) . ' bytes' . '<hr />';
echo "Time to read with readfile: $time_end - $time_start = $time2 seconds<hr />";

$time_start = microtime(true);
$handle = fopen($file, "r");
fclose($handle);
$time_end = microtime(true);

$time1 = $time_end - $time_start;
echo $file . ': ' . filesize($file) . ' bytes' . '<hr />';
echo "Time to read with fopen: $time_end - $time_start = $time1 seconds<hr />";

person orbitory    schedule 02.01.2014    source источник
comment
Как вы тогда читаете файл? Как выглядит ваш код?   -  person Mark Baker    schedule 02.01.2014
comment
Вот код, который я использую для тестирования pastebin.com/Fe25HY2Q. CMS, которую я использую, работает немного по-другому, но код примерно такой же.   -  person orbitory    schedule 02.01.2014
comment
Вставьте свой код в вопрос (используйте ссылку для редактирования), немногие участники здесь зайдут за пределы сайта, чтобы прочитать его.   -  person Mark Baker    schedule 02.01.2014
comment
@orbitory вы пробовали использовать file_get_contents вместо readfile? поскольку это использует методы сопоставления памяти, если они доступны в вашей ОС, чтобы попытаться повысить производительность?   -  person Liam Sorsby    schedule 07.01.2014
comment
Кроме того, медленные результаты только через IIS или через интерфейс командной строки? Это может сузить круг вашей проблемы... Если бы это было быстро в режиме CLI, вы могли бы в значительной степени исключить проблемы, связанные с Windows, и сосредоточиться на IIS.   -  person Tasos Bitsios    schedule 07.01.2014
comment
Второй вывод $time бесполезен, вы не обновляете значение и поэтому видите то же значение, что и в readfile(). Кроме того, функция readfile() также выводит содержимое файла, что * может вызвать дополнительную загрузку процессора, что может маскировать высокое/низкое время чтения.   -  person Stijn van Grinsven    schedule 09.01.2014
comment
@StijnvanGrinsven: Спасибо, что заметили проблему. Я обновил код выше. Буду тестировать как можно скорее   -  person orbitory    schedule 09.01.2014
comment
Дополнительное примечание: сравнение readfile() с fopen/fclose не является честным испытанием: fopen() дает вам только дескриптор и не включает фактическое чтение файла. также используйте fread(), чтобы сделать его похожим на readfile()   -  person Stijn van Grinsven    schedule 09.01.2014
comment
@StijnvanGrinsven: подойдет, нужно точно определить, что именно использует CMS, которую я тестирую.   -  person orbitory    schedule 10.01.2014
comment
Вы пробовали Linux и Windows на одном и том же оборудовании или это виртуальное? Всегда может случиться так, что ваша машина с Windows имеет ужасное оборудование/драйверы: P (проверьте, смонтировав что-нибудь в ОЗУ, если можете)   -  person Anyone    schedule 12.01.2014
comment
Возможно, дело не в скорости чтения, а в скорости вывода. В настоящее время я изучаю это.   -  person orbitory    schedule 13.01.2014
comment
@StijnvanGrinsven - могу ли я разделить очки репутации? Вы помогли указать мне правильное направление. Спасибо еще раз   -  person orbitory    schedule 13.01.2014
comment
Оставьте баллы мне. Хотя я приближаю вас к решению / ответу, я ничего не ответил :)   -  person Stijn van Grinsven    schedule 14.01.2014


Ответы (2)


У вас может быть лучший прогресс, если вы посмотрите на физический диск, какой программный API вы используете.

Старые или более дешевые жесткие диски, скорее всего, будут иметь более медленное время поиска и меньшую пропускную способность. Установка быстрого твердотельного жесткого диска и перемещение вашего приложения на этот диск может потребовать гораздо меньше усилий, чтобы получить большую отдачу от затраченных средств.

Если это не вариант, вам может быть лучше использовать IIS для обслуживания ваших статических файлов с помощью чего-то вроде X-Sendfile:

https://github.com/stakach/IIS-X-Sendfile-plugin

person Winfield    schedule 13.01.2014
comment
Спасибо, я посмотрю на это или попрошу администратора установить его. В настоящее время изучает скорость вывода. Мой первоначальный тестовый код был ошибочным. Скорость чтения вроде нормальная. - person orbitory; 14.01.2014

Другим вариантом может быть установка opcache, такого как APC, который также доступен в Windows.

Это уменьшит количество чтений из ФС, потому что файл сохраняется в памяти (при правильной установке).

Во-вторых, вы можете хранить свою CMS на виртуальном диске, так что весь код будет находиться в памяти, а время доступа к каждому файлу будет сведено к минимуму.

person Flask    schedule 13.01.2014