Page tree

 

PHP 에서 redis 에 연동하기 위한 client library 중 가장 유명한 것은 Pure PHP 로 개발한 predis 와 C 언어로 만든 PHP 모듈인 phpredis 두 가지이다.

두 가지중 C 로 만든 phpredis 가 성능이 더 우수하다는 벤치마크 결과가 많으므로 이를 사용하여 PHP 에서 redis 에 연계하는 방법을 알아 보자.

 

설치

PHP 를 remi 또는 webtatic 어디에서 설치했는지와 PHP 버전에 따라서 PHP 관련 패키지 명이 약간 다르다.

remi 저장소의 PHP 패키지는 php54, php55 처럼 php 뒤에 버전이 붙고 WebTatic 은 php54w, php55w 처럼 php 버전뒤에 w 가 붙는다.

source compile

  1. 소스를 컴파일해서 설치하려면 먼저 gcc 컴파일러와 php 개발 패키지와 igbinary serializer(옵션)를 설치해야 한다. ()

    # Webtatic 에서 php 5.4 를 설치했을 경우
    yum install gcc php54w-devel php54w-pecl-igbinary
     
    ## Remi 에서 php 5.5 를 설치했을 경우
    yum install gcc php55-devel php55-pecl-igbinary
  2. github 에서 소스 복제

    git clone https://github.com/phpredis/phpredis
    cd phpredis
  3. autoconf 및 Makefile 생성.  --enable-redis-igbinary 는 igbinary 패키지를 설치했을 경우에만 사용

    phpize
    ./configure --enable-redis-igbinary
  4. 컴파일

    make
  5. 설치 (root 로 실행)

    make install
    echo "extension=redis.so" > /etc/php.d/redis.ini

 

yum 으로 설치

 

PHP 설치 저장소에 따라 패키지명이 약간 다르다. 

# webtatic 저장소에서 PHP-5.4를 설치할 경우
yum install php54w-pecl-redis --enablerepo=webtatic
 
## PHP 5.5
yum install php55w-pecl-redis --enablerepo=webtatic

 

확인

  1. phpinfo(); 를 호출하여 extension 에 redis 가 있는지 확인
  2. 다음 php 코드 수행
redis.php
<?php
$redis = new Redis();
try {
    $redis->connect('127.0.0.1','6379', 2.5, NULL, 150);
    $key = 'myKey';
    $value = array('val1' => 'myValue1',
                    'val2' => 'Value2');
    $ttl = 3600;
    $redis->setex( $key, $ttl, $value );
    $value = $redis->get($key);
    var_dump($value);
} catch(RedisException $e) {
    var_dump($e);
}
$redis->close();
?>

 

SELinux 설정

CentOS 6

위 예제 코드를 쉘 상에서 php redis.php 로 실행하면 정상 동작하지만 웹 서버에서 실행하면 다음과 같은 에러가 발생하고 정상적으로 동작하지 않는다.

PHP Fatal error:  Uncaught exception 'RedisException' with message 'Redis server went away' in /var/www/html/redis.php:20

이는 PHP 는 웹 서버에서 실행되므로 웹 서버의 권한을 상속받는데 SELinux 보안 정책에 의거해 웹 서버는 redis 가 사용하는 포트인 6379 에 연결할 수 없기 때문이다. 

semanage 명령어로 httpd 가 6379 포트에 연결할 수 있도록 설정해 주면 SELinux enforce mode 에서도 정상 동작한다.

semanage port -a -p tcp -t http_port_t 6379

CentOS 7

CentOS 은 redis_port_t 라는 context 가 추가되었으므로 semanage port -a 명령어를 실행하면 오류가 발생한다. 다음 custom TE 를 작성한 후에 module 을 컴파일하고 로딩하면 정상 동작한다.

  1.  httpd-redis.te  파일 작성

    httpd-redis.te
    module httpd-redis 1.0;
    require {
            type redis_port_t;
            type httpd_t;
            class tcp_socket name_connect;
    }
    #============= httpd_t ==============
    #!!!! This avc can be allowed using the boolean 'httpd_can_network_connect'
    allow httpd_t redis_port_t:tcp_socket name_connect;
  2. audit2allow 로 TE 컴파일

    audit2allow -a -M httpd-redis
  3. module 설치

    semodule -i httpd-redis.pp

 

같이 보기

 

Ref