2012-10-30 3 views
3

에 명령 행에서 무엇을 인쇄 얻을 : 나는 위의 코드를 포함 aa.php을 실행하면PHP는 나는 다음과 같은 PHP 코드가 변수

<?php 
$video = "C:\Users\Administrator\myVideo\processing\video.mp4"; 
$cmd = 'ffmpeg -i "' . $video .'" 2>&1 | wtee buffer.txt'; // wtee is a Windows version of tee 

exec($cmd); 
echo($cmd); 
?> 

, 그것은 작동하지 않습니다.

그러나 명령 프롬프트에서 직접 출력되는 $cmd을 실행하면 buffer.txt 파일이 만들어져 작동합니다. 같은, 예를 들어, 변수에

$cmd = 'ffmpeg -i "' . $video .'"' 

:

나는이의 출력을 얻으려면 $output.

이 코드는 지금까지 빈 인쇄 :

exec($cmd,$output,$result); 
print_r($output); 
+0

$ 결과는 무엇입니까? –

답변

2

위에서 언급 한 것처럼 코드가 명령 줄에서 직접 작동하지만 PHP CLI이 아닌 것은 로그 파일 사용 권한 때문일 가능성이 큽니다. 즉, 올바른 사용 권한을 가진 로그 파일을 먼저 만들어야하며 거기에 출력을 작성해야합니다 !

예를 들어, (PHP가 아님)에서 로그 파일 buffer.txt을 삭제하고 PHP 코드를 다시 실행하십시오. 파일이 존재하지 않으므로 대부분 작동하지 않습니다. 명령 줄에서 직접 명령을 실행하면 로그 파일 (buffer.txt)이 특수 사용 권한 (읽기/쓰기뿐만 아니라 그룹 및 소유자 (Linux) 일 수도 있음)으로 만들어 짐을 기억하십시오. PHP가 파일을 만들 때 기본적으로 소유자/그룹에 nobody nobody을 사용하고 다른 사용자가 만든 로그 파일 (명령 줄에서 동일한 명령을 실행했을 때)이 이미 있습니다 (관리자). 결과적으로 잘못된 파일 권한 때문에 PHP가이를 사용할 수 없다는 것을 확신 할 수 있습니다. 현재 로그 파일에 무엇이 있는지 확인하십시오. 소유자/그룹 Linux에서 ls -ls을 실행하거나 Windows에서 DIR /Q을 실행하여 아이디어를 얻으십시오.

PHP는 안전 모드에서 실행하지 마십시오. 결과적으로 execPHP is in safe mode 인 경우 비활성화되어 있기 때문에 예상대로 작동하지 않을 수 있습니다. PHP 안전 모드에서 실행 중일 때

  1. shell_exec() (역 따옴표의 기능적 등가물) 이 기능은 중지된다.

  2. exec() 에서만 은 safe_mode_exec_dir 내에서 실행 파일을 실행할 수 있습니다. 실용적인 이유로 현재 실행 파일의 경로에 구성 요소가있는 것은 허용되지 않습니다. escapeshellcmd()이이 함수의 인수에서 실행됩니다.

phpinfo() 기능을 사용하여 서버의 PHP 설정을 확인할 수 있습니다.

귀하의 코드는 오히려 다음과 같아야합니다

exec("$cmd 2>&1", $output); 
log_conversion($config['logs_path']. '/' .$video_id. '_log.txt', $cmd); 
log_conversion($config['logs_path']. '/' .$video_id. '_log.txt', implode("\n", $output)); 

그게 무슨 뜻 이죠? 2>&1이라고 말하면 stderr을 현재 stdout으로 리디렉션합니다. stdout이 콘솔로가는 경우 stderr도 마찬가지입니다. stdout이 파일로가는 경우 stderr도 마찬가지입니다.

Windows의 경우 Using command redirection operators 또는 Linux의 경우 All about redirection 문서에서 명령 재 지정에 대해 자세히 읽어보십시오.

로그 변환 기능이 같을 수 :

그것은 당신이 만들 로그 파일이 쓰기 가능하고 올바른 사용 권한이 있는지 확인하는 것이 매우 중요합니다
function log_conversion($file_path, $text) 
{ 
    $file_dir = dirname($file_path); 
    if(!file_exists($file_dir) || !is_dir($file_dir) || !is_writable($file_dir)) 
     return false; 

    $write_mode = 'w'; 
    if(file_exists($file_path) && is_file($file_path) && is_writable($file_path)) 
     $write_mode = 'a'; 

    $handle = fopen($file_path, $write_mode); 
    if(!$handle) 
     return false; 

    if(fwrite($handle, $text. "\n") == FALSE) 
     return false; 

    @fclose($handle); 
} 

!

로그 파일이있을 경우 개인적으로 삭제하여 최근의 합리적인 로그 파일이 있는지 확인하십시오.

나는 이것 또는 작은 조정으로 작동 할 것입니다 내기!

작동하지 않는 경우 알려 주시면 자세히 설명 드리겠습니다.

0

exec는 출력 변수에 대한 배열을 필요로한다. 그래서 시도 : 당신에게 각 요소는 당신의 명령에 의해 반환 된 라인 배열을 줄 것이다

$output = array(); 
exec($cmd, $output, $result); 

합니다.

관련 문제