【TP5源碼】獲取項目的根目錄

 

實現代碼

<?php
namespace app\index\controller;

class Index
{
    # 獲取應用根目錄
    public function index()
    {
        # 這裏是判斷命令行執行,仍是瀏覽器執行
        if ('cli' == PHP_SAPI) {
            $scriptName = realpath($_SERVER['argv'][0]);
        } else {
            # 獲取文件的絕對路徑
            $scriptName = $_SERVER['SCRIPT_FILENAME'];
        }
        # dirname是獲取目錄,reapath返回絕對路徑
        $path = realpath(dirname($scriptName));
        # 檢測是否是文件
        if (!is_file($path . DIRECTORY_SEPARATOR . 'think')) {
            $path = dirname($path);
        }
        return $path . DIRECTORY_SEPARATOR;
    }
}

步驟詳解

(1)分析    if ('cli' == PHP_SAPI) { php

先來看這一行代碼,這裏有個常量是PHP_SAPI,而後進行打印出來是cgi-fcgi,因此會走elsenginx

這裏會有三種狀況:apache

nginx訪問是fast-cgi瀏覽器

apache訪問是apache2handlerapp

命令行訪問是cli函數

(2)執行$scriptName = $_SERVER['SCRIPT_FILENAME'];spa

$_SERVER['SCRIPT_FILENAME']是訪問的是哪一個文件,它就獲取這個文件的絕對路徑命令行

打印出來的是:code

C:/phpStudy/PHPTutorial/WWW/tp5.1learn/public/index.phpip

(3)執行$path = realpath(dirname($scriptName));

這行進行了兩個操做:

dirname()函數返回路徑中的目錄部分。

realpath() 函數返回絕對路徑。

打印結果:

dirname($scriptName):C:/phpStudy/PHPTutorial/WWW/tp5.1learn/public

realpath(dirname($scriptName)):C:\phpStudy\PHPTutorial\WWW\tp5.1learn\public

(4)執行is_file($path . DIRECTORY_SEPARATOR . 'think',

打印結果:C:\phpStudy\PHPTutorial\WWW\tp5.1learn\public\think

這一步不會執行,由於在public的目錄下沒有think這個目錄

這裏須要注意一個點就是define ('DIRECTORY_SEPARATOR', "/"),在PHP這個是定義斜槓的常量

(5)執行$path . DIRECTORY_SEPARATOR;

執行結果:C:\phpStudy\PHPTutorial\WWW\tp5.1learn\

(6)完結:這個也就是tp5.1獲取項目根目錄的一個完整過程

相關文章
相關標籤/搜索