我试图在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()
只能创建符号链接,当target是有效的绝对路径时(使用相对路径将抛出:Warning: symlink(): Could not fetch file information(error 2)
)is_link()
为符号链接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现在被加载为线程安全版本(“phpt5 ts .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>
答案 0 :(得分:0)
symlink()只能创建符号链接,当target是有效的绝对路径时(使用相对路径将抛出:警告:symlink():无法获取文件信息(错误2))
这是由于PHP中的以下错误:
is_link()为符号链接返回false
我注意到了同样的事情,至少在我目前的设置下。当PHP作为Apache模块运行而不是通过CGI运行时,when
函数对于任何符号链接始终返回false。我的设置是:
将PHP作为模块加载到CGI之间有什么区别?如何与此相关?
通过CGI运行PHP的优点是,每个PHP进程可以在不同的用户下运行,而不仅仅是Apache运行的用户。这对于高效的服务器环境很有用,因此每个网站不需要具有相同的访问权限。但是,通过CGI运行PHP也要慢得多。将其作为模块运行始终是最快的选择。
通过 FastCGI 运行PHP可以缓解大多数情况下的性能下降,但它仍然比将其作为模块运行速度慢一点。
关于运行PHP作为模块时出现is_link
(和is_link
)这些问题的原因,我不知道。