如何使windows符号链接与mod_php一起工作



我正试图在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。

除了我的主要问题("如何实现这一点?")之外,我正在寻找以下问题的答案:

  1. 这是PHP(或Apache?)中的另一个错误吗

  2. 将PHP作为模块加载和通过CGI加载之间有什么区别?这与此事有何关系

在阅读了PHP中的线程安全之后:

  1. 线程安全与此有关吗

我可以看出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时会出现这些问题,我不知道。

最新更新