navegadores - session_start php ejemplos
¿Hay alguna memoria caché compatible para PHP 7? (3)
Me gustaría usar PHP 7. Sin embargo, parece que no hay opción para el almacenamiento en caché de la memoria de valor clave .
XCache no estará disponible para PHP 7 por algún tiempo .
¿Hay alguna alternativa disponible para PHP 7?
¿O hay una manera de usar Opcache de PHP7 para implementar el almacenamiento en caché de memoria de valor clave?
Otro enfoque (que no he probado, pero suena muy interesante) es aprovechar el caché de datos como un caché de valores clave. Esta publicación de graphiq contiene más detalles pero desafortunadamente no hay código real (y tenga en cuenta los comentarios de Kerry Schwab).
Lo esencial es asegurarse de que el caché de datos esté habilitado y tenga suficiente memoria asignada para los datos que necesita almacenar en la memoria caché y luego algo similar a lo siguiente (extraído del artículo, verifíquelo en su totalidad). La caducidad de la caché (aparte de la eliminación manual) también debería manejarse, pero no sería difícil de agregar (por ejemplo, envolver sus datos en un objeto contenedor con una fecha de caducidad y verificarlos en su cache_get
, eliminando e ignorando el registro si es muerto).
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;
}
Debido al opcache, esto funciona como un caché en memoria, pero evita la sobrecarga de serialización y deserialización. Supongo que el cache_set también debería llamar a opcache_invalidate
al escribir (y en la función cache_delete
que no existe en sus ejemplos), pero de lo contrario parece un sonido para un caché que no necesita ser compartido entre servidores.
Edición: una implementación de ejemplo con caducidad de caché (solo precisa a un segundo, podría usar microtime(true)
si se requiere más precisión) a continuación. Se realizaron pruebas mínimas y se eliminó el reemplazo específico de HHVM, así que YMMV. Sugerencias de mejoras bienvenidas.
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);
}
}
}
Te sugiero usar Memcached , especialmente si te preocupa el rendimiento.
Si bien tiene razón al afirmar que APC (u) es mucho más rápido que Memcache, no tiene en cuenta que, para cuando esté preocupado por estas métricas, estará ejecutando en varios servidores y APC (u) no puede ser compartido a través de los nodos.
Puede usar una única instancia o clúster de Memcache para servir a tantos servidores de aplicaciones como desee. La escalabilidad es una preocupación mayor en el desarrollo de aplicaciones modernas que "¿cuánto rendimiento puedo exprimir de un servidor?"
Dicho esto, su alternativa es APCu , que tiene todas las funcionalidades a las que está acostumbrado de APC. Está marcado como estable con PHP7, pero no lo recomendaría debido a su naturaleza de nodo único y su incapacidad para trabajar correctamente con fastcgi.
APCU es literalmente APC sin el almacenamiento en caché de código (tomaron el código de APC, eliminaron el caché de código de bytes y lo liberaron como APCU). Es un reemplazo directo. Exactamente como caché de usuario de APC, mantiene los datos en el mismo proceso que el tiempo de ejecución de PHP, por lo que usar el valor es muy parecido a recuperar una variable ordinaria, por lo tanto, la velocidad.