php - 规范化/标准路径根到 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 中设置。不管它在哪里运行。
解决方案
您在 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')
推荐阅读
- c# - 如何在 C# 中调用/编组 C++“const uint64_t*”?
- javascript - 获取销售日期可变产品 woo
- typescript - 为什么 TypeScript 接口中存在的属性会通过断言影响类型缩小,我怎样才能让它正常工作?
- vue.js - 在Vue中使用put请求编辑数组中的数组
- r - R 矢量化和 dplyr 变异错误?
- jquery - jQuery AJAX - ajax 中的变量未定义
- sympy - sympy mignotte_bound 和 ring
- python - 有没有办法使用生成器并打开文件?
- spring-kafka - 在 kafka 事务失败期间,ChainedTransactionManager 未回滚 DB Transaction
- java - 我的索引越界错误发生在哪里?