使用Symfony2和Doctrine进行缓存 - 使用哪一个? phpFastCache是​​一个选项吗?

时间:2015-06-02 13:39:37

标签: php symfony caching doctrine-orm doctrine

这是关于构建在Symfony(2.7)和Doctrine(2.5)上的应用程序的一般性和特定问题,计划推送到2个不同的PHP PaaS平台。

一般部分:

我使用最新的PHP版本在本地开发(不想使用旧版本),但我的PHP PaaS平台的两个buildpack仅提供现代的5.4 PHP。

我想同时实现字节码缓存(当然)和对象/ var缓存。

了解自5.4以来APC无效(但仍然拥有Symfony最好的“内置”支持)并且没有找到任何提供字节码和对象缓存的通用缓存机制我最终试图实现{{3}作为我的缓存机制 - 我希望它能在两个5.4平台上运行(在另一种情况下仍然允许APC和另一种情况下允许使用xcache)。

在我遇到麻烦之前如何使用Symfony / Doctrine运行phpfastcache:

有没有人知道任何稳定的缓存模块,由Heroku / Cloudfoundry支持(标准的PHP buildpacks - 对我来说构建我的一个buildpack没有意义,部分失去了Paas的优点)并且运行在> PHP 5.4理想地支持字节码和对象缓存?

具体部分:

http://www.phpfastcache.com/对我很有希望!

我试图通过以下方式使用它:

1)实施我的PhpFastCacheProvider.php

这是为了实现Doctrine CacheProvider以及Validator CacheInterface的所有方法。

<?php

namespace My\MyBundle\Cache;

use Doctrine\Common\Cache\CacheProvider;
use Symfony\Component\Validator\Mapping\Cache\CacheInterface;
use Symfony\Component\Validator\Mapping\ClassMetadata;
use phpFastCache;

class PhpFastCacheProvider extends CacheProvider implements     CacheInterface
{
public function __construct()
{

    if (extension_loaded('apc') && ini_get('apc.enabled') &&     strpos(PHP_SAPI, "CGI") === false) {
        $driver = "apc";
    } elseif (extension_loaded('xcache') && function_exists("xcache_get")) {
        $driver = "xcache";
    } else {
        $driver = "auto";
    }

    phpFastCache::setup("storage", $driver);

}

public function doDelete($id)
{
    __c()->delete($id);
}

public function doFlush()
{
    __c()->clean();
}

public function doGetStats()
{
    return __c()->stats();
}

public function has($class)
{
    return $this->doContains($class);
}

public function doContains($id)
{
    return __c()->isExisting($id);
}

public function read($class)
{
    return $this->doFetch($class);
}

public function doFetch($id)
{
    $a = __c();

    $b = $this->doGetStats();

    $value = __c()->get($id);
    if ($value == null) {
        return false;
    }

    return $value;
}

public function write(ClassMetadata $metadata)
{
    $this->doSave($metadata->getClassName(), $metadata);
}

public function doSave($id, $data, $lifeTime = 0)
{
    __c()->set($id, $data, ($lifeTime == 0) ? 24 * 3600 : $lifeTime);
}

2)将我的课程注册为服务

    phpfastcache:
    class: My\MyBundle\Cache\PhpFastCacheProvider

3)更新config.yml以使用它

framework:
    validation: {enable_annotations: true, cache: phpfastcache }
doctrine:    
    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        auto_mapping: true
        naming_strategy: doctrine.orm.naming_strategy.underscore
        metadata_cache_driver:
            type: service
            id: phpfastcache
        result_cache_driver:
        type: service
            id: phpfastcache
        query_cache_driver:
            type: service
            id: phpfastcache
  • xcache在本地安装,甚至在PHP CLI上运行(通过在我的代码中设置xcache中的一些var并在xcache管理控制台中验证它来检查)。 我也验证了$ driver是'xcache' - 这里没问题。

  • symfony和doctrine启动 - 到目前为止没有问题。

  • 但是:因为我不完全理解phpFastCache和魔法__c()是如何以某种方式实例化的,只有'文件'被用作配置/存储 - 我不明白为什么。

我是否需要在其他地方注册phpFastCache? 何时以及如何启动它? (但Symfony和Doctrine在我的代码中第一次调用新的PhpFastCacheProvider()之前就已经开始这样做了,以便缓存一些应用程序结果。

有没有人有任何想法?

我一般都喜欢phpFastCache的想法基本上用PHP的后备策略包装一些普通的cachers,因为PHP中的缓存是一种痛苦(参见一般部分: - )。

感谢您的支持。

0 个答案:

没有答案