PHP는 exec를 통해 linux "less" 명령을 실행합니다 - 바이너리 파일 경고
문제
일부 PDF 파일을 TXT로 변환해야 합니다.예를 들어 pdftotext에는 PDF의 테이블에 몇 가지 문제가 있기 때문에 "less" 명령으로 끝납니다.문제는 정보를 표시하는 것보다 exec 함수(또는 shell_exec/system)에서 명령을 실행했을 때 선택한 PDF가 바이너리 파일이고 결과 파일이 PDF 데이터가 포함된 TXT라는 것입니다.하지만 일반적으로 터미널에서 동일한 작업을 수행하면 모든 것이 정상입니다.저도 www_data 사용자로 로그인을 시도하고 이 사용자로 명령어를 실행해 보았지만 역시 문제가 없습니다.
명령:
$ less /var/www/original.pdf > /var/www/new.txt
PHP 코드:
exec("less -f /var/www/original.pdf > /var/www/new.txt 2>&1");
PHP exec의 결과:
"/var/www/original.pdf" may be a binary file. See it anyway?
exec 명령에 "-f" 옵션이 있는 이유는 "예, 어쨌든 보고 싶습니다."를 위해 "y"를 누를 필요가 없기 때문입니다.
set | grep less
수익률:
LESSCLOSE='/usr/bin/lesspipe %s %s'
LESSOPEN='| /usr/bin/lesspipe %s'
Lossless LZW RLE Zip' -- "$cur" ));
_apport_parameterless
_apport_parameterless
_apport_parameterless
_apport_parameterless
_apport_parameterless ()
해결책
에서 무엇을 읽고,당신의 콘솔을 표시할 수 있는 PDF 파일 less
고 있기 때문에 당신은 입력 전처리 설치 lesspipe
나 lessfile
.방법 확인 less
사용하는 전처리기를 읽고 환경변수라는 LESSOPEN 는 지점을 lesspipe
고 lessfile
스크립트입니다.
가 방법이 있을 수도 있습니다 당신의 웹 서버를 통해 환경 변수 및 쉘 명령을 수도 있습을 복제할 수 있도록 이 동작을 당신의 전화 less
분석 Pdf 파일이 제대로.
내가 제안하는 것을 호출하는 것입 bash 스크립트를 수행합 변환을 위해 당신을 호출하는 대신 less
이 직접 있습니다.는 방법은,당신의 bash 스크립트가 설정할 수 있는 적절한 환경 변수를 실행하여 해당 명령을 변환하는 PDF 파일을 읽을 수 있는 출력된다.
의 예는 다음과 같다:
#!/bin/bash
eval $(lesspipe)
less $1 > $2 2>&1
그런 다음,PHP,호출하는 스크립트는 다음과 같다:
exec("/path/to/your/script/script.sh /var/www/original.pdf /var/www/new.txt");
그것은 작동하지 않는 경우에,변경하십시오 eval $(lesspipe)
하기 eval $(lessfile)
.
다른 팁
우선 텍스트 스트림을 읽는 대화 형 프로그램입니다.이 문맥에서 대신 cat
를 사용해야합니다.PDF는 텍스트 기반과 달리 PDF가 바이너리 형식 이므로이 또는 코스는 작동하지 않습니다.
PDF를 pdftotext
와 같은 텍스트 변환기로 사용하지 않으십니까?
PHP 코드는 어떻게 실행되었나요?명령줄에서 다음을 통해 php file.php
또는 브라우저로 접속할 때 웹 서버에 의해 http://servername/something/file.php
?
한 가지 추측은 less
명령줄에서 수행할 때 실행하는 것은 동일하지 않습니다. less
PHP 코드가 실행될 때와 같습니다.