Monthly Archives: January 2014

PHP 5.5로 업그레이드 해보자(CentOS 6.4 / yum)

이 포스트는 CentOS 6.4를 기준으로 쓰여졌습니다.

PHP 5.5가 발표된지도 반년이 훌쩍 넘어가는 가운데 그동안 5.4 버전을 사용해 오다가 별안간 5.5로 업그레이드를 해보고 싶어졌습니다(그리고 그 장대한 삽질의 과정은 과감히 생략합니다…)

과정은 크게 기존 php를 삭제하고 5.5 버전을 새로 설치하는 절차로 진행되겠습니다.

1. 현재 설치되어 있는 php 패키지를 확인합니다.

yum list installed | grep php

저의 경우에는 다음과 같이 출력되었습니다.

php.x86_64            5.4.23-29.el6.art @atomic   
php-bcmath.x86_64     5.4.23-29.el6.art @atomic
php-cli.x86_64        5.4.23-29.el6.art @atomic
php-common.x86_64     5.4.23-29.el6.art @atomic
php-devel.x86_64      5.4.23-29.el6.art @atomic
php-gd.x86_64         5.4.23-29.el6.art @atomic
php-mbstring.x86_64   5.4.23-29.el6.art @atomic
php-mcrypt.x86_64     5.4.23-29.el6.art @atomic
php-mysqlnd.x86_64    5.4.23-29.el6.art @atomic
php-pdo.x86_64        5.4.23-29.el6.art @atomic
php-pear.noarch       1:1.9.4-4.el6     @base
php-soap.x86_64       5.4.23-29.el6.art @atomic

 
2. 설치된 패키지들을 삭제합니다. 자신의 목록을 메모장 등 붙여넣기해서 편집하시는 것을 추천합니다.

yum remove php.x86_64 php.x86_64 php-bcmatch.x86_64 php-cli.x86_64 php-common.x86_64 php-devel.x86_64 php-gd.x86_64 php-mbstring.x86_64 php-mcrypt.x86_64 php-mysqlnd.x86_64 php-pdo.x86_64 php-pear.noarch php-soap.x86_64

 
3. php5.5를 설치합니다. 위 패키지 목록의 php부분을 php55w로 고치시면 됩니다.

yum install php55w.x86_64 php55w.x86_64 php55w-bcmatch.x86_64 php55w-cli.x86_64 php55w-common.x86_64 php55w-devel.x86_64 php55w-gd.x86_64 php55w-mbstring.x86_64 php55w-mcrypt.x86_64 php55w-mysqlnd.x86_64 php55w-pdo.x86_64 php55w-pear.noarch php55w-soap.x86_64

 
4. 설정파일을 복구합니다. 기존의 php를 삭제하는 과정에서 나오는 메시지를 유심히 보셨다면 알 수 있습니다만, httpd.conf 파일과 php.ini 파일이 각각 httpd.conf.rpmsave, php.ini.rpmsave로 변경되어 저장됩니다. 설정파일을 다시 손보셔도 되고 .rpmsave로 저장된 기존 설정 파일을 사용하셔도 됩니다.
 
5. 서버를 재시작 합니다.

service httpd restart

 
제대로 업그레이드 되어 있는지 확인하려면 php -v로 확인해 보시면 됩니다.

PHP 5.5.7 (cli) (built: Dec 13 2013 15:59:26) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.5.0, Copyright (c) 1998-2013 Zend Technologies

 
5.5.7 버전으로 성공적으로 업그레이드 되었습니다.
 
6. 혹시 자신의 서버에 MongoDB가 설치되어 있다면(정확히는 php 드라이버) 서버를 재시작하는 과정에서 혹은 php -v에서 버전을 확인하는 과정에서 에러가 발생합니다.

PHP Warning:  PHP Startup: mongo: Unable to initialize module
Module compiled with module API=20100525
PHP    compiled with module API=20121212
These options need to match
 in Unknown on line 0

 
설치된 MongoDB PHP 드라이버의 버전이 맞지 않아서 발생하는 문제입니다. 드라이버를 재설치 해줍니다.

sudo pecl install mongo

 
설치가 완료된 후 service mongod restart로 DB를 재시작 해주시면 됩니다.

MongoDB Document 삽입하기

MongoDB는 각각의 레코드를 document라고 하며, document의 집합이 collection 입니다.  colleciton은 Sql DB에서 Table에 해당합니다.

