라라벨 tinker 와 php 대화형 모드에서 한글 입력하기

개요

PHP 5.1 부터는 php -a 명령으로 실행하면 perl 나 ruby 처럼 대화형 쉘(interactive mode)을 사용할 수 있으며 라라벨은 tinker 명령을 대화형 쉘 보다 더 진화된 REPL을 제공하고 있습니다.


그런데 특정 배포판의 경우 대화형 쉘이나 REPL 실행시  한글과 한자등 non-ascii 문자가 입력되지 않는 문제가 있습니다.


원인을 찾아보니 PHP 에서는 command line 처리를 위해 GNU 의 readline 인터페이스를 구현한 edit-library(libedit) 라는 라이브러리를 사용합니다.

libedit 는 GPL 이 아니라 BSD license 이며 소스를 공개하지 않는 제품에 사용해도 문제가 없으므로 readline 대용으로 많이 사용하는 것 같습니다.


하지만 RHEL/CentOS 과 Ubuntu 리눅스에 탑재된 libedit 는 버그가 있거나 버전이 낮아서 ascii 영역이 아닌 UTF-8 문자를 제대로 처리하지 못합니다.


이 문제는 CentOS 7 나 Ubuntu 14 에서도 동일하므로 다음과 같이 버그가 수정된 libedit 를 컴파일해서 해결해야 합니다.

해결

RHEL/CentOS 

  1. GNU C 컴파일러와 터미널 처리 라이브러리인 ncurses-devel 을 설치합니다.

    RHEL/CentOS
    yum install gcc ncurses-devel make
  2. http://thrysoee.dk/editline/ 에서 최신  libedit 소스를 다운로드 합니다. 

    wget http://thrysoee.dk/editline/libedit-20190324-3.1.tar.gz
  3. 압축을 풀고 컴파일 환경을 구성합니다.

    tar zxvf libedit-*tar.gz
    cd libedit-*
    ./configure --prefix=/usr
    예전에는 UTF 처리를 위해 --enable-widec 옵션을 주고 컴파일해야 했지만 최신 버전은 기본적으로 UTF-8 을 지원합니다.
  4. 컴파일하고 설치합니다.

    make 
    sudo make install
  5. root 사용자로 라이브러리 심볼릭 링크를 실행합니다. 

    sudo ln -sf /usr/lib/libedit.so.0 /usr/lib64/libedit.so.0  
    sudo ln -sf /usr/lib/libedit.so /usr/lib64/libedit.so




Ubuntu

  1. GNU C 컴파일러와 터미널 처리 라이브러리인 ncurses-devel 을 설치해야 합니다.

    Ubuntu
    sudo apt-get install gcc libncurses5-dev make
  2. CentOS 항목의 2(libedit 다운로드) ~ 4번(make install)까지 실행합니다.
  3. 우분투는 PHP의 readline.so 파일이 /usr/lib/x86_64-linux-gnu/libedit.so.2 을 링크하고 있으므로 이 파일이 새로운 libedit 를 가리키도록 수정하면 됩니다.

    ldd /usr/lib/php5/20131226/readline.so
     
    ## PHP7
    ldd /usr/lib/php/20151012/readline.so


  4. root 사용자로 /usr/lib/x86_64-linux-gnu/libedit.so.2 의 심볼릭 링크를 수정합니다.

    sudo ln -sf /usr/lib/libedit.so /usr/lib/x86_64-linux-gnu/libedit.so.2

확인

  1. artisan tinker 명령을 실행하여 정상적으로 한글이 입력되는지 확인합니다.


같이 보기

Ref