ホームページ >バックエンド開発 >PHPチュートリアル >predis が phpredis の pconnect メソッドを実装する方法

predis が phpredis の pconnect メソッドを実装する方法

不言
不言オリジナル
2018-04-26 09:47:362237ブラウズ

この記事では、predis が phpredis の pconnect メソッドを実装する方法を主に紹介します。これには、必要な友人が参照できるように共有します。predis と phpredis は両方とも redis の php クライアントです。ここで違いがわかりますが、ここでは詳しく説明しません。

phpredis は C 言語で書かれた php 拡張機能で、以前に誕生し、多くの PHPer によく知られています。
predis は PHP 言語で書かれています。近年のコンポーザーの人気と多くのフレームワークによるコンポーザーのサポートにより、コンポーザー ライブラリに保存されている predis も広く使用されています。

pconnect() は phpredis のメソッドであり、connect() とは異なります。詳細については、この記事を参照してください。要約すると、pconnect メソッドが確立された後の接続はリクエストの終了によって閉じられません。 php-fpm プロセスでは、php-fpm プロセスは停止せず、アイドル タイムアウトによって自動的に切断されるまで、redis connect は常に存在します。

つまり、永続的な接続が確立されます。これは、高い同時実行下で Redis を要求する PHP に適しています。


しかし、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() を実装できます。これはシンプルで便利です。


以下はソースコードに誤解がないことを証明するためのメールです: /src/Connection/StreamConnection.php这个类中找个了实现连接redis的方法:

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).

在第19行的$parameters->persistent我们可以看到一个陌生的参数persistent,翻译为‘持久’。所以只要在使用predis连接redis的时候,加上参数persistent,并赋给一个true或1,就可以实现phpredis的pconnect(),简单方便。

下边是邮件佐证,说明没有错误理解源码:

rrreee

这个坑是怎么踩到的呢?还是因为框架文档的原因,目前很多PHP框架都已经支持了composer,如Laravel,Yii,CI等,但是并不能保证文档及时更新,尤其是中文文档,所以还是要有阅读源码的能力。

其实从上边的代码中还可以看到很多内容:

  1. predis使用了tcp的方式连接redis,主要用到的函数是stream_socket_clientrrreee

    どうやってこの穴に足を踏み入れたのですか?または、フレームワーク ドキュメントのせいで、多くの PHP フレームワークは現在、Laravel、Yii、CI などのコンポーザーをサポートしていますが、ドキュメント、特に中国語のドキュメントが時間内に更新されるという保証はありません。そのため、依然として次の機能が必要です。ソースコードを読んでください。
  2. 実際、上記のコードから多くのことがわかります:

    1. predis は tcp を使用して Redis に接続し、使用される主な関数は stream_socket_client / code> (predis には、主にこのクラスにはないcurl を使用して、redis に接続するための http 方法もあります)。 <li><p></p></li>predis は phpredis に依存しません。多くのプロジェクト環境では、phpredis と predis がフレームワークにインストールされており、後者が前者に依存していると考えられていますが、これは間違いです。


    上記のコードの 16 行目には、非同期接続に使用される別のパラメーター async_connect もあります。これも非常に重要ですが、多くのドキュメントでは紹介されていません。

    出典:https://blog.csdn.net/u013474436/article/details/53131662

    関連する推奨事項:

    🎜php-redis 拡張機能のインストール (phpredis)🎜🎜🎜 🎜🎜

    以上がpredis が phpredis の pconnect メソッドを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。