PHP 7是否有兼容的内存缓存?

时间:2016-05-09 06:24:45

标签: php apc opcache xcache

我想使用PHP 7.但似乎没有键值内存缓存的选项。

APC is discontinued

XCache will not be available for PHP 7 for some time

PHP 7有可用的替代方案吗?

或者有没有办法使用PHP7的Opcache来实现键值内存缓存?

4 个答案:

答案 0 :(得分:26)

如果您担心效果,我建议您使用Memcached尤其是

虽然您说APC(u)比Memcache快得多,但是当您担心这些指标时,您不会进入的帐户,您将在多个服务器上运行< / strong>和APC(u)不能跨节点共享。

您可以使用单个Memcache实例或群集来根据需要提供多个应用程序服务器。可伸缩性是现代应用程序开发中比“我可以从一台服务器中挤出多少性能?”中更受关注的问题。

话虽如此,您的替代方案是APCu,它具有您从APC习惯的所有功能。它用PHP7标记为稳定但我不推荐这个,因为它的单节点性质和用fastcgi无法正常工作。

答案 1 :(得分:12)

APCU 字面上 APC没有代码缓存(他们接受了APC代码,删除了字节代码缓存并将其作为APCU发布)。这是一个替代品。正如APC的用户缓存一样,它将数据保存在与PHP运行时相同的进程中,因此使用该值就像检索普通变量一样,因此速度很快。

答案 2 :(得分:3)

另一种方法(我没试过,但听起来很有趣)是利用opcache作为键值缓存。这篇graphiq帖子包含更多详细信息,但遗憾的是没有真正的代码(请注意Kerry Schwab的评论)。

它的要点是确保opcache已启用并且为您需要缓存的数据分配了足够的内存,然后是以下内容(从文章中提取,完整检查)。缓存过期(除了手动删除)也需要处理,但不会很难添加(例如将数据包装在一个包含有效期限的对象中,并在cache_get中检查,删除并且如果记录已过期则忽略该记录。

function cache_set($key, $val) {
   $val = var_export($val, true);
   // HHVM fails at __set_state, so just use object cast for now
   $val = str_replace('stdClass::__set_state', '(object)', $val);
   // Write to temp file first to ensure atomicity
   $tmp = "/tmp/$key." . uniqid('', true) . '.tmp';
   file_put_contents($tmp, '<?php $val = ' . $val . ';', LOCK_EX);
   rename($tmp, "/tmp/$key");
}

function cache_get($key) {
    @include "/tmp/$key";
    return isset($val) ? $val : false;
}

由于opcache,它在内存缓存中起作用,但它避免了序列化和反序列化的开销。我想cache_set也应该在写入时调用opcache_invalidate(并且在他们的例子中不存在的cache_delete函数中),否则对于没有的高速缓存看起来似乎是合理的需要在服务器之间共享。

编辑:缓存过期的示例实现(仅精确到一秒,如果需要更高精度,可以使用microtime(true))。最小的测试实际完成了,我放弃了HHVM特定的替换,所以YMMV。欢迎提出改进建议。

class Cache {                                                                   
    private $root;                                                              
    private $compile;                                                           
    private $ttl;                                                               

    public function __construct($options = []) {                                
        $this->options = array_merge(                                           
            array(                                                              
                'root' => sys_get_temp_dir(),                                   
                'ttl'  => false,                                                
            ),                                                                  
            $options                                                            
        );                                                                      
        $this->root = $this->options['root'];                                   
        $this->ttl = $this->options['ttl'];                                     
    }                                                                           

    public function set($key, $val, $ttl = null) {                              
        $ttl = $ttl === null ? $this->ttl : $ttl;                               
        $file = md5($key);                                                      
        $val = var_export(array(                                                
            'expiry' => $ttl ? time() + $ttl : false,                           
            'data' => $val,                                                     
        ), true);                                                               

        // Write to temp file first to ensure atomicity                         
        $tmp = $this->root . '/' . $file . '.' . uniqid('', true) . '.tmp';     
        file_put_contents($tmp, '<?php $val = ' . $val . ';', LOCK_EX);         

        $dest = $this->root . '/' . $file;                                      
        rename($tmp, $dest);                                                    
        opcache_invalidate($dest);                                              
    }                                                                           

    public function get($key) {                                                 
        @include $this->root . '/' . md5($key);                                 

        // Not found                                                            
        if (!isset($val)) return null;                                          

        // Found and not expired                                                
        if (!$val['expiry'] || $val['expiry'] > time()) return $val['data'];    

        // Expired, clean up                                                    
        $this->remove($key);                                                    
    }                                                                           

    public function remove($key) {                                              
        $dest = $this->root . '/' . md5($key);                                  
        if (@unlink($dest)) {                                                   
            // Invalidate cache if successfully written                         
            opcache_invalidate($dest);                                          
        }                                                                       
    }                                                                           
}      

答案 3 :(得分:0)

PHP 7缓存/加速器列表

  

已失效/过时 PHP加速器的列表:XCache,Opcache,APC,memoize,ZendOpcache,   chdb,hidef(它们不支持PHP 7)

我们可以在PECL website上找到PHP加速器的列表,但是随着我的想法,其中一些已经停止使用或不是最新的。

当前开发的(支持PHP 7.3)是:

您将在下载的tgz / zip文件中找到所有安装说明。

APCu WINDOWS用户: 下载与系统规格x64(64位)或x86(32位窗口)匹配的APCu和APCu_bc DLL文件,选择TS或UTS版本,当然也选择正确的PHP版本。将.DLL粘贴到您的 php / ext 目录中,您可以通过查看您的 php目录来确定线程模式。查找DLL文件名(例如:php7ts.dll)。注意文件名中的TS或UTS。

php -v将向您显示您当前的PHP CLI安装版本。 只要确保您的PHP版本与您在服务器中使用的版本相同即可。如果没有更改,请更新PHP的Windows环境路径。

如果您有困难,请阅读以下内容:How to install apcu in windows https://kapilpatel84.wordpress.com/2016/06/15/install-xdebug-apcu-on-windows-xampp-for-php7/

对于XAMPP:

1)具有以下链接http://pecl.php.net/package/apcu

的下行兼容APCu

2)APCu需要与APC兼容的backword,因此您必须通过以下链接下载它。 http://pecl.php.net/package/apcu_bc

3)提取DDL文件并移动名为php_apc.dll和php_apcu.dll的DDL文件,并将该文件复制到您的PHP ext目录中。即C:\ xampp \ php \ ext

4)打开php.ini文件,并在文件底部复制以下代码

[apcu]
extension="C:\xampp\php\ext\php_apcu.dll"
apc.enabled=1
apc.shm_size=32M
apc.ttl=7200
apc.enable_cli=1
apc.serializer=php
extension="C:\xampp\php\ext\php_apc.dll"

解压缩文件时。将DLL文件复制到您的PHP扩展文件夹np:... / php / ext。 并配置php.ini(con​​f指令包含在INSTALL文本文件中)。

Symfony 4

PS。如果您有任何机会使用Symfony框架,不要忘记在 config> packages> cache.yaml

中启用APCu
framework:
    cache:
        app: cache.adapter.apcu

将内置服务器用于:

php bin/console server:run