首页 > 解决方案 > 规范化/标准路径根到 CLI/WEB

问题描述

我有这个简短的脚本来检测用户使用环境并尝试规范化根路径:

位于C:\xampp\htdocs\dev\t2\Last-Hammer\configs\const\loader.php

$env= '';
if (php_sapi_name() == 'cli') {
    $env= 'cli';
    if (!isset($_SERVER['PWD'])) {
        $path = dirname(__DIR__).'\\';
    } else {
        $path = dirname($_SERVER['PWD']);
    }
} else {
    $env= 'web';
    $path = $_SERVER['DOCUMENT_ROOT'];
}
echo $path;
echo PHP_EOL;
echo $env;
file_get_contents($path.'configs/const/client.xml')

我从 2 个不同的文件中使用它:index.php在根文件夹中效果很好,但试图从像这样的子目录中使用它/dev/cron.php

cron.php内容:

$path = (!isset($_SERVER["PWD"]) ? dirname(__DIR__).'\\' : dirname($_SERVER["PWD"]));
require_once $path.'/configs/const/loader.php';

我得到这个输出

//from Web environment 
C:/xampp/htdocs/dev/t2/Last-Hammer/ 
web

//from CLI environment 
C:\xampp\htdocs\dev\t2\Last-Hammer 
cli

问题是这在 Web 环境中可以正常工作,但在 CLI 中无法正常工作,当我尝试执行如下php cron.php操作时:

PHP 警告:file_get_contents(C:\xampp\htdocs\dev\t2\Last-Hammer\configs\configs/const/client.xml):无法打开流:C:\xampp\htdocs\dev 中没有这样的文件或目录\t2\Last-Hammer\configs\const\loader.php 在第 24 行

警告:file_get_contents(C:\xampp\htdocs\dev\t2\Last-Hammer\configs\configs/const/client.xml):无法打开流:C:\xampp\htdocs\dev\ 中没有这样的文件或目录t2\Last-Hammer\configs\const\loader.php 在第 24 行

预计对于 CLI 或 WEB,项目的根目录类似于:C:/xampp/htdocs/dev/t2/Last-Hammer/并且在 CLI 的情况下不会根据 php 文件的执行位置而不断变化,因为根目录可以在 CLI 中设置。不管它在哪里运行。

标签: phpdocument-root

解决方案


您在 cli 案例中缺少尾随“\”。要统一两者,您可以使用 str_replace():

$env= '';
if (php_sapi_name() == 'cli') {
    $env= 'cli';
    if (!isset($_SERVER['PWD'])) {
        $path = dirname(__DIR__).'\\';
    } else {
        $path = dirname($_SERVER['PWD']).'\\';
    }
} else {
    $env= 'web';
    $path = $_SERVER['DOCUMENT_ROOT'];
}
$path = str_replace( '\\', '/', $path );
echo $path;
echo PHP_EOL;
echo $env;
file_get_contents($path.'configs/const/client.xml')

推荐阅读