首頁  >  文章  >  後端開發  >  predis如何實作phpredis的pconnect方法

predis如何實作phpredis的pconnect方法

不言
不言原創
2018-04-26 09:47:362216瀏覽

這篇文章主要介紹了關於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等,但是並不能保證文檔及時更新,尤其是中文文檔,所以還是要有閱讀源碼的能力。

其實從上邊的程式碼還可以看到很多內容:

  1. #predis使用了tcp的方式連接redis,主要用到的函數是stream_socket_client (predis也有http的方式連接redis,主要用curl,不在這個類別)。

  2. predis並不依賴phpredis。很多專案環境安裝了phpredis又在框架安裝了predis,就以為後者依賴前者,這是錯誤的。

  3. 在上述程式碼第16行還可以看到另一個參數async_connect,用於非同步連接,也很重要,但在許多文件裡都沒有介紹。


來源:https://blog.csdn.net/u013474436/article/details/53131662

相關推薦:

php-redis擴充安裝(phpredis)


#

以上是predis如何實作phpredis的pconnect方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn