gpt4 book ai didi

php - 从另一个 php 文件运行一个 php 文件,就好像我直接从浏览器打开它一样(相对路径问题)

转载 作者:行者123 更新时间:2023-12-03 23:04:43 25 4
gpt4 key购买 nike

假设我有一个执行重要操作的 PHP 文件。

doAllTheThings.php:

<?php
include '../importantThing1.php';
include '../importantThing2.php';
include '../importantThing3.php';
//lots more complicated code below

我们还假设我在网络浏览器中输入地址,这需要半分钟,但所有事情都已完成,众所周知,太棒了,我们不要搞砸了。 (有很多正当理由不去搞砸它。也许我没有写它并且不理解它。也许我没有访问它。也许这是一个紧急补丁,没有时间更新并测试每一个包含路径。)

现在假设我希望用户能够执行一些可以导致代码运行的操作。

客户接口(interface).php:

<?php
//lots more complicated code above
if(doTheThings){
include '../../things/important/doAllTheThings.php';
}

它可以运行,但现在相对路径不起作用。 importantThing 链接已断开。没有重要的事情完成。

我如何执行“doAllTheThings.php”,使它的行为与我直接在浏览器地址栏中输入它的地址一样? (不更改目录结构、文件位置或“doAllTheThings.php”)

最佳答案

假设 doAllTheThings.php 中没有运行客户端代码,并且您知道 doAllTheThings.php 的路径。

主要问题是 include 如何解析嵌套 include 文件中的路径。

If the file isn't found in the include_path, include will finally check in the calling script's own directory and the current working directory before failing. [sic]

在这种情况下,调用脚本是 customInterface.php

因为 include 从执行的脚本文件的当前工作目录解析相对路径,这是规避问题并使调用脚本的行为就像执行 doAllTheThings.php 一样的最简单方法 直接使用chdir即可以更改当前工作目录。

目录目录 https://3v4l.org/D0Tn6

<?php
//...

if (true) {
//check to make sure doAllTheThings.php actually exists and retrieve the absolute path
if (!$doAllThings = realpath('../../things/important/doAllTheThings.php')) {
throw new \RuntimeException('Unable to find do all things');
}

//change working directory to the same as doAllTheThings.php
chdir(dirname($doAllThings));

//include doAllTheThings from the new current working directory
include $doAllThings;

//change the working directory back to this file's directory
chdir(__DIR__);
}

//...
?>

包含 __DIR__dirname(__FILE__)

但是,如果可能的话,我强烈建议使用绝对路径,包括根路径,附加 __DIR__或 PHP < 5.3 中的 dirname(__FILE__) 到任何相关的 include 路径。这将消除使用 chdir() 作为解决方法的需要,并允许 PHP 解析要包含的正确路径,同时还允许应用程序作为一个整体在脚本执行的任何系统上运行.

<?php
include __DIR__ . '/../importantThing1.php';
include __DIR__ . '/../importantThing2.php';
include __DIR__ . '/../importantThing3.php';

设置包含路径

另一种更复杂的方法是使用set_include_path() 指定包含文件目录。 .但是,如果您不知道嵌套包含脚本所在的目录,则需要您解析包含文件以检查它们。因此,我不推荐这种方法,尽管它可行。

<?php
if ($doAllThings = realpath('../../things/important/doAllTheThings.php') {
//retrieve the directory names of the scripts to be included
$basePath = dirname($doAllThings);
$subPath = dirname($basePath);

//add the directories to the include path
$include_path = set_include_path(get_include_path() . PATH_SEPARATOR . $basePath . PATH_SEPARATOR . $subPath);

include $doAllThings;

//restore the include path
set_include_path($include_path);
}

关于php - 从另一个 php 文件运行一个 php 文件,就好像我直接从浏览器打开它一样(相对路径问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59525111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com