gpt4 book ai didi

php - 使用 PHP 在后台运行管道 shell 命令

转载 作者:行者123 更新时间:2023-12-04 23:31:21 25 4
gpt4 key购买 nike

我正在尝试使用 PHP 在后台执行命令,以便 Web 应用程序可以继续加载,但到目前为止还没有运气。

该命令用于实时流媒体应用程序,因此涉及以下内容:

<stream pre-process> | ffmpeg <options> | <stream segmenter>

我可以将上述内容粘贴在脚本中,并在 bash 的后台使用 & 很好地执行它,但这在 PHP 中不起作用。我之前也尝试过使用 nohup 和“nohup & echo $!”,但没有运气。

我还将所有标准错误通过管道传输到/dev/null,并且我可以在 apache 日志中验证当我执行命令时没有生成输出(但它正在执行)。

下面的一些示例代码..我在这段代码之后的内容直到完成后才会执行,这很长一段时间。
function streamVid ($mid, $width, $height, $br) {
$cdir = "./temp";
$zmstrm = "zmstreamer -m ".$mid." 2> /dev/null";
$seg = "segmenter - 3 ".$cdir."/sample_".$mid." ".$cdir."/stream_".$mid.".m3u8 ./ 2>/dev/null";
$ffparms = "-f mpegts -analyzeduration 0 -acodec copy -s ".$width."x".$height." -vcodec libx264 -b ".$br." -flags +loop -cmp +chroma -partitions +parti4x4+partp8x8+partb8x8 -subq 5 -trellis 1 -refs 1 -coder 0 -me_range 16 -keyint_min 25 -sc_threshold 40 -i_qfactor 0.71 -bt 200k -maxrate ".$br." -bufsize ".$br." -rc_eq 'blurCplx^(1-qComp)' -qcomp 0.6 -qmin 10 -qmax 51 -qdiff 4 -level 30 -aspect 320:240 -g 30 -analyzeduration 0 -async 2 - 2> /dev/null";
$url = $zmstrm . " | ffmpeg -t 10 -analyzeduration 0 -i - ". $ffparms . " | " . $seg;
shell_exec("nohup ". $url." & echo $!");
ob_flush();
flush();
}

最佳答案

如果需要流式输出操作结果,请使用 system 或 passthru 方法,或使用 popen 或 proc_open 来完全控制进程的输入和输出。

通常,由您的 Web 服务器触发的 PHP 脚本旨在生成一个页面并退出。它们不是执行诸如视频编码之类的后台任务的最佳场所,您的网络服务器将对程序执行时间施加限制,并且很难从您的浏览器中获取状态信息(它看起来会挂起)。

您最好的选择是使用 Python(或 PHP)等语言创建一个单独的守护进程,该进程将在您的计算机上运行。当您的 Web 脚本需要对视频进行转码时,它们可以将必要的信息放入数据库或文件中,以便由守护进程轮询。守护进程还可以使用状态信息更新数据库。

一般来说,您的网页服务应该尽可能“无阻塞”,这意味着如果某些事情需要超过一两秒,请在后台执行并在您的网站上创建页面以允许用户查看操作状态并对其进行操作。

关于php - 使用 PHP 在后台运行管道 shell 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4139663/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com