技术饭
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);
}
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);
}
参考:
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!
文明上网理性发言!