ThinkPHP5.1根目录下的命令行入口文件think删除导致无法访问

在ThinkPHP5.1下,如果应用部署在根目录而非 public 目录下,根目录的 think 文件是不能删除的,删除后将会导致程序无法正常运行。

部署网站时候出现这个问题后各种地方找了个遍都没有找到原因,花了很久一个个问题仔细排除查看,最后发现是根目录的think文件问题,这个命令行入口文件不能删除。

已经过了有一段时间了,不过觉得还是有必要记录下来,希望后面的人部署网站时碰到这个问题省的再跳一次坑,百度搜索了一下,在官方论坛也有对应的帖子,参考最下方的原文地址。

原因在于 核心代码thinkphp\library\think\Loader.php:68 会判断think文件是否存在,如果不存在,则通过dirname()将目录减少一级,所以,如果index入口文件如果是在public目录下,这样是没有问题的,如果index入口文件是放在项目根目录下,这时候就会有问题了,为了不修改核心代码,可以在根目录下放一个空的think文件即可。

框架内对应代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 获取应用根目录
public static function getRootPath()
{
if ('cli' == PHP_SAPI) {
$scriptName = realpath($_SERVER['argv'][0]);
} else {
$scriptName = $_SERVER['SCRIPT_FILENAME'];
}

$path = realpath(dirname($scriptName));

if (!is_file($path . DIRECTORY_SEPARATOR . 'think')) {
$path = dirname($path);
}

return $path . DIRECTORY_SEPARATOR;
}

原文地址