라라벨 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
GNU C 컴파일러와 터미널 처리 라이브러리인 ncurses-devel 을 설치합니다.
RHEL/CentOSyum install gcc ncurses-devel make
http://thrysoee.dk/editline/ 에서 최신 libedit 소스를 다운로드 합니다.
wget http://thrysoee.dk/editline/libedit-20190324-3.1.tar.gz
압축을 풀고 컴파일 환경을 구성합니다.
tar zxvf libedit-*tar.gz cd libedit-* ./configure --prefix=/usr
예전에는 UTF 처리를 위해 --enable-widec 옵션을 주고 컴파일해야 했지만 최신 버전은 기본적으로 UTF-8 을 지원합니다.
컴파일하고 설치합니다.
make sudo make install
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
GNU C 컴파일러와 터미널 처리 라이브러리인 ncurses-devel 을 설치해야 합니다.
Ubuntusudo apt-get install gcc libncurses5-dev make
- CentOS 항목의 2(libedit 다운로드) ~ 4번(make install)까지 실행합니다.
우분투는 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
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
확인
- artisan tinker 명령을 실행하여 정상적으로 한글이 입력되는지 확인합니다.