laravel4 доктрината не използва apc кеша

Моят проблем е основно, че doctrine не използва apc кеширания резултат при повторно изпълнение на същата заявка. Поради това получавам дълго време за изпълнение. Не намерих подобен проблем в нета.

Моята среда:

WAMP (32 бита) с PHP 5.4.16 на Windows7. MySQL база данни на отдалечена база данни със среден ping 87ms. Laravel4 с пакет laravel-doctrine, инсталиран чрез композитор:

doctrine/dbal - 2.4.x-dev
doctrine/orm  - 2.4.x-dev

Моят проблем:

Конструкторът на заявки за кеширани доктрини не използва кешираните apc данни.

Запитване:

    $query = Doctrine::createQueryBuilder();

    $query->select('e')->from("Persistent\Users\Experts\Expert", "e");

    $this->prepareSort($sort, $query);
    $query->orderBy($this->sortField, $this->sortVector);

    //prepare paginator
    $queryPaginator = new DoctrinePaginator($query);
    $this->total = $queryPaginator->count();

    return $queryPaginator  ->getQuery()
                            ->setResultCacheDriver(new ApcCache())
                            ->useResultCache(true, 300, 'expertsearch')
                            ->setFirstResult(0)
                            ->setMaxResults(20)
                            ->getResult();

Резултат:

Изпълнението на заявката отнема около 17 секунди поради разстоянието между моята машина и сървъра на базата данни.

Активирането на кеширането, както е показано по-горе, не влияе на скоростта.

Кешът за използване на APC изглежда по следния начин:

DoctrineNamespaceCacheKey[] 1   584 2013/10/30 08:33:08 2013/10/30 08:33:08 2013/10/30 08:33:08 None    [Delete Now]
[expertsearch][1]   0   27880   2013/10/30 08:33:08 2013/10/30 08:33:08 2013/10/30 08:33:08 300 seconds [Delete Now]
[121cbb9b3c38e7d5a0c0e7b74c59e640][1]   0   3672    2013/10/30 08:33:08 2013/10/30 08:33:08 2013/10/30 08:33:08 None    [Delete Now]

Webgrind не показва промяна в броя на извикванията към PDO в сравнение с времето, когато не се използва кеша в конструктора на заявки.

Function        Invocation Count    Total Self Cost     Total Inclusive Cost
php::PDOStatement->execute      183     15932   15932
php::PDO->query         7   588     588

person Mark    schedule 30.10.2013    source източник


Отговори (1)


APC кешът се използва за съхраняване на OPCode, ако искате да съхранявате заявки, трябва да използвате Memcache

http://docs.doctrine-project.org/en/2.0.x/reference/caching.html#memcache

Редактиране 1:

Тъй като ме помолихте да доразвия отговора си, ще го направя.

Как работи PHP (опростено)? RE2C първо ще направи лексикален анализ (за >=PHP5.3 и Flex за ‹=PHP5.2).

Tokens се генерират.

След това анализаторът трябва да анализира токените. Например изглежда дали имате "(" след функция (T_FUNCTION, T_IF, T_OPEN...) Името на анализатора е Bison.

След това вашият код се компилира в таблица от OPCode. За финал, има изпълнител, който ще изпълни вашия код PHP.

Така че, ако искате, само за да изпълните кода си, а не да анализирате и анализирате... така че можете да използвате PHP accelerator като APC. Така че вашият PHP код ще се изпълни много по-бързо, но заявките се изпълняват всеки път, когато извикате кода си. Прав си, документацията на Doctrine не казва, че не съхранява РЕЗУЛТАТА от заявки, но тъй като използва APC, тя просто съхранява ЗАЯВКАТА.

Memcache е система за памет за кеширане на разпределени обекти, тя съхранява резултата от заявка. Има разпределен сървър.

Надявам се, че бях по-ясен в този отговор, съжалявам, ако английският ми не е много добър...

person Mirza Selimovic    schedule 30.10.2013
comment
Предоставеният URL адрес на документацията не казва, че APC не съхранява резултати от заявка. Всъщност дори показва пример как да използвате APC: docs.doctrine-project.org/en/2.0.x/reference/caching.html#apc - person Mark; 30.10.2013
comment
Бихте ли доразвили отговора си малко повече? - person Mark; 30.10.2013