PHP 7 是否有任何兼容的内存缓存?
Is there any compatible memory cache for PHP 7?
我想使用PHP 7。但是似乎没有键值内存缓存选项。
XCache will not be available for PHP 7 for some time。
PHP7 有可用的替代品吗?
或者有没有办法利用PHP7的Opcache实现key-value内存缓存?
APCU 是 字面上的 没有代码缓存的 APC(他们获取了 APC 代码,删除了字节码缓存并将其作为 APCU 发布)。这是一个直接的替代品。与 APC 的用户缓存完全一样,它将数据保存在与 PHP 运行时相同的进程中,因此使用该值就像检索普通变量一样,因此速度更快。
我建议使用 Memcached,尤其是 如果您担心性能。
虽然您认为 APC(u) 比 Memcache 快很多是正确的,但您没有考虑到 当您担心这些指标时,您将 运行跨多个服务器和APC(u)不能跨节点共享。
您可以使用单个 Memcache 实例或集群来服务任意数量的应用程序服务器。在现代应用程序开发中,可伸缩性比 "how much performance can I squeeze out of one server?"
更受关注
话虽如此,您的替代方案是 APCu,它具有您在 APC 中习惯使用的所有功能。它被标记为 PHP7 稳定,但我不推荐它,因为它的单节点性质和无法与 fastcgi 一起正常工作。
另一种方法(我没有尝试过,但听起来很有趣)是利用 opcache 作为键值缓存。 graphiq post 包含更多详细信息,但遗憾的是没有真正的代码(请注意 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);
}
}
}
PHP 7 缓存/加速器列表
Listo of dead/outdated PHP accelerators: XCache, APC, memoize, ZendOpcache,
chdb, hidef (they are not supporting PHP 7)
我们可以在 PECL website 上找到 PHP 加速器列表,但正如我提到的,其中一些已停产或不是最新的。
目前开发(支持PHP 7.3)有:
您将在下载的 tgz/zip 文件中找到所有安装说明。
APCu WINDOWS 用户:
下载符合您的系统规格 x64(64 位)或 x86(32 位 windows)select TS 或 UTS 版本的 APCu 和 APCu_bc DLL 文件,当然还有正确的 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) 下载与以下 link http://pecl.php.net/package/apcu
兼容的 APCu
2) APCu 需要与APC 兼容的backword,因此您必须使用link 下载它。 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(conf 指令包含在 INSTALL 文本文件中)。
交响乐 4
PS。如果你有机会使用 Symfony 框架,不要忘记在 config>packages>cache.yaml
中启用 APCu
framework:
cache:
app: cache.adapter.apcu
使用内置服务器:
php bin/console server:run
我想使用PHP 7。但是似乎没有键值内存缓存选项。
XCache will not be available for PHP 7 for some time。
PHP7 有可用的替代品吗?
或者有没有办法利用PHP7的Opcache实现key-value内存缓存?
APCU 是 字面上的 没有代码缓存的 APC(他们获取了 APC 代码,删除了字节码缓存并将其作为 APCU 发布)。这是一个直接的替代品。与 APC 的用户缓存完全一样,它将数据保存在与 PHP 运行时相同的进程中,因此使用该值就像检索普通变量一样,因此速度更快。
我建议使用 Memcached,尤其是 如果您担心性能。
虽然您认为 APC(u) 比 Memcache 快很多是正确的,但您没有考虑到 当您担心这些指标时,您将 运行跨多个服务器和APC(u)不能跨节点共享。
您可以使用单个 Memcache 实例或集群来服务任意数量的应用程序服务器。在现代应用程序开发中,可伸缩性比 "how much performance can I squeeze out of one server?"
更受关注话虽如此,您的替代方案是 APCu,它具有您在 APC 中习惯使用的所有功能。它被标记为 PHP7 稳定,但我不推荐它,因为它的单节点性质和无法与 fastcgi 一起正常工作。
另一种方法(我没有尝试过,但听起来很有趣)是利用 opcache 作为键值缓存。 graphiq post 包含更多详细信息,但遗憾的是没有真正的代码(请注意 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);
}
}
}
PHP 7 缓存/加速器列表
Listo of dead/outdated PHP accelerators: XCache, APC, memoize, ZendOpcache, chdb, hidef (they are not supporting PHP 7)
我们可以在 PECL website 上找到 PHP 加速器列表,但正如我提到的,其中一些已停产或不是最新的。
目前开发(支持PHP 7.3)有:
您将在下载的 tgz/zip 文件中找到所有安装说明。
APCu WINDOWS 用户: 下载符合您的系统规格 x64(64 位)或 x86(32 位 windows)select TS 或 UTS 版本的 APCu 和 APCu_bc DLL 文件,当然还有正确的 PHP版本。将 .DLL 粘贴到您的 php/ext 目录中 您可以通过查看 php 目录 来确定线程模式。在 DLL 文件名处查找(例如:php7ts.dll)。注意文件名中的 TS 或 UTS。
php -v
将显示您当前的 PHP CLI 安装版本。
只需确保您的 PHP 版本与您在服务器中使用的版本相同即可。如果不更改,请更新 PHP.
如果您遇到困难,请阅读:How to install apcu in windows https://kapilpatel84.wordpress.com/2016/06/15/install-xdebug-apcu-on-windows-xampp-for-php7/
对于 XAMPP:
1) 下载与以下 link http://pecl.php.net/package/apcu
兼容的 APCu2) APCu 需要与APC 兼容的backword,因此您必须使用link 下载它。 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(conf 指令包含在 INSTALL 文本文件中)。
交响乐 4
PS。如果你有机会使用 Symfony 框架,不要忘记在 config>packages>cache.yaml
中启用 APCuframework:
cache:
app: cache.adapter.apcu
使用内置服务器:
php bin/console server:run