Call-back icon  Sales: Call 800.374.8146 (N America)|757.278.0920 (International)

Magento

Open Source eCommerce Evolved

Скорость почти выросла на пол минуты!

В общем всё дело, оказывается, в /app/code/core/Mage/Core/functions.php функция __autoload().

info: Она (__autoload) служит для автоматической загрузки файла класса которую использует PHP5 если определение класса не найденна перед его использованием.

Как видно в оригинальной functions.php параметр функции парсится на кусочки, строится относительны путь файла и вводится в include()
После этого PHP5 с ‘бешеной’ скоростью начинает рыть файловую систему для поиска файла, путь которого задан относительно. Это стоит ему много труда и времени, да и общее время суммируется для всех файлов. Задав абсолютный путь, работа для него намного упрощается.
Приблизительно вот так:

function __autoload($class)
{
    
if (strpos($class'/')!==false{
        
return;
    
}
    $classFile 
uc_words($classDS).'.php';
    
$a explode('_'$class);
    
Varien_Profiler::start('AUTOLOAD');
    
Varien_Profiler::start('AUTOLOAD: '.$a[0]);

    
$firstWay $a[0];
    
$cPrefix '';
    
    switch (
$firstWay){
        
case 'Zend':
        case 
'Varien':
            
$cPrefix '/web/projects/magento_dev/lib/';
        break;
        
        case 
'Mage':
            
$cPrefix '/web/projects/magento_dev/app/code/core/';
        break;
        
    
}
    
include ($cPrefix $classFile);
    
    
Varien_Profiler::stop('AUTOLOAD');
    
Varien_Profiler::stop('AUTOLOAD: '.$a[0]);
}
Конечно же, можно использовать некоторые параметры коренных путей из конфигурации и т.д. но здесь показана лишь суть решения выше сказанной проблемы.
Пользователям Windows для тестировки лучше использовать двойную обратную косую черту для разделителей папок в место обычной косой (/) так как и здесь съедается некоторое количество времени.

для проверки чистого времени рендеринга можно использовать в index.php временно следующее:

function getmicrotime() 
    
list($usec$sec) = explode(" ",microtime()); 
    return ((float)
$usec + (float)$sec); 
}
$time_start 
getmicrotime();

require_once 
'app/Mage.php';
umask(0);
Mage::run('base');

$time_end getmicrotime();
$time $time_end $time_start;
echo 
"Rendered in $time seconds";
p.s. Данный профайлинг времени нужно убрать если используете ajax так как он не сработает с мешающими ему символами.

В Linux временной выигрыш чуть меньше из-за лучшего I/O показателя для файлов, чем в Windows.

RSS comments feed for this entry

User Comments

|8 comments
  1. Moshe

    1Moshe posted Fri, February 1, 2008

    K сожалению мы не сможем включить эти изменения в распространяемую копию, т.к. это сломает community и local модули.

    Kстати, в PHP5 microtime(true) возвращает float.

  2. Garri

    2Garri posted Fri, February 1, 2008

    Ну хорошо, если нет возможности каким либо образом автоматизировать. Нет так нет smile
    Тем более что это может сломать community и local модули. Однако всегда можно что-то да и придумать.

  3. Garri

    3Garri posted Fri, February 1, 2008

    Единственно что мне хотелось так это попробовать помочь разогнать магенто в скорости.

  4. Garri

    4Garri posted Fri, February 1, 2008

    Стоит ли мне далее что-либо предпринимать в области оптимизации SQL или кода? а то жаль времени.

  5. 5Michael posted Fri, February 1, 2008

    Добрый день, Garri,

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

    Спасибо.

  6. Garri

    6Garri posted Fri, February 1, 2008

    Только что проверил на сильной машине там разница конечно не большая с 2.2 sec в 1.9 sec
    Это не то что на моём старом нотебук.
    В общем ничего не буду далее искать. А тем более что это никому не нужно. Тут важнее сэкономить время на developing. Через пару лет машины будут на сотнях CORE.  smile

  7. Garri

    7Garri posted Sun, February 3, 2008

    Возникла идея:
    Можно все пути классов сохранить в Cache.
    Если например classPathCacheEnabled тогда если найден Mapping : className => classPath использовать его если нет то внести сначала в Cache. Так же можно заключить в try/catch некоторую логику и в случае, например при не нахождении файла и если Cache включен, а разработчик изменил имя класса или его физический путь то автоматом правится Mapping в Cache.

    В таком варианте community и local модули ни как не смогут поломаться.

  8. Garri

    8Garri posted Mon, February 4, 2008

    Была бы моя воля я бы везде использовал следующую кострукцию:
    Mage:import(’Mage_...’), Mage:importOnce(’Mage_...’)
    и т.д. включительно ZF и Varien классы.
    Отрицательная сторона это то что мой IDE - Eclipse не сможет правильно определить Модель Классов в своём Кеше, но это не так уж и важно если данный метод того стоит. wink


Sales: Call 800.374.8146 (North America) 757.278.0920 (International)
© Copyright 2008 Varien. Magento is a trademark of Irubin Consulting Inc. DBA Varien
Privacy Policy|Terms of Service
Magento Community Count
33268 users|355 users currently online|73918 forum posts