PHPredisプローブ

1634 ワード

以前は異なる言語間で相互に呼び出される原理が分からなかった.HotSpotを後から見たとき、Java仮想マシンがC言語関数を呼び出す方法を見て、関数呼び出しの最も基本的な問題はパラメータ伝達と値戻りであることが分かった.パラメータ伝達と値が返す詳細は,実際にはアセンブリレベルの問題である.簡単に言えば,パラメータをスタックに押し込み,戻り値(ポインタかもしれない)を所定のレジスタに格納する.しかし、実際には必ずしもアセンブリレベルのものをサポートする必要はありません.例えばHotSpotは主にC/C++で書かれており、PHPはCで書かれています.だからJAVAとPHPを呼び出してC関数を呼び出すのは実は比較的に簡単で、結局実行エンジンと仮想機はすべてCあるいはCに互換性があります.
PHPredisは実はPHP拡張です.PHP拡張に対する理解も深くなく、半月前までは何だったのか分からなかった!私の粗浅な理解によれば、PHP拡張のメカニズムはLinuxカーネルのモジュールメカニズムと似ている.一定のタイミングでロードされ、モジュールには初期化関数とアンインストール関数、その他のインタフェース関数が定義されます.登録された操作をロードすることで、インタフェース関数がシンボルテーブルにインポートされます.PHP言語層のコードでこれらの関数を使用することができます.これによりPHPの拡張が実現した.
PHPredisで話しましょう!PHPとredisの間には通信が必要であり、redisは単独で実行されるプロセスである.この通信はプロセス間通信であり、遠隔通信でもある.これらは、システム呼び出しまたはシステム呼び出しをカプセル化する必要があるオペレーティングシステムAPIである.この場合,PHPはPHP拡張を用いてredisとの通信機能を実現する必要がある.にあるhttps://github.com/nicolasff/phpredisPHPredisの工事が見えます.ただの拡張なので、多くのコードがなく、ソースファイルもいくつかあります.一番長いrediscも7000行余りしかありません.通読の難しさはそれほど大きくありませんが、redisをよく知っておくことが前提です.PHPredisは本質的にredisクライアントである.今まで私のredisに対してまだ理解していないで、感じはゆっくりと熟知します.注目すべきはPHPredisがセッション管理機能も実現しているようです.ソースコードには、次の文が明確に定義されています.
#ifdef PHP_SESSION
extern ps_module ps_mod_redis;
#endif
は、セッションを構成する場合にセッション機能をサポートする.redis_session.cには、コードに示すように、チェーンテーブルで実装される接続プールが定義されています.
typedef struct redis_pool_member_ {

	RedisSock *redis_sock;
	int weight;
	int database;

    char *prefix;
    size_t prefix_len;

    char *auth;
    size_t auth_len;

	struct redis_pool_member_ *next;

} redis_pool_member;
接続プールチェーンテーブルは、ソケットリソースのcpu時間の無駄な申請を繰り返すことを回避することができる.サーバ側ではredisのようなPHPへのアクセスが密集しており,アクセスターゲットもほとんど変動しないため,接続プールが非常に有効であることが明らかになった.