【问题标题】:How to "fork" a video conversion process into background, in php?如何在 php 中将视频转换过程“分叉”到后台?
【发布时间】:2010-12-05 03:54:49
【问题描述】:

我有一个批量 Flash 上传脚本,可以将视频文件上传到目录。简单的。上传完成后,它会为该文件创建一条 mysql 记录,然后移动到队列中的下一个文件。

在此之前,我希望它调用一个后台进程,将上传的 avi avi 文件转换为与 ipod 兼容的 mp4 文件,并生成一些预览缩略图。正如您可以想象的那样,这需要一些时间......我可以简单地将转换代码放在文件上传器中......但它会为每个文件挂起 10-20 分钟,这是一个诺诺(甚至你它是一个仅限管理员的功能)。

所以我希望它在后台分叉转换过程,并在转换文件的同时进行下一次上传。

这样的东西能完成这项工作吗,还是我实际上必须使用 php fork 函数?

exec("/usr/bin/php ./convert.php?id=123 > /dev/null 2>&1 &");

【问题讨论】:

  • 我想我过去用过这样的东西: exec('bash -c "/usr/bin/php ./convert.php > /dev/null 2>&1 &"' );但是请注意,您尝试在命令行上传递 URL 参数。我很确定那行不通。您必须将它们作为命令行参数传递。

标签: php fork background-process


【解决方案1】:

exec() 的 php 手册页说:

如果一个程序以此启动 功能,以使其继续 后台运行,输出 程序必须重定向到 文件或其他输出流。失败 这样做会导致 PHP 挂起,直到 程序执行结束。

所以,是的,您的 exec 调用就可以解决问题。

【讨论】:

    【解决方案2】:

    在架构上实现这一点的最佳方式是工作队列,您的 PHP 前端将后台文件中的守护进程提供给进行转换。将 PHP 与您的工作分离,您的 UI 将始终保持响应。

    好久没写PHP了,据我了解,任何启动的进程都属于最大超时规则,并且是在Web服务器下运行的。您不希望出现这种情况;您当然不希望 Web 请求能够启动其他进程。

    编写一个在 Web 服务器外部运行的简单守护程序,并监视文件夹中上传的文件。您的 Web 前端将它们转储到那里,并且您的守护程序为每次转换生成一个线程,直到您拥有多少个内核。在架构上,这是更明智的选择。

    也请参阅我对this question 的回答,这也是相关的。

    【讨论】:

    • 超时规则在这里不适用。他正在有效地启动一个不与活动脚本耦合的后台进程。
    • 在 PHP 下作为它的子节点运行,不是吗?
    • 一个子进程,意味着一个与其父进程在同一个地址空间中,而这里不是这种情况。它只是产生了一个新进程。
    • 没有进程共享地址空间——甚至没有子进程——如果没有通过 mmap 或类似的东西明确设置它。出于所有意图和目的,子进程是一个常规进程,只是有一个父进程,当它死亡时将收到 SIGCHLD。您正在考虑一个线程,所有这些线程都位于同一个地址空间中。您的最后评论没有任何意义,但我们正在从 OP 中泄露出来。
    【解决方案3】:

    它可以解决问题,但它似乎是一个难以管理的想法。如果您只是要启动并且永不回头,那么事情可能很快就会出错。

    如何安排一个每隔几分钟运行一次的脚本并轮询仍在队列中的任何内容。您可以访问 cron 吗?

    【讨论】:

    • 是的,我可以做 cron...但是看起来这可能会更快...因为它请求按需执行。
    猜你喜欢
    • 1970-01-01
    • 2015-10-07
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2012-10-18
    • 2011-11-12
    相关资源
    最近更新 更多