2012-10-30 55 views
3

我有下面的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); 
?> 

如果我運行aa.php,其中包含了上面的代碼,它不會工作。

但是,如果我運行$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,因此exec可能無法正常工作,因爲如果PHP 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); 

這會給你一個數組,其中每個元素是你的命令返回的行。

相關問題