lamp环境配置好后,调试yii遇到的坑
1.opcahe导致的php文件很长时间不更新,实际配置文件(opcache.revalidate_freq)写的60s,刚改成0。
opcahe是查看了phpinfo后看到的,是引入的:
Additional .ini files parsed /usr/local/php/php.d/mongodb.ini, /usr/local/php/php.d/opcache.ini, /usr/local/php/php.d/redis.ini, /usr/local/php/php.d/xdebug.ini

参考文章:(一)opcache的检测文件更新的小坑(二)PHP 代码更新延迟 PHP代码没及时更新解决方案
2.lamp底下没有启动php-fpm,php正常运行。原理是:
# 以 module 方式加载 php

# 指明 php 配置文件 php.ini 的位置
# 定义能够执行 php 的文件类型,即.php和.html的文件能执行PHP程序
AddType application/x-httpd-php .php .phtml
AddType appication/x-httpd-php-source .phps
3.apache重启。
find / -name apachectl
找到路径。
/usr/local/apache/bin/apachectl restart
4.经过以上的折腾,不再只是浏览器显示“该网站无法正常运行”这样毫无价值的提示,报错信息出来了。
Warning: require(): open_basedir restriction in effect. File(/data/www/wx/vendor/autoload.php) is not within the allowed path(s): (/data/www/wx/backend/web:/tmp:/var/tmp:/proc) in /data/www/wx/backend/web/index.php on line 4 Call Stack: 0.0004 232160 1. {main}() /data/www/wx/backend/web/index.php:0 Warning: require(/data/www/wx/vendor/autoload.php): failed to open stream: Operation not permitted in /data/www/wx/backend/web/index.php on line 4 Call Stack: 0.0004 232160 1. {main}() /data/www/wx/backend/web/index.php:0 Fatal error: require(): Failed opening required '/data/www/wx/backend/web/../../vendor/autoload.php' (include_path='.:') in /data/www/wx/backend/web/index.php on line 4 Call Stack: 0.0004 232160 1. {main}() /data/www/wx/backend/web/index.php:0。
对了,我kill掉了php-fpm。不过开启了貌似也还是提示以上信息:


既然如此我们继续。
对了,在启动php-fpm的时候,出现如下提示:
[17-Jan-2018 16:38:13] NOTICE: fpm is running, pid 26430
[17-Jan-2018 16:38:13] NOTICE: ready to handle connections
显然不足以提供足够的信息来解决问题,因此修改php-fpm和php.ini对日志级别的一些参数配置,以提升日志级别,获取详细的错误信息。
搜索配置文件的中log关键字,或者根据文档或资料修改,一些方法或步骤如下:
/etc/php-fpm.conf文件,将日志级别从notice改动到debug。
log_level = debug
参考:解决phpMyAdmin在nginx+php-fpm模式下无法使用的问题
反馈如下:
[17-Jan-2018 16:52:22.753974] DEBUG: pid 26525, fpm_scoreboard_init_main(), line 40: got clock tick '100'
[17-Jan-2018 16:52:22.754294] ERROR: pid 26525, fpm_sockets_new_listening_socket(), line 191: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98)
[17-Jan-2018 16:52:22.754304] ERROR: pid 26525, fpm_init(), line 72: FPM initialization failed
通过start会报这个错,通过restart不会。所以用service php-fpm restart即可。
Warning: require(): open_basedir restriction in effect. 出现这个警告的原因是apache或者是php.ini中设置了php可以访问的目录权限导致的,我的apache中:
php_admin_value open_basedir
这个设置项之前是web目录,也就是外网才可访问的目录,很显然在上一层甚至上上层的php文件是不允许访问的,因此报错。将其改为项目所在根目录后,问题解决。
参考:(一)php错误提示 open_basedir restriction in effect 解决(二)open_basedir restriction in effect,解决php引入文件权限问题
问题解决。项目运行正常了。
5.yii依旧不正常运行。报错如下:
session_start(): Failed to initialize storage module: files (path: )
出现这个问题的原因还是上面的php执行目录权限的问题,默认的应该是根目录底下的tmp目录,将这个目录添加到执行权限路径中,问题解决。
原因分析:php5一个安全模式的bug,默认session的save_path是系统的临时目录,这样会要校验权限。

别忘了重启apache。
参考:(一)session_start(): Failed to initialize storage module 解决办法(二)Fatal error: session_start(): Failed to initialize storage module: files问题解决方法
6.配置apache和php.ini等,实现路由美化
httpd.conf配置文件中加载了mod_rewrite.so模块 //在APACHE里面去配置
#LoadModule rewrite_module modules/mod_rewrite.so把前面的警号去掉
基于服务器级的(httpd.conf)有两种方法,一种是在httpd.conf的全局下直接利用RewriteEngine on来打开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。
基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性(httpd.conf中的Option FollowSymLinks)且在.htaccess里要声明RewriteEngine on。
我是在的虚拟目录,开启的重写,并在web目录也即index.php同级目录加了.htaccess,内容如下:
<IfModule mod_rewrite.c>
RewriteEngine on
Options +FollowSymlinks
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule . index.php
</IfModule>
【【【网友提供的另一种方法,在php.ini中找到 ;cgi.force_redirect = 1,去掉前面的分号并且把后面的1改为0】】】测试过貌似不管用,或者单独这个选项不能起作用。
yii urlManager配置代码:
'urlManager' => [
'enablePrettyUrl' => true,
'enableStrictParsing' => false,
'showScriptName' => false,
'suffix' => '',
'rules' => [
"<controller:\w+>/<id:\d+>"=>"<controller>/view",
"<controller:\w+>/<action:\w+>"=>"<controller>/<action>"
],
],
总结来说,apache引入重写模块,虚拟主机开启重写,目录级.htaccess中写重写规则,隐藏入口脚本,yii配置中配置脚本隐藏,一切ok,只欠东风。
参考:(一)Apache Rewrite规则详解(二)apache配置伪静态隐藏index.php文件

浙公网安备 33010602011771号