🕌

【PHP】Memcache拡張でnullをgetしたときの動作が、PHP8.xで変わっていた

に公開

はじめに

Memcached というキャッシュシステムがあります。それを PHP から使う拡張に、Memcache 拡張と Memcached 拡張があります(ややこしい)。

何が違うのかなと思ったのですが、雑に言ってしまうと古いのが Memcache 拡張で、新しい方は Memcached 拡張のようです。この記事に書かれているのは「古いMemcache 拡張の方」です。

https://www.php.net/manual/ja/book.memcached.php
↑こちらではなく

https://www.php.net/manual/ja/book.memcache.php
↑こっちの話です

動作が変わった?

PHP のバージョン差異を調べているときに気がついたのですが、キャッシュから null を get すると false で返ってくるようになったみたいです。

PHP7 系で動く、現時点での最新バージョン
https://github.com/websupport-sk/pecl-memcache/blob/4.0.5.2/php7/memcache.c#L1896

PHP8 系で動く、現時点での最新バージョン
https://github.com/websupport-sk/pecl-memcache/blob/8.2/src/memcache.c#L2178-L2183

Cは全然読めないのですが、 「 return_valueIS_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)

動かして試す用のコードは ↓ にあります。
https://github.com/kyoruni/php-memcache-comparison

おわりに

ドキュメントには(自分が確認した範囲では)書いていなかったので、ちょっと焦りました。

Discussion