LuckyHu Blog

Home MyGame MyApp About

PHP结合shell的坑点

23 Jan 2014

最近在公司服务器上折腾了一些php结合shell的一些功能,发现坑还挺多的。

首先说php执行系统命令有很多内建函数可以使用,我发现比较方便的有三个: 1.system(string) system内建函数适合不需要标准输出作为返回的情况,使用比较简单 2.popen(string,mode) popen内建函数应该是pipe open的意思,返回一个文件句柄,可以结合fread和stream_get_contents等函数使用,并需要在完成后使用pclose关闭文件句柄。我在使用fread时常常会受到8192的字节数的限制,还没找到具体原因。使用stream_get_contents则没有这方面的限制,可以直接方便地获得标准输出的返回字符。 3.shell_exec(string) shell_exec更方便一些,直接返回执行以后的标准输出的字符串。

后两个函数在使用时,都应该注意的是,默认都只会把标准输出返回,如果出错了,常常得不到任何返回值,所以常常需要在命令中加入如下的参数” 2>&1 “把标准错误重定向到标准输出。

由于php一般都是作为cgi运行,所以在php执行shell又会多一些额外的坑。 主要的坑点来自于环境变量和权限管理方面的,因为服务器程序在执行php脚本的时候,常常使用一些比较特殊的用户(目前我还没明白到底使用的什么用户运行的),所以使用一些你定义的环境变量的时候,就需要先”source xxx/.profile”等。对于好多目录或者文件,都需要chmod 777的权限(因为常常搞不清楚具体需要什么权限),具体哪些目录和文件,可以具体根据命令执行时的错误来决定。o

还有一点就是,采用这种方式执行shell命令的时候,很难进行交互式的执行方式,所以对于很多命令,就需要支持直接执行完成,比如一些需要输入用户名密码的shell。