一般情况下,很少会用php去执行linux命令,不过特殊情况下,你也许会用到这些函数。以前我知道有二个函数可以执行linux命令,一个是exec,一个是shell_exec。其实有很多的,结合手册内容,介绍以下6个函数。
1,exec函数
<?php
$test = "ls /tmp/test"; //ls是linux下的查目录,文件的命令
exec($test,$array); //执行命令
print_r($array);
?>
返回结果如下:
[root@krlcgcms01 shell]# php ./exec.php
Array
(
[0] => 1001.log
[1] =>
在PHP中,有时候我们需要在服务器端执行Linux命令来完成特定任务,例如文件操作、系统管理等。虽然这不是常规做法,但在特定场景下是必要的。本文将详细介绍PHP中用于执行Linux命令的六个常用函数。
1. **exec()**:
`exec()` 函数允许你在PHP中直接运行一个外部程序,并且获取其输出。它接受命令作为参数,可以返回命令的最后输出行。如果需要获取所有输出,可以提供第二个参数,用来存储命令的输出数组。例子中展示了如何使用`ls`命令列出 `/tmp/test` 目录下的文件。
```php
<?php
$test = "ls /tmp/test";
exec($test, $array);
print_r($array);
?>
```
2. **system()**:
`system()` 函数与 `exec()` 类似,但它是直接输出命令的结果,而不是将其保存在变量中。它也返回命令的退出状态码,而非输出内容。在例子中,它同样列出 `/tmp/test` 目录的文件,但结果直接输出到浏览器。
```php
<?php
$test = "ls /tmp/test";
$last = system($test);
echo "last: $last\n";
```
3. **passthru()**:
`passthru()` 和 `system()` 类似,不同之处在于它将命令的输出原样传递给浏览器,不做任何处理。这适用于需要保持原始输出格式的情况。
```php
<?php
$test = "ls /tmp/test";
passthru($test);
```
4. **popen()** 和 **pclose()**:
`popen()` 打开一个进程通信管道,允许读取或写入进程的输入/输出。`pclose()` 关闭该管道。这可以用于持续监控命令输出,比如实时流式处理。
```php
<?php
$test = "ls /tmp/test";
$fp = popen($test, "r");
while (!feof($fp)) {
$out = fgets($fp, 4096);
echo $out;
}
pclose($fp);
```
5. **proc_open()**:
`proc_open()` 提供了更高级的进程控制,可以指定输入/输出/错误管道。它返回一个资源,可以用 `fclose()` 关闭管道并用 `proc_close()` 关闭进程。
```php
<?php
$test = "ls /tmp/test";
$array = array(
array("pipe", "r"), // 标准输入
array("pipe", "w"), // 标准输出内容
array("pipe", "w") // 标准输出错误
);
$fp = proc_open($test, $array, $pipes);
echo stream_get_contents($pipes[1]); // 1 代表标准输出
proc_close($fp);
```
6. **shell_exec()**:
`shell_exec()` 执行命令并返回整个命令的输出,通常用于单行命令。如果命令没有输出,它将返回 `NULL`。
```php
<?php
$test = "ls /tmp/test";
$out = shell_exec($test);
echo $out;
```
以上六个函数都是在PHP中执行Linux命令的有效方式,但请注意,直接执行命令可能存在安全风险,可能导致恶意代码执行。因此,确保对用户提供的任何数据进行充分的验证和清理,避免命令注入攻击。同时,合理限制这些函数的使用权限,只在必要时才调用,以增加系统的安全性。