您的位置:首页 > 编程语言 > PHP开发

ThinkPHP3.2.2调试模式下正常访问,关闭调试模式,部署时出现删出缓存第一次没错,第二次开始错误。

2015-07-30 16:51 751 查看
我碰到的错误如下:

ThinkPHP3.2.2 {
Fast & Simple OOP PHP Framework } -- [ WE CAN DO IT JUST THINK ]

上图:



看到网上大多数人都碰到,但没很好解决,确实很头痛,没办法只能去阅读源码。在同事的帮助下,就愉快地去翻源,看框架执行流程:

1.从入口文件开始:index.php  里面有这句(require './ThinkPHP/ThinkPHP.php';),跳到ThinkPHP.php;

2.ThinkPHP.php 里面的96行:Think\Think::start();可以看到,跑这函数里面去了,跳到Think.class.php;

3.Think.class.php 因为是部署模式,所以执行到里面的42行Storage::load($runtimefile);发现没法跳了。直接去找ThinkPHP/Library/Storage.class.php;

4.Storage.class.php; 源码:static public function connect($type='File',$options=array())
{

        $class  =   'Think\\Storage\\Driver\\'.ucwords($type);

        self::$handler = new $class($options);

    }

我们看到,它去取到了一个叫“Flie”的文件,找了下在找到了它ThinkPHP/Library/Storage/File.class.php,打开看看。

5.File.class.php 里面果然有第3步的load方法,在代码75行。public
function load($_filename,$vars=null){

        if(!is_null($vars))

           extract($vars, EXTR_OVERWRITE);

          include $_filename;

       }

最后锁定,错误是发生在这句代码。

6.可以测试下结果:(1).

public
function load($_filename,$vars=null){
      if(!is_null($vars))
        extract($vars, EXTR_OVERWRITE);

echo
$_filename;

      die();
       
include $_filename;
 }

结果如下:



(2)删掉缓Runtime存再测.

public function load($_filename,$vars=null){

      if(!is_null($vars))

        extract($vars, EXTR_OVERWRITE);

       
include $_filename;

echo $_filename;

      die();
 }

结果如下:



7.第6步结果可以看到,问题就出在include 这个文件./Application/Runtime/common~runtime.php时出错了。为什么呢?

文件如下:


8.在同事帮助下,终于知道原因,如图:是因为我Common/Common文件夹下的function.php引入了一个user.function.php路径有问题。



如果直接用require_once
'user.function.php';这样在部署情况下common~runtime.php就没办法正确解析,之前调试模式是没问题的。

最后我们在导入文件的时候加上正确路径就可以了:如图改成require_once
APP_PATH.'Common/Common/'user.function.php';,问题到这里就解决了。



最后再说明一点:记得关闭调试模式,要把Runtime文件夹删除,到时测试成功通过。

如果你碰到的是和我一样的问题,希望能帮到你,最后希望转载的小朋友,加上原创链接,费老大劲才弄出来的;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息