CApplication.setBasePath报错,help!!

2010/01/08 10:33:36 [error] 18644#0: *9649 FastCGI sent in stderr: "PHP Fatal error: Uncaught exception ‘CException’ with message ’

Application base path “/var/www/myproject/webapp/protected” is not a valid directory.’ in /var/www/framework/base/CApplication.php:211

Stack trace:

#0 /var/www/framework/base/CApplication.php(103): CApplication->setBasePath(’/var/www/myproject…’)

#1 /var/www/framework/YiiBase.php(112): CApplication->__construct(’/var/www/myproject…’)

#2 /var/www/framework/YiiBase.php(85): YiiBase::createApplication(‘CWebApplication’, ‘/var/www/myproject…’)

#3 /var/www/myproject/webapp/index.php(11): YiiBase::createWebApplication(’/var/www/myproject…’)

#4 {main}

thrown in /var/www/framework/base/CApplication.php on line 211" while reading response header from upstream, client: 114.80.164.20

2, server: ****.com, request: "GET /item/productlist HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "*****.com",

referrer: "http://www.*****.com/item"

测试中没发现这种报错,部署真实环境后就会时断时续地报这种路径无效,修改Yii的代码,跟踪过,如下:




public function setBasePath($path)

{

    if(($this->_basePath=realpath($path))===false || !is_dir($this->_basePath))

        throw new CException(Yii::t('yii','Application base path "{path}" is not a valid directory._basePath:{path2}xx:{hello}',array('{path}'=>$path,'{path2}'=>$this->_basePath,'{hello}'=>'helloWorld')));

}     



结果打印出来,path有值,_basePath为空,hello可以打印出helloWorld,也就是说,简单的赋值不行了!

$this->_basePath = realpath($path)这句话执行以后,_basePath仍为空(也跟踪过realpath($path),正常有值)

用到的Yii版本:Yii1.1,环境为nginx0.7.64,php-fpm0.6 with php5.3.1

php-fpm配置max_children为5时,很容易出现上述错误,当然不是一直出现,就是所有页面点点都有可能挂掉,但很不确定。提高max_children为128时,不容易出现上述错误,但也会有。

感觉是Yii的某种缓存机制,缓存的东西超出资源上限,php-fpm的某些子进程就挂了,不能正常工作,所以什么页面都可能出错,但也不是每次都出错。

程序中并没有用到cache,无论是APC还是memcached。请教达人,有什么办法继续跟踪?有没有什么推测?

现在正在换apache环境,看看是不是nginx+php-fpm的问题,郁闷……

最好还是别使用 php5.3 吧(并非说跟这个有关系)

我们的服务器上跑的也是nginx 、 php-fpm apc (php5.3.1 ,yii1.0.10)没有出现你说的不稳定情况。用apc有点问题是在开发上(apc.stat=1),在生产中跑apc也是没有问题的

我也很费解啊,刚刚换好apache环境,也是这个错:

[Fri Jan 08 13:10:57 2010] [error] [client 114.80.164.202] PHP Fatal error: Uncaught exception ‘CException’ with message ‘Application base path “/var/www/Apollo/WebApp/protected” is not a valid directory.’ in /var/www/framework/base/CApplication.php:211\nStack trace:\n#0 /var/www/framework/base/CApplication.php(103): CApplication->setBasePath(’/var/www/Apollo…’)\n#1 /var/www/framework/YiiBase.php(112): CApplication->__construct(’/var/www/Apollo…’)\n#2 /var/www/framework/YiiBase.php(85): YiiBase::createApplication(‘CWebApplication’, ‘/var/www/Apollo…’)\n#3 /var/www/Apollo/WebApp/index.php(11): YiiBase::createWebApplication(’/var/www/Apollo…’)\n#4 {main}\n thrown in /var/www/framework/base/CApplication.php on line 211

正在尝试把_basePath定死,看看会报什么错

尝试直接把basePath定死,如下:




private $_basePath = '/var/www/ApolloTest/webapp/protected';


//setBasePath:

        public function setBasePath($path)

        {

                echo $this->_basePath,"<br/>";

                if(isset($this->_basePath) && is_string($this->_basePath))

                    return;

                #else

                #    throw new CException(Yii::t('yii','0:base path not valid!!'));

                $tmpPath = realpath($path);echo $tmpPath,"<br/>";

                if(!is_dir($tmpPath))

                    throw new CException(Yii::t('yii','1:base path {path} is not valid!!',array('{path}'=>$tmpPath)));

                $this->_basePath = $tmpPath;echo $this->_basePath,"<br/>";

                if(!isset($this->_basePath))

                    throw new CException(Yii::t('yii','2:undefined _basePath:{basePath}',

                                array('{basePath}'=>$this->_basePath)));

                if(!is_dir($this->_basePath))

                        throw new CException(Yii::t('yii','3:Application base path "{path}" is not a valid directory.',

                                array('{path}'=>print_r($this->_basePath,true))));

        }



测试结果是:一般是正常,所有页面顶部打印出一条basePath路径来,就是我直接定死的那个,如果遇到不正常,页面也会打印出一条path信息,errorlog中显示的是3:Application …

说明if(!isset($this->_basePath))是通过了,也就是$this->_basePath不是未定义,但就是空串:

[Fri Jan 08 15:48:10 2010] [error] [client 114.80.164.202] PHP Fatal error: Uncaught exception ‘CException’ with message ‘3:Application base path “” is not a valid directory.’ in /var/www/ApolloTest/framework/base/CApplication.php:223\nStack trace:\n#0 /var/www/ApolloTest/framework/base/CApplication.php(103): CApplication->setBasePath(’/var/www/Apollo…’)\n#1 /var/www/ApolloTest/framework/YiiBase.php(112): CApplication->__construct(’/var/www/Apollo…’)\n#2 /var/www/ApolloTest/framework/YiiBase.php(85): YiiBase::createApplication(‘CWebApplication’, ‘/var/www/Apollo…’)\n#3 /var/www/ApolloTest/webapp/index.php(11): YiiBase::createWebApplication(’/var/www/Apollo…’)\n#4 {main}\n thrown in /var/www/ApolloTest/framework/base/CApplication.php on line 223, referer:

为什么我已经手动定死了basePath,还是有时会碰到basePath未定义的问题呢?为什么realpath($path)有值,但是不能赋值给_basePath呢?如果是内存爆了,或者什么资源满了,那应该会随机报错,程序任何地方都有可能出错,为什么一直都是在basePath这个地方挂呢?

是不是is_dir()判断出错?

也有可能,我不是很确定,不过我有echo $this->_basePath; 没有字符串打印出来,看起来应该是_basePath没有值啊?

但也不是null,因为过了isset。

的确是个很费解的问题,可能与并发有关吗?一个人测试时不容易发生,多人测试时可能性增大很多