php require_once windows和linux之间的路径差异
Posted
技术标签:
【中文标题】php require_once windows和linux之间的路径差异【英文标题】:php require_once path difference between windows and linux 【发布时间】:2012-09-01 06:06:33 【问题描述】:我的 Cakephp 根文件夹中有一个文件,位于名为 cron 的文件夹下。路径是:
c:/wamp/www/project/cron/daily.php
这个文件需要另一个文件放在 cake 结构的 vendor 文件夹中,像这样:
require("/../vendors/phpMailer/class.phpmailer.php");
我从任务调度程序运行这个 daily.php。这是我的开发站点中的场景。(Windows系统)。它按预期工作正常。当我将项目迁移到 Ubuntu(生产站点)时,require 语句开始引起问题;它找不到所需的文件。我在那里做了一个小改动,如下所示:
require("../vendors/phpMailer/class.phpmailer.php"); <= removed the preceding slash
它奏效了。所以我的疑问是,父目录符号在寡妇和 Linux 中的工作方式有什么不同吗?如果是这样,我该如何克服?每次我将项目从我的开发站点(Windows)移动到生产站点(Linux)时,删除斜线是不可行的。
我试过了:
require("./../vendors/phpMailer/class.phpmailer.php");
它在 linux 中工作。但是在 Windows 中给出了“没有这样的文件目录”错误。似乎 windows 只适用于:
require("/../vendors/phpMailer/class.phpmailer.php");
解决方案
来自@TWCrap的帮助问题解决如下:
require(dirname(__FILE__)."/../vendors/phpMailer/class.phpmailer.php");
它适用于 Windows 和 linux(* 喜悦之泪 *)。但在 Windows 中,它产生的路径为:
C:\wamp\www\project\cron/../vendors/phpMailer/class.phpmailer.php
这条路看起来很丑,我希望它以后不会造成问题!
-谢谢大家!
【问题讨论】:
linux 开头的 / 指向 Root 目录(就像你在 windows 中写 C:/ 一样)。无论如何,我认为您也不需要在 Windows 的开头使用 / 。没有?! 使用绝对路径? 仅供参考,/..
在任何健全的操作系统上都是无意义的根路径。你说的是“根目录之上的目录”,显然不存在。这将有效地被视为根。我怀疑您的意思是./..
,顺便说一下,这是为include
/require
指定路径的最有效方法,因为它会阻止PHP 搜索include_path
并直接查看确切位置你指定了。
@Yazmat 它应该在 Windows 开头没有 / 的情况下工作。 (../) 指的是 Windows 中的父目录。但不知何故,它在这里表现得很奇怪。
dirname(__FILE__) == __DIR__
。还是我错了。
【参考方案1】:
我记得,当您在该行前面放置 1 个点时,您将从您所在的目录开始。因此,该行必须如下所示:
require("./../vendors/phpMailer/class.phpmailer.php");
这应该适用于 windows 和 linux....
【讨论】:
@Orbb 这里的关键是getcwd()
@Orbb,正如 DaveRandom 所提到的,您能否使用 getcwd 获取当前目录,并使用该目录转到其他地方。您可以使用 dirname() php.net/manual/en/function.dirname.php 创建一个目录路径
@Orbb,您也可以通过使用:dirname(__FILE__)
获取当前目录
@TWCrap 在 Windows 中是 5.3.8 版,在 linux 中是 5.3.2-1ubuntu4.17
对,但如果我没记错的话,你能不能使用dirname(__FILE__)
来获取调用它的文件的目录路径。我想你可以用它来找到正确的目录,对吗???【参考方案2】:
如果您确实不需要,请不要使用 absolute 路径。正确设置include_path
更安全、更好,因此在移动的情况下,您只需调整一项设置,而不是挖掘整个项目及其所有文件。
所以我的疑问是,widows 和 Linux 中父目录表示法的工作方式有区别吗?
以/
开头的路径(即/foo/bar
)是绝对路径,因为以/
开头的路径表示根文件夹。在 Windows 上,你有驱动器号。
我还建议使用require_once
来避免重复的要求(如果您将 html 与代码混合使用,这是可以的,但无论如何不建议使用“意大利面条代码”),但可能会导致代码出现问题
【讨论】:
And these differences are not transparently handled by PHP
- 是的,事实上它们是由 Windows 本身透明地处理的。 Windows(不仅仅是 PHP)将允许您使用 /
作为路径分隔符,除了 cmd.exe 之外的任何地方。它还将以/
开头的路径视为从当前所选驱动器的路径开始。如果您在 PHP 脚本中编写所有路径,就好像它们是 *nix 路径一样,它们将在 Windows 上工作。
是的,我知道“/”适用于 Windows,我(不清楚)指的是缺少根驱动器映射。如果我错了,那么感谢您的纠正。【参考方案3】:
问题在于,至少在 UNIX 系统上,当您在文件路径上以斜杠开头时,您从根目录开始。
您应该在两个系统上都写 ./../* 或只写 ../。它应该同时工作。
【讨论】:
以上是关于php require_once windows和linux之间的路径差异的主要内容,如果未能解决你的问题,请参考以下文章