1. PHP的配置文件
虽然PHP是以httpd的一个模块的形式存在的,但是PHP本身也有自己的配置文件,那就是php.ini。在前面安装时,我们已经拷贝了一个php.ini文件到/usr/local/php/etc/目录下面,这是我们已经知道了php.ini所在的路径在哪里。但有时候我们并不知道php.ini所在路路径,这时候就需要通过命令来查一查在哪里:
通过上面的查找可以看出php.ini的绝对路径为/usrl/local/php/etc/php.ini,下面的Warning为警告信息,可以忽略。若是想取消这个警告需要编辑php.ini,找到date.timezone设置如下:
再次执行将不再提示警告信息:
2. PHP的disable_functions
PHP有很多内置的函数,有一些函数(比如exec)会直接调取Linux系统命令,如果开放将会非常危险。因此,基于安全考虑应该把一些存在安全风险的函数禁掉。一般我们应该禁掉的函数的配置改成如下即可,打开php.ini,搜索disable_functions并改成这样子:disable_functions = eval,assert,popen,passthru,escapeshellarg,escapeshellcmd,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_get_status,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,leak,popepassthru,stream_socket_server,proc_open,proc_close
关于这些所列出来的函数,暂时不用细究,将来遇到问题要记得曾经禁用掉了一些函数,这些被禁掉的函数是不能在PHP代码中调用的。更改完php.ini后,由于需要在httpd中调用PHP,所以需要重启httpd服务使其生效。
3. 配置error_log
PHP的日志对于程序员来讲非常重要,它是排查问题的重要手段。设置PHP错误日志,有诸多步骤:
上述配置文件说明:
log_errors
可以设置为On
或Off
,如果想让PHP记录错误日志,需要设置为On
。error_log
设定错误日志路径。error_reporting
设定错误日志的级别,E_ALL
为所有类型的日志,不管是提醒还是警告都会记录。在开发环境下面设置为E_ALL
,可以方便程序员排查问题,但也会造成日志记录很多无意义的内容。&
符号表示并且,|
表示或者,~
表示排除,所以& ~
两个组合在一起E_ALL & ~E_NOTICE
就是在E_ALL的基础上排除掉notice相关的日志。正常情况下在业务正常时只有上面的日志级别即可,如果是在开发时检测错误,需要设置为
E_ALL | E_NOTICE`会显示更多的错误信息。- 注意,不同版本中这个日志级别可能会不一样,所以要根据提示来设置正确合适的日志级别。
display_errors
设置为On
,则会把错误日志直接显示在浏览器里,这样对于用户访问来说体验不好,而且还会暴露网站的一些文件路径等重要信息,所以要设置为Off
。
设置完php.ini后,还需要做一些额外的操作:
下面是测试过程:
可以看到这里的状态码为500,这说明我们访问的页面是存在错误的,此时需要查看PHP的错误日志来判断错误的原因,如下:
|
|
查看PHP的错误日志,有一条错误的记录,通过日志可以判断,test.php文件的第三行少了分号。
4. 配置open_basedir
一个服务器上跑很多网站,这是几乎所有小公司为节省成本采用的做法,但这样做也会有一些弊端:多个网站跑在同一服务器上,如果其中一个网站被黑,很有可能连累到其它的站点。为了避免这种尴尬的事情发生,我们应当做一些预防手段。
好在PHP有一个概念叫做open_basedir,它的作用是讲网站限定在指定目录里,就算该站点被黑了,骇客也只能在该目录下面作为,而不能左右其它的目录。如果你的服务器上只有一个站点,那可以直接在php.ini中设置open_basedir
参数。但是如果服务器上跑的站点比较多,那在php.ini中设置就不合适了,因为在php.ini中只能定义一次,也就是说所有站点都一起定义限定的目录,那这样似乎起不到隔离多个站点的目的。
4.1. php.ini中设置open_basedir
在php.ini中设置open_basedir:
上述配置的说明:
open_basedir
可以是多个目录,用:
分隔
接下来验证一下open_basedir的作用,因为已经限制PHP只能在/tmp和/fata/wwwroot/www.123.com两个目录下面活动,所以这次拿aming.com来演示:
由上述演示发现aming.com/1.php确实不能访问了,状态码为500,所以查看一下错误日志,得到信息如下:
4.2. 虚拟主机配置中设置open_basedir
下面的设置是给单个虚拟主机配置open_basedir。对于php.ini里面的配置,在虚拟主机的配置文件中也是可以配置的:
上述配置内容的说明:
- 起作用的就是这一句:
php_admin_value
,它可以定义php.ini里面的参数,除此之外像error_log之类的也可以定义。 - 在所要限制的目录后面一定要加斜杠来表示精确的匹配。
这样就可以实现,一个虚拟主机定义一个open_basedir。
5. PHP动态模块安装
编辑httpd时,有涉及动态和静态模块,其实PHP也一样有这种说法。在记录PHP安装的学习笔记中,所有的模块全部都为静态,并没有任何动态的模块。所谓动态,就是一个独立存在的.so文件
,在httpd中php就是以动态模块的形式被加载的。
首先,应该学会查看PHP都加载了哪些功能模块:
PHP和核心文件为/usr/local/php/bin/php,针对apache的是/usr/local/apache2.4/modules/libphp5.so模块。这两个文件是核心,我们在编译PHP的时候会提前让它支持一些功能,比如支持mysql,这个功能其实是PHP的一个模块,只不过这个模块是直接和PHP或者libphp5.so文件编译在一起的。当我们编译完PHP后,发现我们还需要让PHP支持另外的模块,即要想再增加一个功能模块的话,要么重新编译PHP,要么直接编译一个扩展模块(即生成一个.so文件),然后在php.ini中配置一下,让PHP去调用它,就可以被加载使用了。
下面是两个示例:
5.1. 示例1:安装redis扩展模块
下载redis扩展模块安装包并解压:
下面是安装步骤:
这一步的作用是生产configure文件,但是在这一步并没有执行成功,可以看到有一个错误:Cannot find autoconf
,这需要安装autoconf:yum install -y autoconf
,然后再次执行该步骤:
上述步骤的说明:
make install
的时候会把编译好的redis.so
放到这个目录下面:/usr/local/php/lib/php/extensions/no-debug-zts-20131226
,这个目录也是扩展模块存放目录。- 查看扩展模块存放目录的方法:
/usr/local/php/bin/php -i | grep extension_dir
我们也可以在php.ini中自定义该目录
接下来是在php.ini中添加调用模块的配置:
然后查看是否加载了redis模块:
到此,PHP的redis模块就安装和配置成功了。
5.2. 示例2:安装memcache扩展模块
下载memcache模块安装包:
安装memcache模块:
配置php.ini文件以使PHP调用模块:
至此,memcache模块安装成功。
加入,我们把安装的模块放在了自定义的扩展模块存放目录里面,那该如何配置呢?示例如下:
保存退出后我们做一下测试:
通过上述测试我们知道,存放在我们自定义的模块存放目录下的memcache模块能被调用,并且用命令查看模块存放目录也是我们所自定义的目录,这说明我们配置成功了。
如果以后遇到增加模块的需求,都可以按照上面两个例子的步骤和方法来安装。另外,要想在PHP网站上面使用新安装的模块,还需要重启一下httpd服务。