🕌
【PHP】Memcache拡張でnullをgetしたときの動作が、PHP8.xで変わっていた
はじめに
Memcached というキャッシュシステムがあります。それを PHP から使う拡張に、Memcache 拡張と Memcached 拡張があります(ややこしい)。
何が違うのかなと思ったのですが、雑に言ってしまうと古いのが Memcache 拡張で、新しい方は Memcached 拡張のようです。この記事に書かれているのは「古いMemcache 拡張の方」です。
↑こちらではなく
↑こっちの話です
動作が変わった?
PHP のバージョン差異を調べているときに気がついたのですが、キャッシュから null を get すると false で返ってくるようになったみたいです。
PHP7 系で動く、現時点での最新バージョン
PHP8 系で動く、現時点での最新バージョン
Cは全然読めないのですが、 「 return_value が IS_NULL だったら RETURN FALSE する」と書いてあるので多分そんな感じなんだろうなぁと思います。
動作確認してみる
動かしてみればいいじゃんということで試しました。
<?php
echo 'PHP version: ' . phpversion() . '<br><br>';
$memcache = new Memcache;
$memcache->connect('memcached', 11211) or die ('Could not connect');
$keys = [
'stringKey' => 'hogehoge',
'stringZeroKey' => '',
'intKey' => 12345,
'intZeroKey' => 0,
'boolTrueKey' => true,
'boolFalseKey' => false,
'arrayKey' => ['red', 'green', 'blue'],
'nullKey' => null
];
// キャッシュをセット
foreach ($keys as $key => $value) {
$memcache->set($key, $value);
}
// キャッシュを取得して表示
foreach ($keys as $key => $value) {
$result = $memcache->get($key);
echo "$key: ";
var_dump($result);
echo '<br>';
}
$result = $memcache->get('notExistKey');
echo 'notExistKey: ';
var_dump($result);
echo '<br>';
結果
PHP7.4
nullKey: NULL
PHP version: 7.4.33
stringKey: string(8) "hogehoge"
stringZeroKey: string(0) ""
intKey: int(12345)
intZeroKey: int(0)
boolTrueKey: bool(true)
boolFalseKey: bool(false)
arrayKey: array(3) { [0]=> string(3) "red" [1]=> string(5) "green" [2]=> string(4) "blue" }
nullKey: NULL
notExistKey: bool(false)
PHP8.0
-
nullKey: bool(false)になっている
PHP version: 8.0.30
stringKey: string(8) "hogehoge"
stringZeroKey: string(0) ""
intKey: int(12345)
intZeroKey: int(0)
boolTrueKey: bool(true)
boolFalseKey: bool(false)
arrayKey: array(3) { [0]=> string(3) "red" [1]=> string(5) "green" [2]=> string(4) "blue" }
nullKey: bool(false)
notExistKey: bool(false)
動かして試す用のコードは ↓ にあります。
おわりに
ドキュメントには(自分が確認した範囲では)書いていなかったので、ちょっと焦りました。
Discussion