0

我的问题基本上是当重新运行相同的查询时,学说不使用 apc 缓存的结果。因此,我的执行时间很长。我在网上没有发现类似的问题。

我的环境:

WAMP(32 位)PHP 5.4.16在 Windows7 上。87ms具有平均 ping的远程数据库上的 MySQL 数据库。Laravel4 通过 composer 安装了 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
4

1 回答 1

0

OPCode如果要存储应使用的查询,则APC 缓存用于存储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 acceleratorlike APC。因此,您的PHP代码将执行得更快,但是每次调用代码时都会执行查询。你是对的,Doctrine 的文档并没有说它不存储查询的结果,但由于它使用 APC,它只存储查询。

Memcache是一个分布式对象缓存内存系统,它存储查询的结果。它有一个分布式服务器。

我希望我在这个回复中更清楚,如果我的英语不是很好,对不起......

于 2013-10-30T09:02:29.027 回答