首页 > 解决方案 > 即使我重定向到另一个 URL,我也需要保持 PHP 进程在后台运行

问题描述

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

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

标签: phpajaxffmpegexecshell-exec

解决方案


这可以通过在后台运行 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.

推荐阅读