就像你所提到的,你的代码可以直接从命令行运行,但是不能从PHP CLI中运行。这很可能是由于日志文件权限不正确导致的,这意味着你必须先创建一个具有正确权限的日志文件,然后将输出写入其中!
例如,从命令行(不是PHP)确保你删除了日志文件buffer.txt
并重新运行你的PHP代码。很可能不起作用,因为你的文件不存在。请记住,当你直接从命令行运行该命令时,你的日志文件buffer.txt
是使用特殊权限(不仅是读/写,还包括组和所有者(Linux))创建的。当PHP创建一个文件时,默认情况下,它使用nobody nobody
作为所有者/组,并且你已经有一个日志文件(因为你从命令行运行了同样的命令),它是由其他用户(我猜测是管理员)创建的,结果是,由于错误的文件权限,PHP将无法使用它。尝试通过在Linux中执行ls -ls
或在Windows中执行DIR /Q
来查看当前日志文件的所有者/组。
除此之外,请确保你没有在安全模式下运行PHP,因为如果PHP处于安全模式,exec
可能无法按预期工作。
shell_exec()
(反引号的功能等价函数)
当PHP运行在安全模式下时,该函数被禁用。
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)或
了解重定向的一切(适用于Linux)中了解更多关于命令重定向的信息。
你的日志转换函数可能像这样:
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);
}
确保您创建的日志文件可写且具有正确的权限非常重要!
我个人会删除日志文件(如果存在),以确保我拥有最新和合理的日志文件。
我敢打赌,它将像这样工作,或者需要进行小的调整!
如果对您不起作用,请告诉我,我会详细说明!