技术饭

PHP中的proc_open函数

copylian    0 评论    9867 浏览    2024.04.09

proc_open函数是PHP中一个非常强大的函数, 执行一个命令,并且打开用来输入/输出的文件指针,proc_open() 提供了更加强大的控制程序执行的能力,它允许您在PHP脚本中执行外部命令。这可以用于各种目的,如:调用系统命令和工具、与其他应用程序进行交互、处理文件和数据、执行复杂的自动化任务。

proc_open函数因为可以执行任意的命令,所以一般风险性比较高,需要注意执行代码的可靠性,可使用escapeshellarg()函数:对用户输入进行转义,以防止命令注入攻击。

使用proc_get_status()函数:可以获取子进程的详细信息,例如CPU使用率、内存使用率等。

使用proc_terminate()函数:可以强制终止子进程。

文档:https://www.php.net/manual/zh/function.proc-open.php


<?php
function
p($data = []): void
{
 if (is_array($data) || is_object($data)) {
   echo "<pre>";
   print_r($data);
   echo "</pre>\n";
 } else {
   echo $data, PHP_EOL;
 }
}

/*
proc_open
函数是PHP中一个非常强大的函数,它允许您在PHP脚本中执行外部命令。这可以用于各种目的,例如:
调用系统命令和工具
与其他应用程序进行交互
处理文件和数据
执行复杂的自动化任务


proc_open(
 array|string $command,
 array $descriptor_spec,
 array &$pipes,
 ?string $cwd = null,
 ?array $env_vars = null,
 ?array $options = null
): resource|false

参数说明
$command
:要执行的命令,可以是shell命令或可执行文件的路径。
$descriptor_spec
:一个数组,用于指定要打开的管道和文件句柄。
$pipes
:一个引用变量,用于接收打开的管道句柄。
$cwd
:要设置的子进程的工作目录。
$env_vars
:一个数组,用于指定要传递给子进程的环境变量。
$options
:你还可以指定一些附加选项。

返回值

proc_open
函数成功时返回一个资源句柄,该句柄用于标识子进程。如果失败,则返回FALSE
*/

//
需要执行的命令
$command = 'ls -ah';

// 子进程工作目录
$cwd = '/e/www/Software Development Kit/zhiaozao';

// 环境变量
$envVars = [
 'PROC'=> 'proc_open'
];

// 指定要打开的管道和文件句柄
$descriptorspec = [
 0=> ['pipe', 'r'], // 标准输入,子进程从此管道读取数据
 
1=> ['pipe', 'w'], // 标准输出,子进程向此管道写入数据
 
2=> ['pipe', 'w']  // 标准错误,子进程向此管道写入错误信息
];

// 接收打开的管道句柄
$pipes = [];

// 打开子进程
$process = proc_open($command, $descriptorspec, $pipes, $cwd, $envVars);

// 验证
if ($process === FALSE) {
 echo 'open progress error', PHP_EOL;
 exit();
}

// 设置标准输出为非阻塞
//stream_set_blocking($pipes[1], false);

try {
 // 关闭标准输入管道
 
fclose($pipes[0]);

 // 读取标准管道数据
 
$o = stream_get_contents($pipes[1]);
 p($o);

 // 非阻塞:循环读取标准输出管道的内容
//  while (!feof($pipes[1])) {
//    $output = fread($pipes[1], 1024);
//    echo $output;
//  }

 //
关闭标准输出管道
 
fclose($pipes[1]);

} catch (Throwable $e){

 echo $e->getMessage(), PHP_EOL;

} finally {

 // 获取子进程状态
 
$status = proc_get_status($process);
 p($status);

 // 终止进程
//  proc_terminate($process);

 //
获取子进程的退出代码
 
$code = proc_close($process);

 p($code);
}



参考:

https://blog.csdn.net/aku13/article/details/136761689

只袄早~~~
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!

文明上网理性发言!

  • 还没有评论,沙发等你来抢