Делаем проект на Zend FW. Проект почти закончен, пришел этап оптимизации. Одним из шагов было решено сделать объединение всех исходных кодов в один файл, для уменьшения количества инклюдов, и соответственно, уменьшения времени загрузки (да-да-да, по мотивам
куроводства). Досталась эта почетная миссия мне.
Для начала решил собрать весь Zend FW в один файл. Сказано — сделано, написал скриптик, вырезающий все инклюды напрямую из классов Zend и склеивающий их в один файл в нужном порядке, чтобы классы, использующиеся другими классами (extends или implements), были соответственно выше родителя. Получил на выходе файл размером 10.7Мб. Для проверки написал скриптик, подключающий этот файл — все гут, ошибок нету, все определено, можно юзать. Но не тут-то было.
Включил этот файл в основное приложение — посыпались ошибки, мол «Class not found», хотя эти классы 100% определены в собранном файле, причем некоторые есть, некоторых нету. Чудеса.
Ладно думаю, подключу файлы Zend по одному, посмотрю, что получаться. Сделал — все работает.
Ладно, написал 2 скриптика:
<?php
require_once 'Zend.php'; //наша мега библиотека
<br/><br/> echo count(get_declared_classes());
и соответственно:
<?php
require_once ('Zend/Date/DateObject.php');;
require_once ('Zend/Filter/Interface.php');;
...
require_once ('Zend/Validate/Hostname/Com.php');;
require_once ('Zend/Validate/Hostname/Jp.php');;
<br/> echo count(get_declared_classes());
И что бы вы думали? в первом случае 1654, во втором — 1705. Нда, куда делся 51 класс?
Разбил этот один файл на 2 (пополам), подключил — 1705! Непонятно…
Ладно, решение найдено. Неплохо бы теперь все это дело закешировать чем-нибудь (имеется в виду байт-код). Кандидаты — APC Cache и eAccelerator, были настроены на кеширование больших файлов (apc.max_file_size=«10M» и eaccelerator.shm_max=«10M»).
Скажу сразу, eAccelerator заставить работать не удалось, выкидывает ошибку «Cannot redeclare class...» и потом скрипт перестает выполняться вообще, в логах апача появляется странное сообщение "[notice] child pid 9428 exit signal Segmentation fault (11)", помогает только рестарт апача.
Ну а выигрышь от объединения и кеша можно посмотреть по таблице ниже (замеры делал при помощи jmeter)
|
Samples |
Avg |
Min |
Max |
Throughput |
1. APC кэш выключен, инклюды всех файлов по одному: |
100 |
961 |
953 |
996 |
1.04 |
2. APC кэш выключен, инклюды 2 больших файлов со всеми классами: |
100 |
757 |
755 |
799 |
1.3 |
3. APC кэш включен, инклюды всех файлов по одному: |
100 |
303 |
293 |
1229 |
3.3 |
4. APC кэш включен, инклюды 2 больших файлов со всеми классами: |
100 |
119 |
108 |
1020 |
8.3 |
В общем, результат налицо.
Осталось невыясненным 2 обстоятельства:
1. странное поведение require_once, при включении одного большого файла куда то пропадают классы
2. работа eAccelerator при кешировании больших файлов