我正试图在Windows 7上使用PHP中的符号链接。我使用Apache 2.4.10和PHP 5.5.15从一个普通用户帐户(非管理员)运行XAMPP。正如Symlink中所建议的那样,它在我的本地机器中不起作用,我为我的用户设置了创建Symlink的正确权限。这很好,我可以在没有高程的情况下从命令行创建符号链接(mklink ...
)。PHP的symlink()
函数不会抛出任何权限(代码1314)错误。
当从命令行运行PHP或通过CGI加载PHP时,一切都如预期:
symlink()
能够创建符号链接(绝对和相对
目标路径)- 对于符号链接,
is_link()
返回true filetype()
为符号链接返回"链接"
然而,当我将PHP作为apache模块运行时,我会遇到各种各样的麻烦:
- 当目标是有效的绝对路径时,
symlink()
只能创建符号链接(使用相对路径将抛出:Warning: symlink(): Could not fetch file information(error 2)
) - 对于符号链接,
is_link()
返回false filetype()
返回符号链接的"文件"/"目录"
这似乎与Windows7上的PHP符号链接()失败有关,但这个错误在PHP 5.4中得到了修复,我使用的是5.5。另外,PHP报告的错误代码是2,而不是3。
除了我的主要问题("如何实现这一点?")之外,我正在寻找以下问题的答案:
-
这是PHP(或Apache?)中的另一个错误吗
-
将PHP作为模块加载和通过CGI加载之间有什么区别?这与此事有何关系
在阅读了PHP中的线程安全之后:
- 线程安全与此有关吗
我可以看出mod_php现在是以线程安全版本("phpt5ts.dll")加载的。
以下是httpd.conf的一部分,用于作为模块加载(默认示例设置):
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>
symlink()只能在目标是有效的绝对路径时创建符号链接(使用相对路径会抛出:警告:symlink(():无法获取文件信息(错误2))
这是由于PHP中的以下错误:
- https://bugs.php.net/bug.php?id=69473
- https://github.com/php/php-src/pull/1243
对于符号链接,is_link()返回false
我也注意到了同样的事情,至少在我目前的设置下是这样。当PHP作为Apache模块而不是通过CGI运行时,对于任何符号链接,is_link
函数总是返回false。我的设置是:
- Windows 7 x64
- 示例1.8.3
- PHP 5.5.11
将PHP作为模块加载和通过CGI加载之间有什么区别?这与此事有何关系?
通过CGI运行PHP的好处是,每个PHP进程都可以在不同的用户下运行,而不仅仅是在Apache运行的用户下。这对于生产服务器环境非常有用,这样每个网站就不需要拥有相同的访问权限。然而,通过CGI运行PHP也要慢得多。将其作为模块运行始终是最快的选择。
通过FastCGI运行PHP在很大程度上缓解了性能下降的问题,但它仍然比作为模块运行慢一点。
至于为什么is_link
(和filetype
)在作为模块运行PHP时会出现这些问题,我不知道。