最近在Win7的Apache+PHP+Mysql环境下安装并启用了PHP_APC模块(ver3.1.9 stable),想提升一下开发环境的运行效率。

按照常见配置安装APC并重启Apache之后在Yii框架下运行正常,但在使用phpmyadmin时却出现了莫名其妙的Permission denied错误:

 Warning: require_once(x:\path\to\phpmyadmin): failed to open stream: Permission denied in x:\path\to\phpmyadmin\index.php on line 13

Fatal error: require_once(): Failed opening required '' (include_path='.;C:\php\pear') in x:\path\to\phpmyadmin\index.php on line 13

几经调试和查找资料之后,才确认问题所在:APC对include/require之类的函数支持是有问题的,确切的说是:include,require,include_once,require_once等函数的参数必须提供绝对路径,而不能是相对路径,否则就会出现各种Permission denied错误。

因为phpmyadmin里大量使用了相对路径,所以在PHP+APC环境里就无法正常运行;而Yii框架则完全依靠调用dirname()函数生成绝对路径,所以后者对APC表现出很好的兼容性。这一点需要PHP开发人员多多注意。

关于这个兼容性问题的解决方法有以下2种:

1、调用include/require类函数时,应传递绝对路径,如:

  1. require_once(dirname(__FILE__).'/path/to/common.inc.php'); 

2、在Apache的conf/httd.conf文件(如是虚拟主机配置则在conf/extra/httpd-vhosts.conf文件)中,对phpmyadmin所在的目录配置内加入如下代码:

  1. <Directory "x:/path/to/phpmyadmin"
  2. # ...
  3.   # 对phpmyadmin关闭apc模块
  4.   php_admin_flag apc.enabled 0 
  5. </Directory>