最近Twitterでtwitter/pelikan
というものを目にしました。
MemcachedやRedisのようなキャッシュサービスで、上記リポジトリのREADMEによると既存のMemcachedクライアントで操作できるようです。
というわけで、PHPのMemcachedモジュールを使って試してみました。
検証環境
- Ubuntu 18.04.6 on WSL
- Windows 10 Home
- PHP 8.1.11
- Rust 1.64.0
インストール
Pelikan
基本的には https://github.com/twitter/pelikan#building-pelikan の通りですが、cmake が apt でインストールした 3.10 では動かなかったので、こちらを参考に 3.23 を別途インストールしました1。
PHP
APT のppa:ondrej/php
リポジトリからインストールします。Memcached モジュールもphp8.1-memcached
でインストールできます
動かす
サーバを起動
Pelikanをビルドすると、target/release
ディレクトリに各種実行ファイルができるので、その中のpelikan_segcache_rs
を起動します。
$ target/release/pelikan_segcache_rs
2022-10-17T03:55:12.172+00:00 INFO [admin] running admin on: 127.0.0.1:9999
2022-10-17T03:55:12.172+00:00 INFO [server::listener] running server on: 0.0.0.0:12321
9999
と12321
の2ポートでサーバが起動していますが、通常のデータの操作で使うのは12321
の方です。
PHPで接続
<?php
declare(strict_types=1);
$client = new Memcached();
$client->addServer('localhost', 12321);
$client->set('string', 'foo');
$client->set('array', ['foo' => 1, 'bar' => 'baz', 0 => 'qux']);
$client->set('object', (object)['foo' => 1, 'bar' => 'baz', 0 => 'qux']);
$client->set('int', 0);
$client->increment('int');
var_dump(
$client->get('string'),
$client->get('array'),
$client->get('object'),
$client->get('int'),
);
上記コードを動かすと、以下の出力となり、ちゃんと値が保存されていることがわかります。
/path/to/pelikan/pelikan.php:17:
string(3) "foo"
/path/to/pelikan/pelikan.php:17:
array(3) {
'foo' =>
int(1)
'bar' =>
string(3) "baz"
[0] =>
string(3) "qux"
}
/path/to/pelikan/pelikan.php:17:
class stdClass#2 (3) {
public $foo =>
int(1)
public $bar =>
string(3) "baz"
public $0 =>
string(3) "qux"
}
/path/to/pelikan/pelikan.php:17:
int(1)
一方、getVersion()
やgetStats()
といったメソッドは上手く動作しませんでした(ポートを9999
に変えてもダメでした)。
まとめ
基本的な操作であれば、PHP の Memcached モジュールを使って Pelikan を利用できました。
一部利用できないメソッドもあるものの、シンプルな使い道であれば利用できるかもしれません。
-
READMEには
cmake (>= 3.2)
と書いてあったのに…… ↩