繁体   English   中英

PHP Realpath函数问题

[英]PHP realpath function question

我似乎无法让realpath函数与变量一起使用,有没有办法可以解决此问题? 当我在函数中使用变量时,它不返回任何内容,我知道没有realpath函数的路径名也可以使用,但是我想将realpath函数与路径名一起使用。

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

编辑真实路线。

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

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

看。 您的站点一次处于两个领域:一个真实的和一个虚拟的。

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

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

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

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

  • 一种语言的开发人员,他们想变得“不错”并使文件系统功能也可以与虚拟资源一起使用
  • 一台本地开发中的PC,它可以使虚拟资源使用文件系统路径,并且可以正常工作。 甚至更糟的是, 文件从客户端复制到服务器!

要谨慎,不要让他们欺骗你。

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

  1. 物理文件和虚拟资源之间的区别。
  2. 什么是root ,文件系统根目录和Web服务器根目录有什么区别
  3. 绝对路径与相对路径之间的差异。

第一个很容易区分:

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

文件属于文件系统。 这是一块存储在硬盘上的数据。 它具有几个属性,例如大小,修改时间,所有者,权限等。 它是显式的文件系统属性,没有HTTP资源。
数据文件和脚本都是文件,应将其视为文件。 如果您执行类似的操作,请include 'http://yoursite.com/file.php'; ,您没有按预期包括PHP代码,而只是纯HTML-执行file.php的结果!

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

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

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

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

接下来,root。

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

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

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

结论:
永远知道你的根在哪里。 对于Web服务器,它很简单: 始终为 / 对于文件系统,知道虚拟根与现实世界相遇的地方-DOCUMENT_ROOT。 这将帮助您找到自己的文件

绝对路径和相对路径。

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

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

如您所见,前两个分别是来自UNIX和Windows的文件系统路径,而第三个则不清楚,但很可能是虚拟HTTP资源。

每个不包含根Directoctory的路径都是相对路径。 它从当前位置开始构建:

  • file.php
  • ./file.php
  • 图片/picture.jpg
  • ../file.php
  • ../../file.php

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

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

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

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

检查您的变量,伙计

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM