php - 即使我重定向到另一个 URL,我也需要保持 PHP 进程在后台运行
问题描述
我有一个 PHP 应用程序,它执行 FFMPEG 命令来编码视频,然后使用 Youtube v3 API 将编码的视频上传到 YouTube。
我正在使用 shell_exec 执行 FFMPEG 操作并且效果很好。问题是我使用 AJAX 调用来启动整个过程,我需要将用户保留在执行 AJAX 调用的页面中,我的意图是执行AJAX调用启动整个过程并立即将用户重定向到另一个页面,问题是当我重定向到另一个页面时PHP进程被中断,有任何形式来执行AJAX调用,重定向并保持PHP进程运行背景?
解决方案
这可以通过在后台运行 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.
推荐阅读
- r - 将列名附加为行值
- c - free() 在 Visual Studio C 中冻结
- c# - JSON.net 用 int 的嵌套列表序列化对象
- c# - CosmosDb 中不一致的 ReadDocumentCollectionAsync 行为
- javascript - 确认窗口前的通知
- angular - 如何阻止服务人员返回过时的 index.html?
- firebase - travis ci 在 firebase 托管上部署失败
- c# - 如何将大 foreach 循环分成批处理并同时处理?
- c# - C# WinForms DataBindings 在通过控件切换时不起作用
- python - 从零开始的numpy形状是什么意思