각각의 Document는 JSON의 형태를 취하며 Binary로 저장되며 MongoDB에서는 이러한 데이터 형태를 BSON이라고 지칭합니다.  DB 콘솔에서 다음과 같은 형태의 document를 삽입해 보겠습니다. collection의 이름은 profile이라고 가정하겠습니다.

{
    'name' : {
               'first_name' : 'john',
               'last_name' : 'smith'
             },
    'gender' : 'male'
    'age' : 20
}

 

document의 삽입에는 insert()를 이용합니다.

db.profile.insert( { 'name' : { 'first_name' : 'john', 'last_name' : 'smith' },
                     'gender' : 'male',
                     'age' : 20 } );

 

MySql 콘솔과 마찬가지로 행 구분을 세미콜론으로 하기 때문에 구분하기 쉽게 개행하면서 입력하시면 됩니다. 콘솔상에서 변수를 생성해서 입력하는 방법도 있습니다.

var person = { 'name' : { 'first_name : 'john', ... };
db.profile.insert( person );

 

기본적인 문법은 Javascript와 동일합니다. 이번에는 PHP상에서 Document를 삽입해 보겠습니다. 예제는 Codeigniter 프레임웍과 만든김에 MongoQ 라이브러리를 사용해 보도록 하겠습니다(…)

//라이브러리 초기화
$this->load->library( 'mongoq' );

//document 작성은 배열을 활용합니다.
$person = array( 'name' => array( 'first_name' => 'john', 'last_name' => 'smith' ),
                 'gender' => 'male',
                 'age' => 20 );

//collection 이름은 profile입니다.
$this->mongoq->collection( 'profile' );

//document를 삽입합니다.
$this->mongoq->insert( $person );

 
document가 profile이라는 이름의 collection에 삽입되었습니다.  find()를 함수를 이용해 정상적으로 입력되었는지 확인해 보겠습니다.

$this->mongoq->collection( 'prifile' );

// find()함수의 인수를 true로 지정해 결과값을 배열로 받도록 하겠습니다.
$result = $this->mongoq->find( true );

// json형식으로 파싱해서 출력해 보겠습니다.
echo json_encode( $result );

 
최초에 제시한 형태의 json 데이터로 출력되면 성공입니다.

MongoDB Document 인출하기, db.collection.find() (2)

MongoDB Document 인출하기, db.collection.find() (1)에서 이어지는 글입니다.

MongoDB의 논리 연산자는 NOT, AND, OR, NOR의 네 종류가 있습니다. find() 메서드로 데이터를 인출 할때 논리 연산자를 이용해 조건을 다양하게 부여할 수 있습니다.  기본적인 사용 방법은 비교연산자와 유사합니다.

db.collection.find( { '$Operator' : [ { expression1, 
                                        expression2 ... } ] 
                     } );

$operator 부분에 $not, $and, $or, $nor 의 논리연산자가 들어가고 expression에 조건문이 들어갑니다.  비교연산자를 이용한 조건문 작성은 최상단에 링크된 1편을 참조하세요.  소괄호와 중괄호, 대괄호가 모두 쓰여서 대단히 복잡해 보이지만 대괄호의 위치만 신경쓰면 크게 어렵지 않습니다.

그럼 OR 연산으로 name = ‘a’ 이거나 age >= 19 인 조건문을 작성해 보겠습니다.

db.collection.find( { '$or' : [ { 'name' : 'a' },
                                { 'age' : { '$gte' : 19 } } ] } );

다른 논리 연산자들도 동일한 형태로 조건을 만듭니다. 다만 AND의 경우에는 콤바로 단순히 표현식을 열거하는 것 만으로도 AND 연산으로 간주된다는 특징이 있습니다. 예를들어

db.collection.find( { 'name' : 'jane' }, 
                    { 'gender' : 'female' } );

db.collection.find( { '$and' : [ { 'name' : 'jane' }, 
                                 { 'gender' : 'female } ] 
                     } );

위 두가지 표현식은 동일한 의미를 갖습니다. 단순히 AND 연산만 할 것이라면 콤마로 이어서 조건을 나열해 주는 것이 좋겠지만 다른 논리 연산자와 함께 쓴다고 가정 했을 때는 아래의 표현식을 사용하는 것이 좋을 것으로 생각됩니다.