shell_exec() 로 한글 경로가 포함된 svn 이 동작하지 않을 때
결론부터 얘기하면 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 <URL> --username -i <username> | grep Revision: | cut -c11-");
echo $num_rev; // NULL 출력, svn encoding 오류
$num_rev = shell_exec("export LC_CTYPE=ko_KR.UTF-8; svn info <URL> --username -i <username> | grep Revision: | cut -c11-");
echo $num_rev; // 정상 출력 확인
'IT > web' 카테고리의 다른 글
[PHP] json_decode 설명과 예제 (0) | 2021.12.28 |
---|---|
[PHP] json_encode 설명과 예제 (0) | 2021.12.27 |
[PHP] file_exists()에 공백이 포함되었을 때 해결 방안 (0) | 2021.12.27 |
[javascript] jquery multiple select 예제와 소스코드 공유 (0) | 2021.12.26 |
[javascript] jquery ajax 예제와 소스코드 공유 (0) | 2021.12.26 |
댓글