PHP在linux上
执行命令目录:一、PHP中调用外部命令介绍二、关于安全问题三、关于超时问题四、关于PHP运行linux环境中命令出现的问题一、PHP中调用外部命令介绍在PHP中调用外部命令,可以用,1>调用专门函数、2>反引号、3>popen()函数打开进程,三种方法来实现:方法一:用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。<?phpexec("dir",$output)print_r($output)?>2)system()原型: string system ( string $command [, int &$return_var ] )说明: system和exec的区别在于,system在执行系统外部命令时,它执行给定的命令,输出和返回结果。第二个参数是可选的,用来得到命令执行后的状态码。<?phpsystem("pwd",$result)print $result//输出命令的结果状态码?>关于第二个参数结果状态码的简单介绍:如果返回0是运行成功,在Bash中,当错误发生在致命信号时,bash会返回128+signal number做为返回值。如果找不到命令,将会返回127。如果命令找到了,但该命令是不可执行的,将返回126。除此以外,Bash本身会返回最後一个指令的返回值。若是执行中发生错误,将会返回一个非零的值。Fatal Signal : 128 + signoCan't not find command : 127Can't not execute : 126Shell script successfully executed : return the last command exit statusFatal during execution : return non-zero 3)passthru()原型: void passthru ( string $command [, int &$return_var ] )说明: passthru与system的区别,passthru直接将结果输出到游览器,不返回任何值,且其可以输出二进制,比如图像数据。第二个参数可选,是状态码。<?phpheader("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>"?>方法二:反撇号原型: 反撇号`(和~在同一个键)执行系统外部命令说明: 在使用这种方法执行系统外部命令时,要确保shell_exec函数可用,否则是无法使用这种反撇号执行系统外部命令的。<?phpecho `dir`?>方法三:用popen()函数打开进程 原型: resource popen ( string $command , string $mode )说明: 能够和命令进行交互。之前介绍的方法只能简单地执行命令,却不能与命令交互。有时须向命令输入一些东西,如在增加系统用户时,要调用su来把当前用户换到root用户,而su命令必须要在命令行上输入root的密码。这种情况下,用之前提到的方法显然是不行的。popen( )函数打开一个进程管道来执行给定的命令,返回一个文件句柄,可以对它读和写。返回值和fopen()函数一样,返回一个文件指针。除非使用的是单一的模式打开(读or写),否则必须使用pclose()函数关闭。该指针可以被fgets(),fgetss(),fwrite()调用。出错时,返回FALSE。<?phperror_reporting(E_ALL)/* Add redirection so we can get stderr. */$handle = popen('/path/to/executable 2>&1', 'r')echo "'$handle'" . gettype($handle) . "\n"$read = fread($handle, 2096)echo $readpclose($handle)?>
fopen报错有以下几种情况:
要打开的文件不存在
要打开的文件无权限访问(常见于Linux系统)
打开的模式选择了x+或x,其中x+以读写方式打开,x以写入方式打开,这两种模式会创建一个新的文件,如果文件已经存在,则会打开失败,函数返回false并抛出warning级别的错误
解决方法:
选择合适的打开模式,对于文件不存在即报错的模式,需要注意打开的文件一定要存在
为文件设置正确的权限
打开文件前判断是否存在,根据实际需求删除旧文件或更改文件名
以下是fwrite的正确用法:
<?php
$f = fopen('data', 'w')
$str = 'Hello world!'
var_dump(fwrite($f, $str, strlen($str))) // 同时输出fwrite的返回值
fclose($f)
注意你写入的内容是否为空,同时注意fwrite的返回值。
另请注意:如果未调用fclose,由于文件写入缓冲机制,内容可能暂时写不进去。但程序退出后会自动关闭文件,这时才能看到文件的完整内容。
望采纳!
评论列表(0条)