2017-12-05 23 views
0

우분투 기반 서버에서 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 파일로 변환됩니다.

그러나 스크립트의 두 번째 인스턴스가 실행될 때, 간부 인() 함수는 그들 중 하나와 다른 하나, 그것은 종료 상태 1에 다음과 같은 오류 발생에 작동 : 다른 단어에서

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(); 

정확히 무엇이 문제입니까? 문제를 어떻게 해결할 수 있습니까?

답변

0

글쎄, 난 그냥 입력 전에 을 추가하고 지금 작동합니다.

하지만 스크립트의 첫 번째 실행에서 디렉토리를 추가하기 전에 왜 작동하는지 알아 보시겠습니까?