【问题标题】:I need a to keep a PHP process running in background even If I redirect to another URL即使我重定向到另一个 URL,我也需要保持 PHP 进程在后台运行
【发布时间】:2018-05-24 16:26:29
【问题描述】:

我有一个 PHP 应用程序,它执行 FFMPEG 命令来编码视频,然后使用 Youtube v3 API 将编码的视频上传到 YouTube。

我正在使用 shell_exec 执行 FFMPEG 操作并且效果很好。问题是我使用 AJAX 调用来启动整个过程,我需要将用户保留在执行 AJAX 调用的页面中,我的意图是执行AJAX调用以启动整个过程并立即将用户重定向到另一个页面,问题是当我重定向到另一个页面时PHP进程被中断,有任何形式来执行AJAX调用,重定向并保留PHP进程在后台运行?

【问题讨论】:

标签: php ajax ffmpeg exec shell-exec


【解决方案1】:

这可以通过在后台运行 shell_exec 中的命令来实现。这允许您的 PHP 进程继续进行,而无需等待 shell_exec 的输出。

例子:

shell_exec('php /var/www/html/my_php_app.php > /dev/null 2>/dev/null &');

/dev/null 2>/dev/null 部分告诉 bash 将输出发送到 null/nothing。 (无输出)

& 告诉 bash 在后台运行脚本/命令。 (您甚至可以在常规 ssh/bash 终端中执行此操作!)

请注意,您的后台脚本现在可能一次运行不止一次。

如果你不想要这个,(任何时候只有一个实例)你可以使用 pid/lock 文件。这是您可以在 shell_exec 调用的 php 脚本顶部使用的示例。

$lock_file = fopen('/var/www/html/my_php_app.pid', 'c');
$got_lock = flock($lock_file, LOCK_EX | LOCK_NB, $wouldblock);
if ($lock_file === false || (!$got_lock && !$wouldblock)) {
    throw new Exception(
        "Unexpected error opening or locking lock file. Perhaps you " .
        "don't  have permission to write to the lock file or its " .
        "containing directory?"
    );
}
else if (!$got_lock && $wouldblock) {
    exit("Another instance is already running; terminating.\n");
}
//Continue with the script.

【讨论】:

  • 我以前从未见过flock() 机制——非常有趣。问题:是否可以在 PHP 中启动一个分离的进程而不将 STDOUT 和 STDERR 重定向到/dev/null?我想将两个流重定向到单独的文件。
  • @TheOnin 您可以使用任何文件代替/dev/null。例如:shell_exec('php /var/www/html/my_php_app.php > /home/user/myapp.log 2>/home/user/myapp-error.log &');
猜你喜欢
  • 2021-02-05
  • 2021-11-13
  • 2021-08-20
  • 2012-01-19
  • 2020-05-06
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多