variable una temporalmente guardar datos cookie como cache array apc_store almacenar php session caching scalability

una - ¿Cómo almacenar sesiones de PHP en APC Cache?



save variable in cache php (9)

Almacenar sesiones en disco muy lento y doloroso para mí. Estoy teniendo un tráfico muy alto. Quiero almacenar sesión en Advanced PHP Cache, ¿cómo puedo hacer esto?



El cierre explícito de la sesión inmediatamente después del inicio, la apertura y la escritura de la sesión debería resolver el problema de bloqueo en la Respuesta de Unirgy (donde el acceso a la sesión siempre es cíclico (inicio / apertura-escritura-cierre). con Sesiones sería mejor en última instancia ... Se inicia una sesión y se escribe con un ID externo único asignado a cada sesión, se cierra esa sesión y se abre / crea un diario (matriz en la caché de apc a través de _store & _add) para cualquier otra escritura destinada a ir a la sesión que luego se puede leer, validar y escribir en la sesión (identificada por esa identificación única) en apc en la próxima oportunidad conveniente.

Encontré una buena publicación en el blog. Explicando que el bloqueo causado por Sven se refiere al bloqueo de la sesión hasta que se cierra o termina la ejecución del script. La sesión que se cierra inmediatamente no impide leer solo la escritura. http://konrness.com/php5/how-to-prevent-blocking-php-requests - enlace a la publicación del blog. Espero que esto ayude.


El simple hecho de colocar su disco / tmp (o, donde sea que estén almacenados los archivos de sesión de PHP) en un disco RAM como tmpfs o ramfs , también tendrá un gran rendimiento, y sería un interruptor mucho más transparente, con cero cambios de código.

El aumento de rendimiento puede ser significativamente menor, pero seguirá siendo significativamente más rápido que las sesiones en disco.


En teoría, deberías poder escribir un controlador de sesión personalizado que use APC para hacer esto de manera transparente para ti. Sin embargo, no he podido encontrar nada realmente prometedor en una búsqueda rápida de cinco minutos; La mayoría de la gente parece estar usando APC para el caché de bytecode y poner sus sesiones en memcached


Guárdelo en cookies (encriptadas) o en MongoDB. APC no está realmente destinado a ese propósito.


Otra buena solución es almacenar sesiones de PHP en memcached

session.save_handler = memcache



Traté de atraer mejores respuestas ofreciendo 100 puntos como recompensa, pero ninguna de las respuestas fue realmente satisfactoria.

Yo agregaría las soluciones recomendadas como esta:

Usando APC como almacenamiento de sesión

APC no se puede usar realmente como un almacén de sesión, porque no hay un mecanismo disponible para APC que permita el bloqueo adecuado, pero este bloqueo es esencial para garantizar que nadie altera los datos de la sesión que se leyeron inicialmente antes de volver a escribirlos.

En pocas palabras: evítalo, no funcionará.

Alternativas

Un número de manejadores de sesión podría estar disponible. Verifique la salida de phpinfo() en la sección Session para "Controladores de guardado registrados".

Almacenamiento de archivos en el disco RAM

Funciona de manera inmediata, pero necesita un sistema de archivos montado como disco RAM por razones obvias.

Memoria compartida (mm)

Está disponible cuando PHP está compilado con mm habilitado. Esto está incorporado en las ventanas.

Memcache (d)

PHP viene con un controlador de guardado de sesión dedicado para esto. Requiere el servidor memcache instalado y el cliente PHP. Dependiendo de cuál de las dos extensiones de memcache esté instalada, el controlador de guardar se llama memcache o memcached .


<?php // to enable paste this line right before session_start(): // new Session_APC; class Session_APC { protected $_prefix; protected $_ttl; protected $_lockTimeout = 10; // if empty, no session locking, otherwise seconds to lock timeout public function __construct($params=array()) { $def = session_get_cookie_params(); $this->_ttl = $def[''lifetime'']; if (isset($params[''ttl''])) { $this->_ttl = $params[''ttl'']; } if (isset($params[''lock_timeout''])) { $this->_lockTimeout = $params[''lock_timeout'']; } session_set_save_handler( array($this, ''open''), array($this, ''close''), array($this, ''read''), array($this, ''write''), array($this, ''destroy''), array($this, ''gc'') ); } public function open($savePath, $sessionName) { $this->_prefix = ''BSession/''.$sessionName; if (!apc_exists($this->_prefix.''/TS'')) { // creating non-empty array @see http://us.php.net/manual/en/function.apc-store.php#107359 apc_store($this->_prefix.''/TS'', array('''')); apc_store($this->_prefix.''/LOCK'', array('''')); } return true; } public function close() { return true; } public function read($id) { $key = $this->_prefix.''/''.$id; if (!apc_exists($key)) { return ''''; // no session } // redundant check for ttl before read if ($this->_ttl) { $ts = apc_fetch($this->_prefix.''/TS''); if (empty($ts[$id])) { return ''''; // no session } elseif (!empty($ts[$id]) && $ts[$id] + $this->_ttl < time()) { unset($ts[$id]); apc_delete($key); apc_store($this->_prefix.''/TS'', $ts); return ''''; // session expired } } if (!$this->_lockTimeout) { $locks = apc_fetch($this->_prefix.''/LOCK''); if (!empty($locks[$id])) { while (!empty($locks[$id]) && $locks[$id] + $this->_lockTimeout >= time()) { usleep(10000); // sleep 10ms $locks = apc_fetch($this->_prefix.''/LOCK''); } } /* // by default will overwrite session after lock expired to allow smooth site function // alternative handling is to abort current process if (!empty($locks[$id])) { return false; // abort read of waiting for lock timed out } */ $locks[$id] = time(); // set session lock apc_store($this->_prefix.''/LOCK'', $locks); } return apc_fetch($key); // if no data returns empty string per doc } public function write($id, $data) { $ts = apc_fetch($this->_prefix.''/TS''); $ts[$id] = time(); apc_store($this->_prefix.''/TS'', $ts); $locks = apc_fetch($this->_prefix.''/LOCK''); unset($locks[$id]); apc_store($this->_prefix.''/LOCK'', $locks); return apc_store($this->_prefix.''/''.$id, $data, $this->_ttl); } public function destroy($id) { $ts = apc_fetch($this->_prefix.''/TS''); unset($ts[$id]); apc_store($this->_prefix.''/TS'', $ts); $locks = apc_fetch($this->_prefix.''/LOCK''); unset($locks[$id]); apc_store($this->_prefix.''/LOCK'', $locks); return apc_delete($this->_prefix.''/''.$id); } public function gc($lifetime) { if ($this->_ttl) { $lifetime = min($lifetime, $this->_ttl); } $ts = apc_fetch($this->_prefix.''/TS''); foreach ($ts as $id=>$time) { if ($time + $lifetime < time()) { apc_delete($this->_prefix.''/''.$id); unset($ts[$id]); } } return apc_store($this->_prefix.''/TS'', $ts); } }