本文目录一览:
PHP执行linux系统命令的常用函数使用说明
system函数
说明:执行外部程序并显示输出资料。
语法:string
system(string
command,
int
[return_var]);
返回值:
字符串
详细介绍:
本函数就像是
C
语中的函数
system(),用来执行指令,并输出结果。若是
return_var
参数存在,则执行
command
之后的状态会填入
return_var
中。同样值得注意的是若需要处理用户输入的资料,而又要防止用户耍花招破解系统,则可以使用
EscapeShellCmd()。若
PHP
以模块式的执行,本函数会在每一行输出后自动更新
Web
服务器的输出缓冲暂存区。若需要完整的返回字符串,且不想经过不必要的其它中间的输出界面,可以使用
PassThru()。
实例代码:
复制代码
代码如下:
?php
$last_line
=
system('ls',
$retval);
echo
'Last
line
of
the
output:
'
.
$last_line;
echo
'hr
/Return
value:
'
.
$retval;
?
exec函数
说明:执行外部程序。
语法:string
exec(string
command,
string
[array],
int
[return_var]);
返回值:
字符串
详细介绍:
本函数执行输入
command
的外部程序或外部指令。它的返回字符串只是外部程序执行后返回的最后一行;若需要完整的返回字符串,可以使用
PassThru()
这个函数。
要是参数
array
存在,command
会将
array
加到参数中执行,若不欲
array
被处理,可以在执行
exec()
之前呼叫
unset()。若是
return_var
跟
array
二个参数都存在,则执行
command
之后的状态会填入
return_var
中。
值得注意的是若需要处理使用者输入的资料,而又要防止使用者耍花招破解系统,则可以使用
EscapeShellCmd()。
实例代码:
复制代码
代码如下:
?php
echo
exec('whoami');
?
popen函数
说明:打开文件。
语法:int
popen(string
command,
string
mode);
返回值:
整数
详细介绍:
本函数执行指令开档,而该文件是用管道方式处理的文件。用本函数打开的文件只能是单向的
(只能读或只能写),而且一定要用
pclose()
关闭。在文件操作上可使用
fgets()、fgetss()
与
fputs()。若是开档发生错误,返回
false
值。
实例代码:
复制代码
代码如下:
?
$fp
=
popen("/bin/ls","r"
);
?
PHP监控linux服务器负载
在实际项目的应用中,我们由于各种条件的现实,利用PHP来实现服务器负载监控将是一种更为灵活的方式。
由于Web
Server以及PHP的实现方式所限,我们在现实环境中很难利用PHP去调用一些Linux中需要root权限才能执行的程序,对此,我从网上找到另外一种方式来绕开这个限制。首先先写个c程序中转调用系统命令,然后用PHP去执行此c程序。
c程序
首先写个c文件,比如/usr/local/ismole/w.c
复制代码
代码如下:
#includestdio.h
#includestdlib.h
#includesystypes.h
#includeunistd.h
int
main()
{
uid_t
uid
,euid;
//note
获得当前的uid
uid
=
getuid();
//note
获得当前euid
euid
=
geteuid();
//note
交换这两个id
if(setreuid(euid,
uid))
perror("setreuid");
//note
执行将要执行linux系统命令
system("/usr/bin/w");
return0;
}
编译该文件gcc
-o
w
-Wall
w.c,这时会在当前目录下生成程序w。改变此程序的属主chmod
u+s
./w。
PHP执行
文件内容如下,放在web目录下,访问就会输出当前的服务器负载情况。
复制代码
代码如下:
?php
/*
More
Original
PHP
Framwork
Copyright
(c)
2007
-
2008
IsMole
Inc.
$Id:
serverMonitor.php
408
2008-12-02
08:07:40Z
kimi
$
*/
//note
key的验证过程
if($key
!=
$authkey)
{
//
exit('key
error);
}
$last_line
=
exec('/usr/local/ismole/w',
$retval);
$returnArray
=
explode("load
average:
",
$retval[0]);
$returnString
=
$returnArray[1];
echo
$returnString;
按照上面的实例,我们可以用PHP来做任何我们想执行的Linux系统命令,SVN更新,服务器监控,备份,恢复,日常维护等等。
10 个经典PHP函数
1.
sys_getloadavg()
sys_getloadavt()可以获得系
统负载情况。该函数返回一个包含三个元素的数组,每个元素分别代表系统再过去的1、5和15分钟内的平均负载。
与其让服务器因负
载过高而宕掉,不如在系统负载很高时主动die掉一个脚本,sys_getloadavg()就是用来帮你实现这个功能的。
不过很遗憾,该函数在windows下无效。
2.
pack()
Pack()
能将md5()返回的32位16进制字符串转换为16位的二进制字符串,可以节省存储空间。
3.
cal_days_in_month()
cal_days_in_month()能够返回指定月份共有多少天。
4.
_()
WordPress开发者经常能见到这个函数,还有
_e()。这两个函数功能相同,与gettext()函数结合使用,能实现网站的多语言化。具体可参见PHP手册的相关部分介绍。
5.
get_browser()
在发送页面前先看看用户的浏览器都能做些什么是
不是挺好?get_browser()能获得用户的浏览器类型,以及浏览器支持的功能,不过首先你需要一个php_browscap.ini文件,用来给
函数做参考文件。
要注意,该函数对浏览器功能的判断是基于该类浏览器的一般特性的。例如,如果用户关闭了浏览器对
JavaScript的支持,函数无法得知这一点。但是在判断浏览器类型和OS平台方面,该函数还是很准确的。
6.
debug_print_backtrace()
这是一个调试用的函数,能帮助你发现代码中的逻辑错误。要理
解这个函数,还是直接看个例子吧:
$a
=
0;
function
iterate()
{
global
$a;
if(
$a
10
)
recur();
echo
$a
.
“,
“;
}
function
recur()
{
global
$a;
$a++;
//
how
did
I
get
here?
echo
“\n\n\n”;
debug_print_backtrace();
if(
$a
10
)
iterate();
}
iterate();
#
OUTPUT:
#0
recur()
called
at
[C:\htdocs\php_stuff\index.php:8]
#1
iterate()
called
at
[C:\htdocs\php_stuff\index.php:25]
#0
recur()
called
at
[C:\htdocs\php_stuff\index.php:8]
#1
iterate()
called
at
[C:\htdocs\php_stuff\index.php:21]
#2
recur()
called
at
[C:\htdocs\php_stuff\index.php:8]
#3
iterate()
called
at
[C:\htdocs\php_stuff\index.php:25]
#0
recur()
called
at
[C:\htdocs\php_stuff\index.php:8]
#1
iterate()
called
at
[C:\htdocs\php_stuff\index.php:21]
#2
recur()
called
at
[C:\htdocs\php_stuff\index.php:8]
#3
iterate()
called
at
[C:\htdocs\php_stuff\index.php:21]
#4
recur()
called
at
[C:\htdocs\php_stuff\index.php:8]
#5
iterate()
called
at
[C:\htdocs\php_stuff\index.php:25]
7.
metaphone()
这个函数返回单词的metaphone值,相同读音的单词具有相同的metaphone值,也就是说这个函数可以帮你判断两个单词的读音是否
相同。不过对中文就无效了。。。
8.
natsort()
natsort()能将一个数组以自然排序法
进行排列,直接看个例子吧:
$items
=
array(
“100
apples”,
“5
apples”,
“110
apples”,
“55
apples”
);
//
normal
sorting:
sort($items);
print_r($items);
#
Outputs:
#
Array
#
(
#
[0]
=
100
apples
#
[1]
=
110
apples
#
[2]
=
5
apples
#
[3]
=
55
apples
#
)
natsort($items);
print_r($items);
#
Outputs:
#
Array
#
(
#
[2]
=
5
apples
#
[3]
=
55
apples
#
[0]
=
100
apples
#
[1]
=
110
apples
#
)
9.
levenshtein()
Levenshtein()
告诉你两个单词之间的“距离”。它告诉你如果想把一个单词变成另一个单词,需要插入、替换和删除多少字母。
看个例子吧:
$dictionary
=
array(
“php”,
“javascript”,
“css”
);
$word
=
“japhp”;
$best_match
=
$dictionary[0];
$match_value
=
levenshtein($dictionary[0],
$word);
foreach($dictionary
as
$w)
{
$value
=
levenshtein($word,
$w);
if(
$value
$match_value
)
{
$best_match
=
$w;
$match_value
=
$value;
}
}
echo
“Did
you
mean
the
‘$best_match'
category?”;
10.
glob()
glob()会让你觉得用
opendir(),
readdir()和closedir()来寻找文件非常蠢。
foreach
(glob(“*.php”)
as
$file)
echo
“$file\n”;
php执行函数
PHP提供4个专门的执行外部命令的函数:exec(), system(), passthru(), shell_exec()
1)exec()
原型: string exec ( string $command [, array $output [, int $return_var ]] )
说明: exec执行系统外部命令时不会输出结果,而是返回结果的最后一行。如果想得到结果,可以使用第二个参数,让其输出到指定的数组。此数组一个记录代表输出的一行。即如果输出结果有20行,则这个数组就有20条记录,所以如果需要反复输出调用不同系统外部命令的结果,最好在输出每一条系统外部命令结果时清空这个数组unset($output),以防混乱。第三个参数用来取得命令执行的状态码,通常执行成功都是返回0。
?php
exec("dir",$output);
print_r($output);
?
2)system()
原型: string system ( string $command [, int $return_var ] )
说明: system和exec的区别在于,system在执行系统外部命令时,直接将结果输出到游览器,如果执行命令成功则返回true,否则返回false。第二个参数与exec第三个参数含义一样。
?php
system("pwd");
?
3)passthru()
原型: void passthru ( string $command [, int $return_var ] )
说明: passthru与system的区别,passthru直接将结果输出到游览器,不返回任何值,且其可以输出二进制,比如图像数据。第二个参数可选,是状态码。
?php
header("Content-type:image/gif");
passthru("/usr/bin/ppm2tiff /usr/share/tk8.4/demos/images/teapot.ppm");
?
4)shell_exec()
原型: string shell_exec(string $cmd)
说明: 直接执行命令$cmd
?php
$output = shell_exec('ls -lart');
echo "pre$output/pre";
?
防超时的处理方法:
当执行命令的返回结果非常庞大时,可以需要考虑将返回结果输出至其他文件,再另行读取文件,这样可以显著提高程序执行的效率。
如果要执行的命令要花费很长的时间,那么应该把这个命令放到系统的后台去运行。但在默认情况下,
象system()等函数要等到这个命令运行完才返回(实际上是在等命令的输出结果),
这肯定会引起PHP脚本的超时。解决的办法是把命令的输出重定向到另外一个文件或流中,如:
?php
system("/usr/local/bin/order_proc /tmp/abc ");
?
?
$filename=time().".data";
exec("/app/gm/gm_center/test/hello.py $filename",$output);
var_dump ($output);
?
PHP中的文件系统函数(一)
从这篇文章开始,我们将学习一系列的 PHP 文件系统相关函数。其实这些函数中,有很多都是我们经常用到的,大家并不需要刻意地去记住它们,只要知道有这么个东西,在使用的时候记得来查文档就可以了。
文件路径相关的函数往往在一些框架中会比较常见,而且多会配合 __FILE__ 、 __DIR__ 之类的魔术常量使用。
basename() 函数是获得路径中的文件名,它有两个参数,第一个是文件的路径,第二个是过滤掉的内容,比如第一条测试语句我们过滤掉文件的后缀名。
dirname() 返回的是路径中的路径部分,也就是不包含文件名的那部分内容,和 basename() 正好是相反的功能。
pathinfo() 函数用于以数组的形式返回路径中的信息,从结果来看,我们可以看到文件的 dirname 部分,basename 部分,以及文件的扩展名 extension 和不包含扩展名的 filename 内容。
realpath() 返回的是规范化的绝对路径名,它扩展所有的符号连接并且处理输入的路径中的 ./ 、 ../ 以及多余的 / ,返回的内容是标准规范的绝对路径。
接下来,我们学习一些修改文件相关属性的函数,主要就是在 Linux 系统环境中的文件权限信息的操作。
当然,首先我们得创建一个文件。和 Linux 中的命令是非常类似的。
touch() 函数除了给出要创建的文件名之外,还有两个可选参数可以指定文件的创建时间及访问时间,不给参数的话默认就是当前时间。这个文件名可以是相对或绝对路径中有权限的目录,并在该目录下创建一个空的文件。
通过 fileowner() 函数,我们可以获得某个文件所属的用户,默认情况下我们的用户是当前运行 PHP 脚本的用户,也就是系统目前的登录用户。在这里,我们使用 chown() 函数,将用户改为 www 用户。clearstatcache() 是用于清理文件系统的缓存信息,如果不清理一下的话,fileowner() 返回的依然还是之前的用户信息。
同理,使用 filegroup() 函数获得文件的属组信息,chgrp() 用于修改文件的属组。fileperms() 用于返回文件的权限信息,它返回的是数字模式的文件访问权限,这里我们使用 sprintf() 格式化结果后获得我们常用的 Linux 系统权限格式。chmod() 函数用于修改文件的权限,它的权限参数是三个 8 进制数据组成的数字,也就是代表 Linux 系统中的 1 、2 、4 和它们的组合,所以我们需要在前面再加上一个 0 用于确保操作能够正常执行。关于系统文件权限的知识大家需要认真学习 Linux 系统中相关的内容。
注意,上述函数如果在命令行中运行失败,大部分原因是没有权限,可以使用 sudo 进行测试。在 fastcgi 中运行时,就更加需要注意权限问题,仅在我们服务器可以操作的目录中进行安全的文件权限修改。
stat() 函数可以获取到指定文件的所有属性信息,在这里我们可以看到文件的 uid 、 gid 、 ctime 、 mtime 等信息。
在 Linux 系统中,有软连接和硬连接的相关知识。其实软连接就像是 Windows 中的快捷方式,而硬连接相关于复制了一份数据。在 PHP 中,也为我们提供了创建软硬连接以及相关的一些操作。
使用 link() 函数创建的就是一个指定文件的硬连接文件,而使用 symlink() 创建的则是一个软连接文件。相对来说,我们使用软连接的场景会更多一些。lstat() 就和 stat() 函数的功能一样,查看文件的各种属性信息,不过 lstat() 函数针对的是软硬连接文件。
同样地,我们也可以修改软硬连接的用户和用户组信息,不过它们的信息不能通过 fileowner() 或 filegroup() 查看。因为它们是连接文件,本身还是和原始文件绑定在一起的,使用 fileowner() 这类的函数查看到的依然是原始文件的信息。我们可以在系统环境中使用 ls -l 查看连接文件的用户和用户组信息是否修改成功。
今天的内容比较简单,而且修改权限的操作也并不常用。不过对于系统安全来,它们还是非常有用的,比如对于上传来说,我们要预防上传可执行文件的话,就可以通过修改文件的权限来让文件无法直接运行,从而起到安全保护的作用。另外,目录路径相关的操作也是一些框架的基础,几乎所有框架的入口或者说是 Composer 的入口,都会见到 dirname() 以及 basename() 之类函数的身影。
测试代码:
中的文件系统函数(一).php
参考文档: