【发布时间】:2012-02-13 04:01:28
【问题描述】:
我想从 PHP 脚本中触发 eider exec() 或 system() 中的 shell 命令,但这是一项需要一段时间才能完成的任务,有没有办法触发它并继续运行 PHP 页面加载而不会有延迟?
编辑:我在 CentOS 6,PHP 5.3
【问题讨论】:
标签: php command system exec delay
我想从 PHP 脚本中触发 eider exec() 或 system() 中的 shell 命令,但这是一项需要一段时间才能完成的任务,有没有办法触发它并继续运行 PHP 页面加载而不会有延迟?
编辑:我在 CentOS 6,PHP 5.3
【问题讨论】:
标签: php command system exec delay
使用 ajax 请求来激活 exec 部分...然后继续其他任务
【讨论】:
这应该可行:
shell_exec("nohup yourcommand > /dev/null 2> /dev/null &");
编辑:对不起,不知道为什么我排除了 & 把它放到 bg 2> 将 STDOUT 和 STDERR 重定向到 /dev/null。
【讨论】:
shell_exec("ffmpeg -i 'videos/sample.mp4' -qmax 1 -vframes 1 -ss 80 videos/images/1.jpg 2> /dev/null");
取决于您使用的操作系统。
对于 Linux:
pclose(popen("php somefile.php &","r"));
注意末尾的符号(非常重要)。
对于窗户:
pclose(popen("start php.exe somefile.php","r"));
这里start 关键字很重要。
希望这会有所帮助。
【讨论】:
exec("php video_processor.php &");,延迟是一样的,如果我在video_processor.php中设置sleep(10),那么我的父脚本也会等待10秒。
pclose(popen("php video_processor.php &","r"));或pclose(popen("/usr/bin/php video_processor.php &","r"));(我假设你的PHP安装在默认位置)
pclose(popen("php video_processor.php &","r")); 所以我编辑了我的并且它有效:pclose(popen("ffmpeg -i 'videos/sample.mp4' -qmax 1 -vframes 1 -ss 80 videos/images/1.jpg &","r")); 谢谢。 :party: :)
这并不能直接回答您的问题,但您应该考虑在后台进程中使用 cron 作业或使用 Beanstalkd 等队列进行视频转换工作。
这样,您可以在后台堆叠您的 ffmpeg 工作,而不会阻塞您的网络服务器。
过去我在这两种方法(cron / queue)上都取得了很大的成功。
其他一些关于后台进程的帖子:
php execute a background process
Run a ffmpeg process in the background
Using ffmpeg, PHP and beanstalk
一些您可能会觉得有用的工具:
http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/
【讨论】:
我做什么:
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();