> 백엔드 개발 > PHP 튜토리얼 > predis가 phpredis의 pconnect 메소드를 구현하는 방법

predis가 phpredis의 pconnect 메소드를 구현하는 방법

不言
풀어 주다: 2023-03-24 20:02:01
원래의
2241명이 탐색했습니다.

이 글은 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等,但是并不能保证文档及时更新,尤其是中文文档,所以还是要有阅读源码的能力。

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

  1. predis使用了tcp的方式连接redis,主要用到的函数是stream_socket_client의 19번째 줄에서 $parameters- >per지속'지속적'으로 번역되는 익숙하지 않은 매개변수인 지속성을 볼 수 있습니다.

    predis를 사용하여 redis에 연결할 때 persist 매개변수를 추가하고 이를 true 또는 1로 할당하면 간단하고 편리한 phpredis의 pconnect()를 구현할 수 있습니다.
  2. 다음은 소스코드에 대한 오해가 없음을 증명하기 위한 메일입니다.

    rrreee
  3. 어떻게 이 구덩이에 발을 담그셨나요? 또는 프레임워크 문서로 인해 현재 많은 PHP 프레임워크가 Laravel, Yii, CI 등과 같은 작성기를 지원하지만 문서, 특히 중국어 문서가 제때에 업데이트될 것이라는 보장이 없으므로 여전히 해당 기능이 필요합니다. 소스 코드를 읽으려면.
  4. 사실 위의 코드에서 많은 것을 볼 수 있습니다:

    predis는 tcp를 사용하여 redis에 연결하며, 주로 사용되는 함수는 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="//m.sbmmt.com/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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    관련 라벨:
    원천:php.cn
    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    인기 튜토리얼
    더>
    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