我想使用PHP 7。然而,似乎没有键值内存缓存的选项。
APC已停止。
XCache将在一段时间内无法用于PHP7。
PHP 7有可用的替代方案吗?
或者有没有一种方法可以使用PHP7的Opcache来实现键值内存缓存?
我建议您使用Memcached,尤其是,如果您关心性能的话。
虽然您认为APC(u)比Memcache快得多是正确的,但您没有考虑到在您担心这些指标时,您将在多个服务器上运行,并且APC(u)无法在节点之间共享。
您可以使用单个Memcache实例或集群来为任意数量的应用程序服务器提供服务。在现代应用程序开发中,可扩展性比"我能从一台服务器中挤出多少性能?"更令人担忧
话虽如此,您的替代方案是APCu,它具有您从APC习惯的所有功能。它在PHP7中被标记为稳定的,但我不建议这样做,因为它的单节点性质&无法正确使用fastcgi。
APCU实际上是没有代码缓存的APC(他们获取了APC代码,删除了字节代码缓存,并将其作为APCU发布)。这是一个替代品。与APC的用户缓存完全一样,它将数据保持在与PHP运行时相同的进程中,因此使用该值就像检索普通变量一样,因此速度更快。
另一种方法(我没有尝试过,但听起来很有趣)是利用操作缓存作为键值缓存。这篇图片帖子包含了更多细节,但不幸的是没有真正的代码(请注意Kerry Schwab的评论)。
其要点是确保操作缓存已启用,并为需要缓存的数据分配了足够的内存,然后按照以下内容进行操作(从文章中提取,请完整查看)。缓存过期(除了手动删除)也需要处理,但添加起来并不困难(例如,将数据包装在具有过期时间的包含对象中,并在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;
}
由于有了操作缓存,它的作用就像内存中的缓存,但它避免了序列化和反序列化的开销。我想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);
}
}
}
PHP 7缓存/加速器列表
死/过时PHP加速器列表:XCache、APC、memory、ZendOpcache,chdb,hidef(它们不支持PHP7)
我们可以在PECL网站上找到PHP加速器的列表,但据我所知,其中一些加速器已经停产或不是最新的。
当前开发的(支持PHP 7.3)有:
- APCu+ACu_bc
- 清漆
- memcached
- WinCache
- Opcache
您将在下载的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环境路径。
如果你有困难,请阅读以下内容:如何在windows中安装apcuhttps://kapilpatel84.wordpress.com/2016/06/15/install-xdebug-apcu-on-windows-xampp-for-php7/
例如:
1) 具有以下链接的下载兼容APCuhttp://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:\examplep\php\ext
4) 打开php.ini文件,并在文件的底部复制以下代码
[apcu]
extension="C:xamppphpextphp_apcu.dll"
apc.enabled=1
apc.shm_size=32M
apc.ttl=7200
apc.enable_cli=1
apc.serializer=php
extension="C:xamppphpextphp_apc.dll"
解压缩文件时。将DLL文件复制到PHP扩展文件夹np:/php/ext。并配置php.ini(conf指令包含在INSTALL文本文件中)。
Symfony 4
PS。如果您使用Symfony框架,请不要忘记在config>packages>cache.yaml中合成APCu
framework:
cache:
app: cache.adapter.apcu
使用内置服务器与:
php bin/console server:run