PHPredis其實就是一個PHP擴展。我對PHP擴展的理解也不夠深刻,半個月前都還不知道這東西是什麼呢!依據我粗淺的理解,PHP擴展的機制和Linux內核的模塊機制是相似的。在一定的時候加載,模塊中定義了初始化函數和卸載函數和其他的接口函數。通過加載註冊的操作,接口函數被導入到一個符號表中。然後就可以在PHP語言層的代碼中使用這些函數了。這就實現了PHP的擴展。
以PHPredis來說吧!PHP和redis之間是需要通信的,redis是一個單獨運行的進程。這種通信就是進程間通信了,甚至是遠程通信了。這些都是需要用到系統調用或者封裝了系統調用的操作系統API。這時候,PHP就需要使用PHP擴展來實現和redis通信的功能了。在https://github.com/nicolasff/phpredis可以看到PHPredis的工程。因爲只是一個擴展,所以沒有很多的代碼,源文件也就幾個。最長的redis.c也只有7000多行。通讀一下的難度其實並不大,不過前提是要對redis比較瞭解。PHPredis本質上就是一個redis客戶端。到目前爲止對我redis還是不瞭解,感覺要慢慢去熟悉。值得注意的是PHPredis好像還實現了會話管理的功能。源碼中明確定義了一句:
#ifdef PHP_SESSION
extern ps_module ps_mod_redis;
#endif
在配置session的情況下支持session功能。在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時間的浪費。顯而易見的可以想到,在服務器端,PHP對如redis的訪問是很密集的,而且訪問目標也基本不會有很大的變動,所以連接池應該是非常有效的。