PHP, Memcached работает из командной строки, но не из Интернета
У меня есть PHP 5.3.3, установленный на Centos 6.4 с расширением memcached.so
, а httpd - с версией 2.2.15-26. Вот мой index.php
:
$mc = new \Memcached();
$mc->addServer('127.0.0.1', 11211);
$mc->set("test", "blah");
var_dump($mc->getResultCode());
var_dump($mc->getResultMessage());
var_dump($mc->get("test"));
die;
Когда я запускаю его из командной строки, работает. Я получаю следующее:
10:22:33 $ php index.php
int(0)
string(7) "SUCCESS"
string(4) "blah"
Сервер memcache также работает из telnet. Однако, когда я запускаю index.php
из Интернета, он терпит неудачу. Я получаю следующее (от просмотра источника веб-страницы):
int(47)
string(51) "SERVER HAS FAILED AND IS DISABLED UNTIL TIMED RETRY"
bool(false)
За исключением повторной установки моей ОС и тестирования разных версий дерьма, может ли кто-нибудь объяснить, что может вызвать эту проблему?
Ответы
Ответ 1
Это проблема SELinux? Cli может получить доступ к Memcached, но daemon no. Попробуйте следующее:
-
getenforce
, чтобы узнать, включен ли SELinux
-
setenforce 0
, чтобы отключить его
-
reboot
- Повторите попытку.
Если это хорошо, вы должны настроить Apache для доступа к Memcached.
Ответ 2
Убедитесь, что ваша служба memcache должна связывать все IP-адреса. Значение по умолчанию - 127.0.0.1. измените его на 0.0.0.0 для поддержки всех определенных Ips. В дополнение, не забудьте контролировать свои iptables или межсетевой экран.
Ответ 3
Когда я смотрю на примеры, я вижу, что он используется без модификатора "\" для пространства имен. Попробуйте без него, может быть?
http://www.php.net/manual/en/memcache.examples-overview.php
<?php
$memcache = new Memcache;
$memcache->connect('localhost', 11211) or die ("Could not connect");
Ответ 4
У меня была эта проблема в WAMP 2.4, пропустив простой тест Memcache script, работающий из командной строки, но не в браузере.
Ответ оказался потрясающе обыденным: у WAMP было два файла php.ini, и я редактировал неправильный.
например. Apache использовал этот: c:\wamp\bin\apache\Apache2.4.4\bin\php.ini
У WAMP также был этот: c:\wamp\bin\php\php5.4.12\php.ini
Поместите расширение = php_memcache.dll в правильные файлы .ini, исправленные.
Моя подсказка что-то вроде этого была проблема была в том, что загруженный конфигурационный файл phpInfo() сообщал о разных значениях в двух случаях.
Ответ 5
У меня была точно такая же проблема, как описано OP. Оказалось, что проблема была вызвана списком серверов, расширение memcached поддерживает внутренне. Мой код был примерно таким:
$serversList = $memcached->getServerList();
if (empty($serversList)) {
$memcached->addServer($host, $port);
}
Мой начальный вызов для тестирования script был выполнен с неправильным значением для $port. Вызов был сделан из web (apache), а не из cli. После того, как я исправил порт, и я снова запустил код, он пропускал "if" и использовал список существующих серверов, который был испорчен, и поэтому он снова не удался.
Увидев отказ от Интернета, который я тестировал с кли, он работал отлично. В списке серверов список серверов отличается от списка в Интернете. Фактически, список серверов был пустым при каждом запуске script, даже если мой script устанавливал его при каждом запуске. Тем не менее он сохранялся между вызовами в Интернете.
В любом случае, после очистки списка серверов в Интернете и установки правильного сервера, он также работал в Интернете.
Ответ 6
У меня похожая проблема на CentOS, и что я нашел. Я запускаю SELinux, которые не позволяют httpd подключаться к memcached. Вы должны установить ниже,
# setsebool -P httpd_can_network_memcache 1
# getsebool httpd_can_network_memcache
httpd_can_network_memcache --> on