이 글은 predis가 phpredis의 pconnect 메소드를 구현하는 방법을 주로 소개합니다. 이제 여러분과 공유합니다. 필요한 친구들이 참고할 수 있습니다
predis와 phpredis는 모두 redis의 PHP 클라이언트입니다. 여기에서 차이점을 확인할 수 있으며 여기서는 자세히 설명하지 않겠습니다.
phpredis는 C 언어로 작성된 PHP 확장 프로그램으로, 이전에 탄생했으며 많은 PHP 사용자에게 익숙합니다.
predis는 최근 몇 년간 Composer의 인기와 다양한 프레임워크의 지원으로 인해 Composer 라이브러리에 저장된 Predis도 널리 사용되었습니다.
pconnect()는 phpredis의 메소드입니다. connect()와는 다릅니다. 자세한 내용은 이 기사를 참조하세요. 요약하자면, pconnect 메소드가 설정된 후 연결은 요청이 끝날 때 닫히지 않지만 상황에 따라 다릅니다. php-fpm 프로세스에서는 php-fpm 프로세스가 종료되지 않으며 유휴 시간 초과가 자동으로 연결 해제될 때까지 redis 연결이 항상 존재합니다. 즉, 높은 동시성에서 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; }
/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
의 19번째 줄에서 $parameters- >per지속
'지속적'으로 번역되는 익숙하지 않은 매개변수인 지속성
을 볼 수 있습니다.
다음은 소스코드에 대한 오해가 없음을 증명하기 위한 메일입니다.
rrreee사실 위의 코드에서 많은 것을 볼 수 있습니다:
stream_socket_client (predis에는 주로 이 클래스에 없는 컬을 사용하여 redis에 연결하는 http 방법도 있습니다.) <p><br></p>
<p>predis는 phpredis에 의존하지 않습니다. 많은 프로젝트 환경에서는 프레임워크에 phpredis와 predis를 설치하는데, 후자가 전자에 의존한다고 생각하는데, 이는 잘못된 것입니다. <a href="https://blog.csdn.net/u013474436/article/details/53131662"></a></p>
<p>위 코드의 16번째 줄에서는 비동기 연결에 사용되는 또 다른 매개변수인 async_connect도 볼 수 있습니다. 이 역시 매우 중요하지만 많은 문서에서 소개되지 않습니다. </p>
<p><a href="http://www.php.cn/php-weizijiaocheng-394257.html" target="_self"></a></p>
<p><br>출처:</p>https://blog.csdn.net/u013474436/article/details/53131662🎜 🎜🎜관련 권장 사항:🎜🎜🎜php-redis 확장 프로그램 설치(phpredis)🎜🎜🎜 🎜🎜
위 내용은 predis가 phpredis의 pconnect 메소드를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!