简体   繁体   中英

Running PHP remotely via SSH

I have a video encoding server set up on Laravel Forge with nginx. I'm trying to run a testing script to encode a video remotely via SSH, using the LaravelCollective SSH package .

This is my testing script (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");

When I SSH into the server and run the script from the command line it works: the video is encoded; the script is working.

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

However, when I run the same command locally in my Laravel app - using the SSH package - it doesn't encode and I receive no output; the browser just returns a white page.

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

However however, if I open index.php , comment out the FFmpeg command and add some code to check if exec is enabled, it will execute and send output, so I know that the SSH package is actually working and executing the script remotely.

<?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";
}

It will return "exec is enabled" to my browser.

To sum up:

  1. The script will encode video when running it via the command line on the server.
  2. The script will not encode video when running it remotely.
  3. The script will execute when running it remotely.
  4. WTH?

I figured it out.

From within my Laravel app I decided to try echo exec('whoami'); and see if that returned anything to the browser. It did, so I knew exec() was working and I could trigger it via the SSH package.

Then I realized that my ffmpeg encoding command was suppressing output with 2>&1 . I removed that and finally saw what was going on: I was receiving a "file not found" error, which was weird because input.mpg is in the same directory as index.php .

This has worked on three other servers, but not on this one created with Forge.

So I added the full path to the input file and voilà! It works!

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 ");

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM