【问题标题】:PHP realpath function questionPHP realpath 函数问题
【发布时间】:2010-09-11 03:46:46
【问题描述】:

我似乎无法让 realpath 函数与变量一起使用,有什么方法可以解决这个问题吗?当我在函数中使用变量时,它不会返回任何内容

realpath('./members/' . $userId . '/images/thumbs/' . $image);

编辑真实路线。

http://localhost/Project/members/24/images/thumbs/avatar.png

【问题讨论】:

  • “路径名”是否在网络环境中工作,或者作为文件的真实路径?这可能是当前工作目录的问题。
  • 你能输出变量并将它们与完整路径匹配吗?您能否向我们展示一个示例路径,已删除域名?
  • echo './members/' . $userId . '/images/thumbs/' . $image; 显示什么?
  • 是的,如果这就是你的意思src="pathname",它就像一个真正的路由文件
  • 无论如何你都不能使用真实路径作为图像 src

标签: php


【解决方案1】:

它还没有完成,但它非常适合......

看。您的网站同时存在于两个领域:真实领域和虚拟领域。

对于网站用户来说,它是一个虚拟网络服务器,您必须了解它的一个非常重要的事情:网络服务器上没有文件。想象一下,您在地址栏中输入http://example.com/index.html。它不是文件也不是路径,而是 URL,HTTP 资源。 虚拟地址,与常规文件完全不同。

对于您作为网站开发人员而言,网络服务器是在计算机上运行的程序。这台计算机很可能有一个硬盘和一个文件系统。您的 PHP 脚本在处​​理数据或包含其他脚本时,会操作物理磁盘上的文件

这种差异对于初学者来说是一个非常常见的陷阱。
他们中的许多人将文件与超链接混淆,尝试使用 HTTP 协议调用本地文件或使用来自 Web 服务器根目录的虚拟路径包含文件。

此外,有两件事妨碍正确理解:

  • 一种语言的开发人员,他们想要变得“好”并使文件系统功能也可以与虚拟资源一起使用
  • 一台本地开发PC,它允许使用虚拟资源的文件系统路径,它会工作。或者更糟糕的是,将文件从客户端复制到服务器!

要小心,不要让他们欺骗你。

好吧,毕竟这不是火箭科学。一个人只需要了解这三件事:

  1. 物理文件和虚拟资源的区别。
  2. root 是什么东西,文件系统根目录和网络服务器根目录有什么区别
  3. 绝对路径和相对路径的区别。

第一个很容易区分:

  • 客户端请求的是 HTTP 资源,而不是您的程序
  • 您的程序请求了一个文件,而客户端无法访问它

一个文件属于文件系统。它是存储在硬盘上的一段数据。它有几个属性,例如大小、修改时间、所有者、权限等。它是明确的文件系统属性,没有 HTTP 资源拥有它。
数据文件和您的脚本都是文件,应该这样对待。如果您执行include 'http://yoursite.com/file.php'; 之类的操作,则您没有按预期包含 PHP 代码,而只是包含纯 HTML - file.php 执行的结果!

如果您想从目录中读取图像名称,请不要从http://yoursite.com/image/ 中读取它。它不是目录。

另一方面,HTTP 资源是 HTTP 协议的东西。您的网络服务器是一个守护进程,它侦听请求。在收到对由 URI 标识的特定资源的请求后,它会查找该资源,并(如果找到)返回其内容以及几个 HTTP 标头

一个网络服务器有它自己的目录结构,但是理解这个目录结构是虚拟的非常重要。它只是类似于一个真正的文件系统,但它根本不是一个文件系统。 /dir//dir/file.ext/dir/whatever - 虽然所有这些路径看起来不同,但它们都是相同的。 这是一个棘手的主题,但理解起来非常重要。 HTTP 中没有文件或目录。但只是 resources,它由 headers 和 body 组成。 如果您从服务器请求/dir/ URI,您将获得标头和正文。 如果你从服务器请求/dir/file.ext URI,你会得到一个标题和一个正文。 每次你从服务器请求某些东西时,你都会得到一个标题和一个正文。 唯一可能的例外是包含标头但没有正文的响应。
虽然某些资源可能类似于文件,但它们不是文件。它们没有属性,只有标题。真是不一样的境界。 当然,大多数时候网络服务器只是找到与请求的 URI 对应的物理文件并将其输出。但它不再是一个文件,而只是文件的内容,前面有一些标题。 是的 - 这就是区别:将文件区分为文件系统主题及其内容是最重要的。 如果你请求一些看起来像目录的东西,你实际上会得到……一个 HTML 代码!根据文件系统形式的 HTML 代码(前面有一些标题)来区分目录非常重要。 (当然,您可以获得的不是 HTML,而是一些二进制文件内容 - 这只是 Content-type 标头的问题。另一个不将现实世界与虚拟世界混淆的原因)

结论:
如果您希望脚本直接访问文件 - 将其作为文件寻址。 不要通过 HTTP 调用它!(请注意,您的 php 脚本文件 ;-)
如果您希望客户端使用 HTTP 协议访问相同的文件 - 将其作为虚拟资源寻址。

接下来,root。

嗯,根是根。一个起点。一切开始的地方。

文件系统和网络服务器都有自己的根源。
在 Unix 系统上,文件系统根是/请注意,它不仅仅是一个目录分隔符! 如果路径从该符号开始,则它是特定目录的名称 - 根目录。每个其他文件和目录都属于根目录。 在 Windows 系统上,它非常混乱(像往常一样)。没有通用的文​​件系统根,而是具有自己的根的单独磁盘。它以磁盘驱动器号和反斜杠开头:C:\ 是驱动器 C 的根目录。

网络服务器有它自己的根。一个虚拟世界与真实世界相遇的地方。从服务器的角度来看,Web 服务器根目录(通常称为 DOCUMENT_ROOT)是一个文件系统目录,Web 服务器在其中查找代表 HTTP 资源的文件。对于客户来说,它是完全合格的根——网站开始的地方。它看起来像 Unix 系统根 - /。客户端对服务器的文件系统一无所知。对于客户端,这个/ 是唯一的根。

结论:
永远知道你的根在哪里。 对于网络服务器来说很简单:总是/。 对于文件系统,知道虚拟根与现实世界的交汇点——一个 DOCUMENT_ROOT。它将帮助您找到自己的文件

绝对路径和相对路径。

这很简单。 实际上,只有绝对路径是真实的。虽然相对路径是可以想象的,并且每条相对路径在使用前总是转换为 abaolute 路径。 绝对路径与root 密不可分。事实上,绝对路径是从根开始构建的路径:

  • /var/www/site/forum/index.php
  • с:\windows\command.com
  • /img/frame.gif

如您所见,前两个是文件系统路径,分别来自unix和windows,而第三个无法明确定义,但很可能是虚拟HTTP资源。

每条不包含根目录的路径都是相对路径。它从 current location:

  • 文件.php
  • ./file.php
  • 图片/图片.jpg
  • ../file.php
  • ../../file.php

结论
尽可能使用绝对路径。无论当前目录如何,它都是明确的并且可以在任何地方使用。它可能包含可变部分,让它在不同的环境中工作,但最后它应该始终是绝对的。

【讨论】:

    【解决方案2】:

    路径真的存在吗?要使realpath 函数起作用,路径必须是有效且现有的位置。

    因此,如果您使用 .htaccess 创建“伪”路径,realpath 函数将无法对它们起作用。内部变量的使用应该无关紧要(假设它们填充得很好并且是正确的),因为它真正需要的是一个有效的字符串。

    【讨论】:

    • 是的,它存在我在没有真实路径的情况下对其进行了测试,它会显示出来。
    • realpath 函数的值是否返回 false?用更多代码编辑帖子,也许也有帮助。
    【解决方案3】:

    realpath() 在失败时返回 FALSE,例如如果文件不存在。
    http://php.net/realpath

    检查你的变量,伙计

    【讨论】:

    • @HPslate 你越早学会相信自己的眼睛,就越早解决问题。
    • 我相信我的眼睛相信你的耐心。
    • @HPslate 您说的是虚拟资源,而不是文件。那是另一回事
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 2020-03-09
    • 2011-07-19
    • 2012-11-01
    相关资源
    最近更新 更多