通过SSH远程运行PHP

时间:2016-10-02 10:31:18

标签: php laravel nginx ssh

我在Laravel Forge上使用nginx设置了一个视频编码服务器。我正在尝试使用LaravelCollective SSH package运行测试脚本以通过SSH远程编码视频。

这是我的测试脚本(index.php)

<?php
exec("ffmpeg -I input.mpg -c:v libx264 -preset faster -crf 22 -c:a aac -strict experimental -movflags +faststart -vf scale=360:-1 output.mp4 1> output.txt 2>&1");

当我通过SSH连接到服务器并从命令行运行脚本时,它可以工作:视频已编码;脚本正在运行。

$ php /home/forge/mydomainname.com/public/test/index.php

然而,当我在我的Laravel应用程序中本地运行相同的命令 - 使用SSH软件包 - 它没有编码,我没有收到任何输出;浏览器只返回一个白页。

SSH::run('php /home/forge/mydomainname.com/public/test/index.php', function($line) {
    echo $line.PHP_EOL;
});

但是,如果我打开index.php,请注释掉FFmpeg命令并添加一些代码以检查是否启用了exec执行并发送输出,所以我知道SSH包实际上正在工作并远程执行脚本。

<?php
// exec("ffmpeg -I input.mpg -c:v libx264 -preset faster -crf 22 -c:a aac -strict experimental -movflags +faststart -vf scale=360:-1 output.mp4 1> output.txt 2>&1");

if(function_exists('exec')) {
    echo "exec is enabled";
} else {
    echo "exec is disabled";
}

它将向我的浏览器返回“exec is enabled”。

总结一下:

  1. 当通过服务器上的命令行运行时,脚本将对视频进行编码。
  2. 远程运行时,脚本将对视频进行编码。
  3. 远程运行时,脚本将执行。
  4. WTH?

1 个答案:

答案 0 :(得分:0)

我明白了。

在我的Laravel应用程序中,我决定尝试echo exec('whoami');并查看是否向浏览器返回任何内容。它确实如此,所以我知道exec()正在工作,我可以通过SSH包触发它。

然后我意识到我的ffmpeg编码命令用2>&1抑制了输出。我删除了它,最后看到了发生了什么:我收到了“找不到文件”错误,这很奇怪,因为input.mpgindex.php在同一目录中。

这已经在其他三台服务器上运行了,但在使用Forge创建的服务器上却没有。

所以我添加了输入文件的完整路径并vo!它有效!

exec("ffmpeg -i /home/forge/mydomainname.com/public/test/input.mpg -c:v libx264 -preset faster -crf 22 -c:a aac -strict experimental -movflags +faststart -vf scale=360:-1 /home/forge/mydomainname.com/public/test/output.mp4 1> /home/forge/mydomainname.com/public/test/output.txt ");