ホームページ >バックエンド開発 >PHPチュートリアル >predis が phpredis の pconnect メソッドを実装する方法
この記事では、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() メソッドがありません。同様の関数を実装するにはどうすればよいでしょうか?
/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等,但是并不能保证文档及时更新,尤其是中文文档,所以还是要有阅读源码的能力。
其实从上边的代码中还可以看到很多内容:
predis使用了tcp的方式连接redis,主要用到的函数是stream_socket_client
rrreee
stream_socket_client / code> (predis には、主にこのクラスにはないcurl を使用して、redis に接続するための http 方法もあります)。 <li><p></p></li>predis は phpredis に依存しません。多くのプロジェクト環境では、phpredis と predis がフレームワークにインストールされており、後者が前者に依存していると考えられていますが、これは間違いです。
出典:https://blog.csdn.net/u013474436/article/details/53131662
関連する推奨事項:
以上がpredis が phpredis の pconnect メソッドを実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。