PHPredis初探

        以前一直不明白不同語言之間相互調用的原理。直到後來看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/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的訪問是很密集的,而且訪問目標也基本不會有很大的變動,所以連接池應該是非常有效的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章