如何使 windows 符号链接与 mod_php 一起工作?
Posted
技术标签:
【中文标题】如何使 windows 符号链接与 mod_php 一起工作?【英文标题】:How to make windows symlinks work with mod_php? 【发布时间】:2014-12-23 09:07:48 【问题描述】:我正在尝试在 php 中使用 Windows 7 上的符号链接。我正在使用普通用户帐户(非管理员)使用 Apache 2.4.10 和 PHP 5.5.15 运行 XAMPP。正如Symlink is not working in my local machine 中所建议的那样,我为我的用户设置了正确的权限来创建符号链接。这很好用,我可以从命令行创建符号链接(mklink ...
)而无需提升。 PHP 的 symlink()
函数不会抛出任何权限(代码 1314)错误。
当从命令行运行 PHP 或通过 CGI 加载它时,一切都按预期工作:
symlink()
能够创建符号链接(绝对和相对
目标路径)
is_link()
为符号链接返回 true
filetype()
为符号链接返回“链接”
但是,当我将 PHP 作为 apache 模块运行时,我遇到了各种各样的麻烦:
symlink()
只能创建符号链接,当目标是有效的绝对路径(使用相对路径会抛出:Warning: symlink(): Could not fetch file information(error 2)
)
is_link()
为符号链接返回 false
filetype()
为符号链接返回 'file' / 'dir'
这似乎与PHP symlink() fails on Windows 7 有关,但该错误已在 PHP 5.4 中修复,我正在使用 5.5。 PHP 也报告错误代码 2,而不是 3。
除了我的主要问题(“如何进行这项工作?”),我正在寻找以下问题的答案:
这是 PHP(或 Apache?)中的另一个错误吗?
将 PHP 作为模块加载和通过 CGI 加载有什么区别?这与此事有何关系?
在阅读了thread safety in PHP之后:
-
线程安全与此有关吗?
我可以看出 mod_php 现在被加载为线程安全版本(“phpt5ts.dll”)。
这是作为模块加载的 httpd.conf 的一部分(默认 xampp 设置):
LoadFile "G:/xampp/php/php5ts.dll"
LoadFile "G:/xampp/php/libpq.dll"
LoadModule php5_module "G:/xampp/php/php5apache2_4.dll"
<FilesMatch "\.php$">
SetHandler application/x-httpd-php
</FilesMatch>
<FilesMatch "\.phps$">
SetHandler application/x-httpd-php-source
</FilesMatch>
这里是 php-cgi 设置:
<FilesMatch "\.php$">
SetHandler application/x-httpd-php-cgi
</FilesMatch>
<IfModule actions_module>
Action application/x-httpd-php-cgi "/php-cgi/php-cgi.exe"
</IfModule>
【问题讨论】:
【参考方案1】:symlink() 只能创建符号链接,当 target 是有效的绝对路径时(使用相对路径会抛出:Warning: symlink(): Could not fetch file information(error 2))
这是由于 PHP 中的以下错误:
https://bugs.php.net/bug.php?id=69473 https://github.com/php/php-src/pull/1243is_link() 对符号链接返回 false
我注意到了同样的事情,至少在我目前的设置下。当 PHP 作为 Apache 模块而不是通过 CGI 运行时,is_link
函数对于任何符号链接总是返回 false。我的设置是:
将 PHP 作为模块加载和通过 CGI 加载有什么区别,这与此事有何关系?
通过 CGI 运行 PHP 的优势在于,每个 PHP 进程可以在不同的用户下运行,而不是只在运行 Apache 的用户下运行。这对于生产服务器环境很有用,因此每个网站不需要具有相同的访问权限。但是,通过 CGI 运行 PHP 也慢得多。将其作为模块运行始终是最快的选择。
通过 FastCGI 运行 PHP 在很大程度上缓解了性能下降,但仍然比作为模块运行慢一点。
至于为什么is_link
(和filetype
)在将PHP作为模块运行时会出现这些问题,我不知道。
【讨论】:
以上是关于如何使 windows 符号链接与 mod_php 一起工作?的主要内容,如果未能解决你的问题,请参考以下文章
如何找到文件/文件夹(Windows 和 UNIX)的所有硬链接和符号链接?