像你所說的那樣,你的代碼直接從命令行工作,但不是從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在安全模式下運行
shell_exec()
(反引號的功能等同物) 該功能被禁用。
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);
}
,以確保您創建日誌文件是可寫的並具有正確的權限這是非常重要的!
我個人刪除日誌文件以防萬一它存在,以確保我有最近合理的日誌文件。
我敢打賭,它既可以像這樣工作,也可以小調整!
如果它不適合你,請讓我知道,我會詳細說明!
你的結果是什麼? –