2009-10-22 8 views
19

PHP에서 exec()을 사용하여 서비스를 다시 시작하거나 MySQL 시간대 파일을로드하는 등의 작업을 수행하는 많은 명령 행 스크립트가 있습니다. exec() 자체는 아무 것도 출력하지 않지만 화면에서 실행중인 명령 중 일부는 ob_start()/ob_end_clean()에서도 억제 할 수없는 출력을 내포하고 있습니다. 예를 들어, 다음은 MySQL에 시간대 파일을로드합니다. 우리는 반드시 MySQLs 시간대 데이터를 최신 상태로 만들기 위해 주기적으로 실행 :PHP에서 exec() 호출 출력 억제하기

$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql'; 
exec($command, $output, $result); 

이 예에서, 내가 명령의 모든 출력이 $ 출력으로 기록 될 것으로 예상,하지만 난 여전히 다음과 같은 출력이 강제로 얻을 화면 :

Warning: Unable to load '/usr/share/zoneinfo/Asia/Riyadh87' as time zone. Skipping it. 
Warning: Unable to load '/usr/share/zoneinfo/Asia/Riyadh88' as time zone. Skipping it. 
Warning: Unable to load '/usr/share/zoneinfo/Asia/Riyadh89' as time zone. Skipping it. 
... 

이 출력을 억제하는 방법이 있습니까?/dev/null로 리디렉션하는 것은 PHP가 명령이 완료 될 때까지 기다리지 않고 처리를 계속하기 때문에 바람직하지 않습니다. 처리가 이루어지는 경우 단지 &를 추가하지 있는지 확인에 영향을주지해야한다 표준 에러 만 재 지정 사전에

감사합니다,
~ JamesArmes

+2

예제 코드가 작동하지 않는 이유가 궁금하다면 'stdout'만 캡처되기 때문입니다. 주어진 에러는'stderr'에 쓰여지는데, 이것은 캡쳐되지 않고 화면에 버려집니다. – etheros

+1

PHP로 스크립트를 실행할 때 모든 출력을 억제 할 수있는 방법을 찾기 위해 Google을 통해이 스레드에 왔습니다. 내 솔루션은'exec()'호출을'ob_start()'와'ob_end_clean()'에 래핑하는 것이었다. –

답변

21

. 출력을 리다이렉션하여 백그라운드에서 실행하게하는 경우에만 백그라운드에서 실행해야합니다.

편집 :

$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo 2> /dev/null | mysql mysql'; 
exec($command, $output, $result); 
+0

이것은 완전히 사실이 아닙니다. PHP 매뉴얼은 리다이렉션없이 간단히'&'를 사용하면 PHP가 멈추는 것을 의미합니다. 리디렉션만으로는 여전히 리디렉션이 백그라운드에서 실행되지 않습니다. –

+0

흠 정말로, 그것은 그럴듯 해 보입니다. 내 대답을 수정합니다 –

+0

을 사용하여 리디렉션 $ command = 'mysql_tzinfo_to_sql/usr/share/zoneinfo | mysql mysql 2>/dev/null '; 은 여전히 ​​동일한 출력을 발생시킵니다. 그러나 내 스크립트를 php mysql_timezones.php 2>/dev/null 과 같이 호출하면 출력이 제대로 표시되지 않습니다. 그런 식으로 내 스크립트를 호출하지 않고도 동일한 결과를 얻을 수 있습니까? – JamesArmes

6

그냥 stderr/dev/null

$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql 2>/dev/null'; 

나에 리디렉션 :

금이 열려 Cygwin에서, 당신은 첫 번째 명령에 대한 표준 오류를 리디렉션 할 필요가 이 시도해 stdout

$command = 'mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql mysql 2>&1'; 
+0

그건 단지 * nix에서 작동합니다 – felixfbecker

2

/dev/null로 리디렉션하면 이 아니라이 아니므로 PHP가 명령 대기를 중지합니다. &을 추가하면이됩니다. &은 리디렉션과 함께 사용되는 경우가 많으므로이 두 가지를 연결하는 것이 좋습니다. 야닉의 (삭제) 주석에 대한 응답으로

가 : 당신이 PHP에서 백그라운드로 뭔가를 실행하려면 보인다, 당신은 &를 사용하여뿐만 아니라 리디렉션해야합니다. 이것은 리디렉션만으로 인해 백그라운드에서 실행되지 않는다는 의미는 아닙니다.

+0

PHP 매뉴얼에 따르면 "프로그램이이 함수로 시작되면, 백그라운드에서 계속 실행하려면 프로그램의 출력을 파일이나 다른 출력 스트림으로 리디렉션해야합니다. 그렇게하지 않으면 프로그램 실행이 끝날 때까지 PHP가 멈추게됩니다. " 당신의 말이 맞지만, PHP는 리다이렉트와 백그라운드 연산자 모두를 필요로합니다. & – JamesArmes

+0

JamesArmes : 제 대답의 두 번째 부분은 정확하게 설명하려고합니다. –

0

http://us3.php.net/manual/en/function.shell-exec.php에 따르면이 명령의 출력을 변수에 할당 할 수 있습니다.

변수를 사용하지 않아도됩니다. 즉, 출력을 효과적으로 억제 할 수 있습니다.

희망 하시겠습니까?

+0

exec() 호출의 $ output 변수는 다음과 같습니다. do (참조로 전달 됨). 나는 shell_exec()를 사용해 보았는데 같은 결과를 낸다. – JamesArmes