我似乎无法获得使用变量的realpath函数有没有办法解决这个问题?当我在函数中使用变量时,它返回任何我知道路径名在没有realpath函数的情况下工作但我想使用带路径名的realpath函数.
realpath('./members/' . $userId . '/images/thumbs/' . $image);
Run Code Online (Sandbox Code Playgroud)
编辑真实路线.
http://localhost/Project/members/24/images/thumbs/avatar.png
Run Code Online (Sandbox Code Playgroud)
好吧它尚未完成,但它完全适合......
看.您的网站一次只能生活在两个领域:真实网站和虚拟网站.
对于站点用户来说,它是一个虚拟的 Web服务器,您必须了解它的一个非常重要的事情:Web服务器上没有文件.想象一下,您http://example.com/index.html在地址栏中输入内容.它不是文件也不是路径,而是URL,HTTP资源.一个虚拟地址,从一个普通的文件完全不同.
当你作为一个网站开发人员,一个Web服务器是一个程序在计算机上运行.这台计算机很可能有一个硬盘和一个文件系统.您的PHP脚本在处理数据或包含其他脚本时,会处理物理磁盘上的文件.
对于初学者来说,这种差异是一个非常普遍的陷阱.
其中许多人将文件与超链接混淆,尝试使用HTTP协议调用本地文件或使用来自Web服务器根目录的虚拟路径包含文件.
此外,有两件事阻碍了正确的理解:
要小心,不要让他们欺骗你.
好吧,毕竟它不是火箭科学.人们只需了解这3个问题:
root文件系统root和web-server root之间的区别第一个可以很容易地区分:
文件属于文件系统.它是存储在硬盘上的一块数据.它有几个属性,如大小,修改时间,所有者,权限等.它是显式文件系统属性,没有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,而是一些二进制文件内容 - 这只是内容类型标题的问题.
结论:
如果您希望脚本直接访问文件 - 将其作为文件进行处理.不要通过HTTP调用它!(请注意,您的php脚本是文件;-)
如果您希望客户端使用HTTP协议访问同一文件 - 将其作为虚拟资源进行处理.
好吧,root是root.一个起点.一切都开始的地方.
文件系统和Web服务器都有自己的根.
在Unix系统上,文件系统根目录是/.请注意,它不仅仅是一个目录分隔符!如果路径从该符号开始,则它是特定目录的名称 - 根目录.每个其他文件和目录都属于root.在Windows系统上它很乱(像往常一样).没有通用的文件系统根,但是它有自己的根的单独磁盘.它从磁盘驱动器号和反斜杠开始:C:\是驱动器C的根.
Web服务器拥有自己的根.虚拟世界与真实世界相遇的地方.但从服务器的角度来看,网络服务器的根目录(通常称为DOCUMENT_ROOT)是一个文件系统目录,其中网络服务器查找代表HTTP资源文件.对于客户来说,它是完全合格的根 - 网站开始的地方.它看起来像Unix系统root - /.客户端对服务器的文件系统一无所知.对于客户端,这/是唯一的根.
结论:
始终知道你的根目录.对于网络服务器来说,它很简单:它总是如此 /.对于文件系统,知道虚拟根与现实世界相遇的点 - DOCUMENT_ROOT.它将帮助您找到自己的文件.
这很简单.实际上,只有绝对路径是真实的.虽然相对的是可以想象的,并且每个相对路径在使用之前总是转化为绝对路径.绝对路径与之密不可分root.事实上,绝对路径是从根构建的路径:
如您所见,前两个是文件系统路径,分别来自unix和windows,而第三个不能清楚地定义,但很可能是虚拟HTTP资源.
每个不包含根直觉的路径都是相对的路径.它从当前位置构建:
结论:
尽可能使用绝对路径.无论当前目录如何,它都是明确无误的,无处不在.它可能包含可变部分,让它在不同的环境中工作,但最后它应该始终是绝对的.