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

Fro*_*dik 28 php apc xcache opcache

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

APC已停产.

一段时间后,XCache将无法用于PHP 7.

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

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

Mat*_*ude 32

我建议使用Memcached,特别是如果你关心性能.

虽然你说APC(你)比Memcache要快得多,但是当你担心这些指标时,你不会进入帐户,你将运行多个服务器而APC(你)不能跨节点共享.

您可以使用单个Memcache实例或群集来根据需要提供多个应用程序服务器.在现代应用程序开发中,可伸缩性是一个更大的问题,而不是"我可以从一台服务器中挤出多少性能?"

话虽如此,您的替代品是APCu,它具有您从APC习惯的所有功能.它被PHP7标记为稳定,但由于其单节点性质和无法与fastcgi正常工作,我不建议这样做.

  • @Frodik在这种情况下,APCu可能是你得到的最好的(至少在不了解你的具体用法的情况下).值得一提的是,Memcache有一堆[set multi](http://php.net/manual/en/memcached.setmultibykey.php)和[get multi](http://php.net/manual/en /memcached.getmultibykey.php)函数,如果你一次设置数百个函数,这可能对你有用.这样可以节省多个请求的开销. (3认同)

Ali*_*man 14

APCU字面上 APC无码缓存(他们把APC代码,删除字节码缓存,它释放APCU).这是一个替代品.正如APC的用户缓存一样,它将数据保存在与PHP运行时相同的进程中,因此使用该值就像检索普通变量一样,因此速度也很快.


El *_*obo 8

另一种方法(我还没有尝试过,但听起来很有趣)是利用 opcache 作为键值缓存。这个图形帖子包含更多细节,但不幸的是没有真正的代码(并注意 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;
}
Run Code Online (Sandbox Code Playgroud)

由于 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);                                          
        }                                                                       
    }                                                                           
}      
Run Code Online (Sandbox Code Playgroud)


Dev*_*vWL 5

PHP 7 缓存/加速器列表

的LISTO死/过时的PHP加速器:了XCache,APC,memoize的,ZendOpcache,chdb,hidef(他们不支持PHP 7)

我们可以在PECL 网站上找到 PHP 加速器列表,但正如我所提到的,其中一些已停产或不是最新的。

目前开发的(支持 PHP 7.3)有:

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

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

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

如果您有困难,请阅读:如何在 Windows 中安装 apcu https://kapilpatel84.wordpress.com/2016/06/15/install-xdebug-apcu-on-windows-xampp-for-php7/

对于 XAMPP:

1) 使用以下链接下载兼容的 APCu http://pecl.php.net/package/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"
Run Code Online (Sandbox Code Playgroud)

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

Symfony 4

附注。如果您使用 Symfony 框架,请不要忘记在config>packages>cache.yaml 中启用 APCu

framework:
    cache:
        app: cache.adapter.apcu
Run Code Online (Sandbox Code Playgroud)

使用内置服务器:

php bin/console server:run
Run Code Online (Sandbox Code Playgroud)

  • OPCache 并没有消亡,它是事实上的标准 PHP 加速器,自 PHP 5.6 起或多或少作为 PHP 的组成部分随每个发行版一起提供。此外,它是性能方面必须使用的扩展。 (2认同)