[PHP] shell_exec() 로 한글 경로가 포함된 svn 이 동작하지 않을 때

[PHP] shell_exec() 로 한글 경로가 포함된 svn 이 동작하지 않을 때

728x90

반응형

결론부터 얘기하면 shell 의 locale 문제였다.

shell 에서 실행하면 shell에 설정된 locale에 따라 url encode 가 동작하니 당연히 정상으로 동작하고,

web 을 통해 실행하면 shell_exe() 의 기본환경(LC_CTYPE=C) 때문에 한글 경로가 오류나는 것이였다.

shell - locale 실행 결과

interm@interm-virtual-machine:~/www/public_html$ locale LANG=en_US.UTF-8 LANGUAGE= LC_CTYPE="en_US.UTF-8" LC_NUMERIC=ko_KR.UTF-8 LC_TIME=ko_KR.UTF-8 LC_COLLATE="en_US.UTF-8" LC_MONETARY=ko_KR.UTF-8 LC_MESSAGES="en_US.UTF-8" LC_PAPER=ko_KR.UTF-8 LC_NAME=ko_KR.UTF-8 LC_ADDRESS=ko_KR.UTF-8 LC_TELEPHONE=ko_KR.UTF-8 LC_MEASUREMENT=ko_KR.UTF-8 LC_IDENTIFICATION=ko_KR.UTF-8 LC_ALL=

web - shell_exec("locale") 을 통한 var_dump 결과

string(282) "LANG=C LANGUAGE= LC_CTYPE="C" LC_NUMERIC=ko_KR.UTF-8 LC_TIME=ko_KR.UTF-8 LC_COLLATE="C" LC_MONETARY=ko_KR.UTF-8 LC_MESSAGES="C" LC_PAPER=ko_KR.UTF-8 LC_NAME=ko_KR.UTF-8 LC_ADDRESS=ko_KR.UTF-8 LC_TELEPHONE=ko_KR.UTF-8 LC_MEASUREMENT=ko_KR.UTF-8 LC_IDENTIFICATION=ko_KR.UTF-8 LC_ALL= "

시도 해본 것들.

- 한글 포함된 경로의 string을 urlencode

- 스페이스 문제일까 str_replace를 통한 공백 \ 추가

- svn의 문제일까 한글만 포함된 url, 공백이 포함된 url shell/web 에서 실행 및 비교해보기

- php env 를 putenv() 를 통해 locale 지정

등 그 외 생각 안나는 조치까지..

php의 exec_shell()은 fork 된 shell 내에서 환경변수를 줬던게 기억났다.

진작에 생각해냈어야 헀는데 한글 경로를 자주 안쓰다보니 이런 삽질도 하게 된다. 분명 예전에도 했던건데..

그래서 exe_shell() 내 명령을 수정하며 문제 해결.

$num_rev = shell_exec("svn info --username -i | grep Revision: | cut -c11-"); echo $num_rev; // NULL 출력, svn encoding 오류 $num_rev = shell_exec("export LC_CTYPE=ko_KR.UTF-8; svn info --username -i | grep Revision: | cut -c11-"); echo $num_rev; // 정상 출력 확인

728x90

반응형

from http://muabow.tistory.com/209 by ccl(A) rewrite - 2021-12-27 12:26:42