Zend Framework и Mysql — очень медленные

Я создаю веб-сайт, используя php, mysql и zend framework. Когда я пытаюсь запустить любой SQL-запрос, время генерации страницы увеличивается примерно до 0,5 секунды. Это слишком высоко. Если я выключаю sql, генерация страницы составляет 0,001. Количество запросов, которые я выполняю, на самом деле не влияет на время генерации страницы (проверено 1-10 запросов). Остается на 0,5 секунды. Я не могу понять, что я делаю неправильно.

Подключаюсь к sql в бутстрапе:

protected function _initDatabase ()
{
    try
    {
        $config = new Zend_Config_Ini( APPLICATION_PATH . '/configs/application.ini', APPLICATION_ENV );
        $db = Zend_Db::factory( $config -> database);
        Zend_DB_Table_Abstract::setDefaultAdapter( $db );
    }
    catch ( Zend_Db_Exception $e )
    {

    }
}

Тогда у меня есть простая модель

class StandardAccessory extends Zend_DB_Table_Abstract
{
    /**
     * The default table name 
     */
    protected $_name = 'standard_accessory';

    protected $_primary = 'model';

    protected $_sequence = false;
}

И, наконец, внутри моего индексного контроллера я просто запускаю метод find.

require_once APPLICATION_PATH . '/models/StandardAccessory.php';
    $sa = new StandardAccessory( );
    $stndacc = $sa->find( 'abc' );

Все это занимает ~0,5 секунды, что слишком долго. Какие-либо предложения?

Спасибо!


person iBiryukov    schedule 14.08.2009    source источник


Ответы (3)


Советы:

person Bill Karwin    schedule 14.08.2009
comment
И запрос для BENCHMARK должен возвращать 1 строку, иначе mysql жалуется: ОШИБКА 1242 (21000): подзапрос возвращает более 1 строки. - person Leonel Martins; 15.08.2009
comment
@Leonel Martins: Верно, я предполагаю, что, поскольку OP использует find(), он ограничивает первичный ключ таблицы. Таким образом, должно быть гарантировано возвращение одной строки (или нулевых строк, если 'abc' не найден). - person Bill Karwin; 15.08.2009
comment
Первая ссылка на кэширование метаданных теперь недействительна, я предполагаю, что она была следующей: framework.zend.com/manual/1.10/en/ - person The Unknown Dev; 07.11.2016
comment
@KimberlyW, спасибо, я обновил ссылку и до текущей версии ZF 1.12. - person Bill Karwin; 08.11.2016

Самый простой способ отладить это - профилировать ваши запросы sql. вы можете использовать Firephp (плагин для firebug), см. http://framework.zend.com/manual/en/zend.db.profiler.html#zend.db.profiler.profilers.firebug

еще один способ немного ускорить работу — кэшировать метаданные ваших таблиц. см.: http://framework.zend.com/manual/en/zend.db.table.html#zend.db.table.metadata.caching

person Rufinus    schedule 14.08.2009

Наряду с приведенными выше предложениями я провел очень ненаучный тест и обнаружил, что адаптер PDO работает быстрее для меня в моем приложении (я знаю, что mysqli должен быть быстрее, но, возможно, это абстракция ZF). Я показываю результаты здесь (указанное время годится только для сравнения)

person Akeem    schedule 14.08.2009