gpt4 book ai didi

php - 在 php 中执行程序 - 显示并返回输出

转载 作者:可可西里 更新时间:2023-11-01 13:24:51 25 4
gpt4 key购买 nike

在 php 中有几种方法可以执行 shell 命令:

  • 系统()
  • 直通()
  • shell_exec()
  • 执行()

前两个显示输出但不返回它。最后两个返回输出但不显示它。

我想运行需要很多时间的 shell 命令,但它会显示一些输出,所以我知道它不会挂起。但是最后我想在 php 中处理这个输出。如果我选择前两个中的一个,我将不会得到输出,所以我将无法在 php 中处理它。如果我运行最后两个中的一个,我将能够处理输出,但是我的程序将挂起很长时间而不输出任何内容。

有没有办法运行一个 shell 命令,它会立即显示输出并返回它?

最佳答案

也许您会对这个感兴趣? proc_open() - http://www.php.net/manual/en/function.proc-open.php

这里有一个方便的片段,可能对您有用(它是从我给您链接的网站上的评论中复制的):

<?php
/*
* Execute and display the output in real time (stdout + stderr).
*
* Please note this snippet is prepended with an appropriate shebang for the
* CLI. You can re-use only the function.
*
* Usage example:
* chmod u+x proc_open.php
* ./proc_open.php "ping -c 5 google.fr"; echo RetVal=$?
*/
define(BUF_SIZ, 1024); # max buffer size
define(FD_WRITE, 0); # stdin
define(FD_READ, 1); # stdout
define(FD_ERR, 2); # stderr

/*
* Wrapper for proc_*() functions.
* The first parameter $cmd is the command line to execute.
* Return the exit code of the process.
*/
function proc_exec($cmd)
{
$descriptorspec = array(
0 => array("pipe", "r"),
1 => array("pipe", "w"),
2 => array("pipe", "w")
);

$ptr = proc_open($cmd, $descriptorspec, $pipes, NULL, $_ENV);
if (!is_resource($ptr))
return false;

while (($buffer = fgets($pipes[FD_READ], BUF_SIZ)) != NULL
|| ($errbuf = fgets($pipes[FD_ERR], BUF_SIZ)) != NULL) {
if (!isset($flag)) {
$pstatus = proc_get_status($ptr);
$first_exitcode = $pstatus["exitcode"];
$flag = true;
}
if (strlen($buffer))
echo $buffer;
if (strlen($errbuf))
echo "ERR: " . $errbuf;
}

foreach ($pipes as $pipe)
fclose($pipe);

/* Get the expected *exit* code to return the value */
$pstatus = proc_get_status($ptr);
if (!strlen($pstatus["exitcode"]) || $pstatus["running"]) {
/* we can trust the retval of proc_close() */
if ($pstatus["running"])
proc_terminate($ptr);
$ret = proc_close($ptr);
} else {
if ((($first_exitcode + 256) % 256) == 255
&& (($pstatus["exitcode"] + 256) % 256) != 255)
$ret = $pstatus["exitcode"];
elseif (!strlen($first_exitcode))
$ret = $pstatus["exitcode"];
elseif ((($first_exitcode + 256) % 256) != 255)
$ret = $first_exitcode;
else
$ret = 0; /* we "deduce" an EXIT_SUCCESS ;) */
proc_close($ptr);
}

return ($ret + 256) % 256;
}

/* __init__ */
if (isset($argv) && count($argv) > 1 && !empty($argv[1])) {
if (($ret = proc_exec($argv[1])) === false)
die("Error: not enough FD or out of memory.\n");
elseif ($ret == 127)
die("Command not found (returned by sh).\n");
else
exit($ret);
}
?>

关于php - 在 php 中执行程序 - 显示并返回输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9468101/

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