Memcache para php: no se puede conectar
memcached php (1)
Según lo aclarado en los comentarios, parece que está ejecutando Security-Enhanced Linux (SELinux), que agrega una capa adicional de seguridad en el nivel kernel. En mi experiencia y uso, descubrí que SELinux agrega un campo de fuerza alrededor de ciertos servicios para que no puedan acceder a activos particulares en el sistema. Por ejemplo, si deseo servir contenido html desde /home/src/web
, tengo que decirle al sistema que está bien que el servicio httpd acceda al contenido en la ruta /home/src/web
. Para hacer esto, emitiría el siguiente comando:
$ -> setsebool -P httpd_enable_homedirs 1
Básicamente, para permitir la comunicación cruzada entre los servicios, debe permitir dicho acceso a través de una política, como "delimitar" un firewall para permitir el acceso a un puerto específico, excepto que con SELinux no está otorgando acceso a un puerto, sino que está otorgar acceso a otra parte del sistema o servicio. Afortunadamente para nosotros, existen varias políticas integradas en las que podemos usar el constructo setsebool
anterior, en lugar de tratar de definir nuestras propias políticas, lo que puede ser un problema. Para una explicación más completa de SELinux echa un vistazo a la página de wikipedia .
Ahora para responder sus preguntas específicas:
¿Por qué debería usar addServer en lugar de connect?
addserver()
le permitirá agregar múltiples ips (o nombres de host) a una lista de la cual se supone que están presentes los valores en caché, es decir, un grupo de servidores de Memcache. Mientras que connect()
solo le permitirá conectarse al único servidor especificado.
getsebool httpd_can_network_memcache, se devuelve, ¿Debería volver?
Sí, parece que activar esta configuración específica te permitirá conectarte a un servidor de Memcache, con SELinux habilitado; sin embargo, en mis servidores de producción todavía lo tengo desactivado, pero tengo el siguiente conjunto:
$ -> setsebool -P httpd_can_network_connect 1
Creo que cualquiera de las configuraciones logrará el objetivo; sin embargo, con la configuración anterior, si tiene un servidor de memcache en otro host, httpd aún puede acceder a él.
Aquí hay un artículo decente sobre SELinux con PIN para permitir el acceso del servicio httpd a otros servicios.
Estoy ejecutando centos 6. Usando apache para manejar php y nginx para manejar secuencias de comandos, imágenes y css
He instalado el servidor memcached.
PORT="11211"
USER="memcached"
MAXCONN="4096"
CACHESIZE="512"
OPTIONS="-l 127.0.0.1"
También he instalado el módulo para php.
Creé un nuevo archivo php
$memcache = new Memcache;
$memcache->connect(''127.0.0.1'', 11211) or die ("Could not connect");
Verifiqué el estado de memcached y se está ejecutando.
Siempre obtengo "No se pudo conectar".
Traté de cambiar el valor a ''localhost'' de ''127.0.0.1'' - todavía no funciona.
$memcache = new Memcache();
$memcache->addServer(''127.0.0.1'', 11211) or die ("Could not connect");
var_dump($memcache->getExtendedStats());
$memcache->set(''key'', ''hello world'', false, 60);
echo $memcache->get(''key'');
//$memcache->connect(''127.0.0.1'', 11211) or die ("Could not connect");
Salida
array(1) { ["127.0.0.1:11211"]=> bool(false) }
¿Qué se conecta y agrega Servidor de manera diferente? ¿Cuál es la mejor manera de hacerlo?
Pero no estoy recibiendo el Hello World
Más actualizaciones sobre el código y sobre este problema ..
phpinfo muestra memcached.
var_dump ($ memcache-> get (''clave'')); da
bool(false)
¿Por qué debería usar addServer en lugar de connect ?
Más actualización en el código
$memcache = new Memcache;
$memcache->addServer(''localhost'', 11211);
echo $memcache->getServerStatus(''localhost'', 11211);
output : 1
//$memcache->set(''key'', ''hello world'') or die("failed to store data");
output : failed to store data
algunos detalles más
getsebool httpd_can_network_memcache
regresa
¿Debería volver?
Notice: Memcache::connect(): Server 127.0.0.1 (tcp 11211, udp 0) failed with: Permission denied (13)