Есть ли совместимый кэш памяти для PHP 7?
Я хотел бы использовать PHP 7. Однако, похоже, не существует опции для кэширования памяти с ключом.
APC прекращено.
XCache не будет доступен для PHP 7 в течение некоторого времени.
Есть ли альтернатива для PHP 7?
Или есть ли способ использовать PHP7 Opcache для реализации кэширования памяти с ключом?
Ответы
Ответ 1
Я бы предложил использовать Memcached, особенно если вас беспокоит производительность.
В то время как вы правы, что APC (u) намного быстрее, чем Memcache, вы не принимаете во внимание, что к тому времени, когда вы беспокоитесь об этих показателях, вы будете работать на нескольких серверах и APC (u) не могут быть разделены между узлами.
Вы можете использовать один экземпляр или кластер Memcache, чтобы обслуживать столько серверов приложений, сколько хотите. Масштабируемость вызывает большую озабоченность в современной разработке приложений, чем "сколько производительности я могу выжать из одного сервера?"
Сказав это, ваша альтернатива APCu, которая обладает всеми функциональными возможностями, которые вы использовали с APC. Он отмечен как стабильный с PHP7, но я бы не рекомендовал его из-за его единственного node характера и неспособности корректно работать с fastcgi.
Ответ 2
APCU - это буквально APC без кэширования кода (они взяли код APC, удалили кеш-байтовый код и выпустили его как APCU). Это замена. Именно в качестве пользовательского кэша APC он хранит данные в том же процессе, что и среда выполнения PHP, поэтому использование значения похоже на получение обычной переменной, следовательно, скорость.
Ответ 3
Другой подход (который я не пробовал, но звучит очень интересно) заключается в том, чтобы использовать opcache в качестве кеша ключевых значений. Это сообщение graphiq содержит более подробную информацию, но никакого реального кода, к сожалению (и обратите внимание на комментарии Керри Шваба).
Суть его в том, чтобы убедиться, что 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);
}
}
}
Ответ 4
PHP 7 кеш/список ускорителей
Listo of dead/outdated PHP accelerators: XCache, APC, memoize, ZendOpcache,
chdb, hidef (they are not supporting PHP 7)
Мы можем найти список ускорителей PHP на веб-сайте PECL, но некоторые из них больше не поддерживаются или не обновляются.
В настоящее время разработаны (с поддержкой PHP 7.3):
Все инструкции по установке вы найдете в загруженном файле tgz/zip.
APCu WINDOWS USERS:
Загрузите файлы DLL APCu и APCu_bc, которые соответствуют спецификации вашей системы x64 (64 бита) ИЛИ x86 (32-битные окна) выберите версию TS или UTS и, конечно, правильную версию PHP. Вставьте .DLL в свой каталог php/ext. Вы можете определить режим потока, просмотрев каталог php. Найти по имени файла DLL (например: php7ts.dll). Обратите внимание на TS или UTS в имени файла.
php -v
покажет вам вашу текущую версию установки PHP CLI.
Просто убедитесь, что ваша версия PHP совпадает с той, которую вы используете на своем сервере. Если нет, обновите путь среды Windows для PHP.
Если у вас возникли трудности, прочитайте это: Как установить apcu в Windows
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, поэтому вам нужно скачать его по следующей ссылке. http://pecl.php.net/package/apcu_bc
3) Извлеките файл DDL и переместите файл DDL с именем: php_apc.dll и php_apcu.dll и скопируйте эти файлы в каталог 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).
Symfony 4
PS. Если случайно вы используете платформу Symfony, не забудьте включить APCu в config> packages> cache.yaml
framework:
cache:
app: cache.adapter.apcu
Используйте встроенный сервер с:
php bin/console server:run