I want to trigger a shell command in eider exec() or system() from PHP script but it is a task that take a while to complete, is there a way to trigger it and continue running the PHP page load without delay?
Edit: I am on CentOS 6, PHP 5.3
Depends on the OS you are using.
For linux:
pclose(popen("php somefile.php &","r"));
notice the amperstand at the end (very important).
For windows:
pclose(popen("start php.exe somefile.php","r"));
here the start keyword is important.
Hope this helps.
exec("php video_processor.php &"); and delay is the same, then also if I set a sleep(10) inside video_processor.php then my parent script also waits for 10 seconds.pclose(popen("php video_processor.php &","r")); or pclose(popen("/usr/bin/php video_processor.php &","r")); (I assume your PHP is installed in the default location)pclose(popen("php video_processor.php &","r")); so then I edited mine and it worked: pclose(popen("ffmpeg -i 'videos/sample.mp4' -qmax 1 -vframes 1 -ss 80 videos/images/1.jpg &","r")); Thank you. :party: :)This doesn't answer your question directly, but you should consider doing your video conversion work in a background process with either a cron job or using a queue such as Beanstalkd.
This way you can stack up your ffmpeg work in the background without blocking your webserver.
I've had a lot of success with both methods (cron / queue) in the past.
Some other posts about background processes:
php execute a background process
Run a ffmpeg process in the background
Using ffmpeg, PHP and beanstalk
Some tools you might find useful:
http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/
What I do:
public function post_create()
{
ob_end_clean();
header("Connection: close");
ignore_user_abort(); // optional
ob_start();
echo "Tell ajax to gtfo!";
$size = ob_get_length();
header("Content-Length: $size");
ob_end_flush(); // Strange behaviour, will not work
flush(); // Unless both are called !
// Do processing here
}
header('Content-Length:0');flush(); for meThis should work:
shell_exec("nohup yourcommand > /dev/null 2> /dev/null &");
Edit: sorry, dunno why I excluded the & to put it to bg 2> redirects STDOUT and STDERR to /dev/null.
shell_exec("ffmpeg -i 'videos/sample.mp4' -qmax 1 -vframes 1 -ss 80 videos/images/1.jpg 2> /dev/null");Well use an ajax request to activate the exec part ...then continue with the other tasks