這篇文章主要介紹了關於predis如何實現phpredis的pconnect方法,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
predis和phpredis都是redis的php客戶端,差別可以看這裡,這裡不贅述。
phpredis是php擴展,C語言所寫,誕生較早,許多PHPer都很熟悉。
predis是用PHP語言編寫,由於近年來composer的盛行,以及許多框架的支援composer,存於composer函式庫的predis也被大量應用。
pconnect()是phpredis裡的方法,區別於connect(),詳細了解可以看這篇,總結一下就是pconnect方法建立後的連接並不隨這請求的結束而關閉,而是依賴於php-fpm進程,php-fpm進程不死,redis connect就一直存在,直到空閒超時自動斷開。 也就是建立了持久連接,適用於高並發下PHP請求Redis。
但是predis沒有pconnect()方法,該如何實現類似的功能呢?
專案使用的是Laravel框架,但是在文件中並沒有找到相關的設定參數。於是只能讀取外掛程式原始碼,最後在/src/Connection/StreamConnection.php
這個類別中找個了實作連接redis的方法:
/** * Initializes a TCP stream resource. * * @param ParametersInterface $parameters Initialization parameters for the connection. * * @return resource */ protected function tcpStreamInitializer(ParametersInterface $parameters) { if (!filter_var($parameters->host, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { $address = "tcp://$parameters->host:$parameters->port"; } else { $address = "tcp://[$parameters->host]:$parameters->port"; } $flags = STREAM_CLIENT_CONNECT; if (isset($parameters->async_connect) && $parameters->async_connect) { $flags |= STREAM_CLIENT_ASYNC_CONNECT; } if (isset($parameters->persistent)) { if (false !== $persistent = filter_var($parameters->persistent, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE)) { $flags |= STREAM_CLIENT_PERSISTENT; if ($persistent === null) { $address = "{$address}/{$parameters->persistent}"; } } } $resource = $this->createStreamSocket($parameters, $address, $flags); return $resource; }
在第19行的 $parameters->persistent
我們可以看到一個陌生的參數persistent
,翻譯為'持久'。 所以只要在使用predis連接redis的時候,加上參數persistent,並賦給一個true或1,就可以實現phpredis的pconnect(),簡單方便。
下邊是郵件佐證,表示沒有錯誤理解原始碼:
Can the predis support the function pconnect() which in php-redis? Yes, just add in the connection parameters persistent=1 (when using URI strings) or persistent => true (when using a named array).
這個坑是怎麼踩到的呢?還是因為框架文檔的原因,目前很多PHP框架都已經支援了composer,如Laravel,Yii,CI等,但是並不能保證文檔及時更新,尤其是中文文檔,所以還是要有閱讀源碼的能力。
其實從上邊的程式碼還可以看到很多內容:
#predis使用了tcp的方式連接redis,主要用到的函數是stream_socket_client
(predis也有http的方式連接redis,主要用curl,不在這個類別)。
predis並不依賴phpredis。很多專案環境安裝了phpredis又在框架安裝了predis,就以為後者依賴前者,這是錯誤的。
在上述程式碼第16行還可以看到另一個參數async_connect,用於非同步連接,也很重要,但在許多文件裡都沒有介紹。
來源:https://blog.csdn.net/u013474436/article/details/53131662
相關推薦:
以上是predis如何實作phpredis的pconnect方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!