PHPでmemcachedを使おうと思ったらSELinuxでひっかかってしまったのでメモ。
console
$m = new Memcached();
$result = $m->addServer('localhost', 11211);
if(!$result) {
echo 'addServer return false';
exit;
}
$value = $m->get('hoge');
var_dump($value);
$result = $m->set('hoge', 'test');
var_dump($result);
$value = $m->get('hoge');
var_dump($result);
インストールもライブラリの追加も完了し、コンソール上で動いたのでいざ実装!と思っていたら
sample.php
$m = new Memcached();
$result = $m->addServer('localhost', 11211);
if(!$result) {
throw new Exception('addServer return false');
exit;
}
if(!($value = $m->get('hoge'))) {
$rc = $m->getResultCode();
if($rc == Memcached::RES_NOTFOUND) {
echo 'key empty!';
} else {
throw new Exception(sprintf('memcached error [%d][%s]', $rc, $m->getResultMessage());
}
}
echo 'hit! ', $value;
上記コードでエラー「memcached error [3][CONNECTION FAILURE]」。
対話シェル(php -a)だと正常に繋がるのに、なぜ?fpmの設定?もしかして違うパスのphpが動いてる?といろいろ試し、まさかと思い「setenforce 0」にしてから再度実行したら通った。
ただのSELinuxかよーと落胆し、設定項目を探して
$ getsebool -a | grep memcache
httpd_can_network_memcache --> off
これか・・・
$ sudo setsebool -P httpd_can_network_memcache true
$ getsebool httpd_can_network_memcache
httpd_can_network_memcache --> on
もちろん「setenforce 1」でSELinuxを戻すのも忘れずに。
再度実行
hit! test
動いた!ということで原因はSELinuxのhttpd_can_network_memcacheがoffになっていたせいでした。
offになってても対話シェル形式だと普通に動作するんだね…