우분투 기반 서버에서 pdftoppm 유틸리티를 사용하여 일괄 PDF - JPEG 대화를 수행하려면 exec()를 사용하려고합니다. PHP 스크립트 converter.php
의 주요 부분은 다음과 같습니다 이제이상한 동작으로 exec()가 임의로 실패 함
for ($i = 1; $i <= $PDF_pageCount; $i++){
exec("pdftoppm -jpeg -f $i -l $i '$PDF_source' '$PNG_output' 2>&1", $Output, $Status);
sleep(1); // To simulate delay and let the other instance to run while this one is inside the loop.
}
, 예를 들어 두 개의 파일을 :
- ./A/source_file.pdf
- ./B/source_file.pdf
이러한 파일은 디스크의 해당 위치에 있습니다. 상위 폴더 '(A/
& B/
) 소유자 및 권한은 다음과 같습니다
UID : www가 데이터, GID : www가 데이터, 권한 : 755 개
파일'(모두 source_file.pdf
) 소유자 및 사용 권한은 :
UID : WWW 데이터, GID : WWW 데이터, 허가 : 644
스크립트의 인스턴스가 하나만 실행될 때 코드가 작동하여 문제없이 출력을 생성합니다. 예 : $PDF_source = './A/source_file.pdf'
. 모든 페이지가 JPEG 파일로 변환됩니다.
I/O Error: Couldn't open file '/path/to/source_file.pdf': No such file or directory.
, 하나를 파일이 JPEG로 변환되고 다른 파일 (이미 첫 번째 파일이 종료되었을 수 있음)이 출력시 오류를 생성합니다. 파일에 대한 모든 경로가 정확하고 파일이 있음에 유의하십시오.
또한 스크립트가 cronjob에에서 다음 명령을 사용하여 CLI에서 실행되고있다 (하지만 너무 표준 웹 요청에서 실행할 수 있습니다) 참고 :
/path/to/php -q /path/to/converter.php
내가 하나 개 이상의 인스턴스를 실행 방지하기 위해 시도 스크립트 시작 부분에 다음 코드와 함께 한 번에 파일 이름을 넣으십시오.
class Lock{
private $fp;
function __construct(){
$this->fp=fopen(__FILE__,'r');
if (!flock($this->fp,LOCK_EX|LOCK_NB)) {
die('ARN'.PHP_EOL);
}
}
function __destruct(){
flock($this->fp,LOCK_UN);
fclose($this->fp);
}
}
$lock=new Lock();
정확히 무엇이 문제입니까? 문제를 어떻게 해결할 수 있습니까?