如何让windows符号链接与mod_php一起使用?

时间:2014-10-28 03:04:11

标签: php windows apache xampp symlink

我试图在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()为符号链接
  • 返回 false
  • filetype()为符号链接返回'file'/'dir'

这似乎与PHP symlink() fails on Windows 7有关,但该错误已在PHP 5.4中修复,我使用的是5.5。 PHP也报告错误代码2,而不是3。

除了我的主要问题(“如何使这项工作?”),我正在寻找以下问题的答案:

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

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

  3. 阅读thread safety in PHP之后:

    1. 线程安全可以与此有关吗?
    2. 我可以说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>
      

1 个答案:

答案 0 :(得分:0)

  

symlink()只能创建符号链接,当target是有效的绝对路径时(使用相对路径将抛出:警告:symlink():无法获取文件信息(错误2))

这是由于PHP中的以下错误:

  

is_link()为符号链接返回false

我注意到了同样的事情,至少在我目前的设置下。当PHP作为Apache模块运行而不是通过CGI运行时,when函数对于任何符号链接始终返回false。我的设置是:

  • Windows 7 x64
  • XAMPP 1.8.3
  • PHP 5.5.11
  

将PHP作为模块加载到CGI之间有什么区别?如何与此相关?

通过CGI运行PHP的优点是,每个PHP进程可以在不同的用户下运行,而不仅仅是Apache运行的用户。这对于高效的服务器环境很有用,因此每个网站不需要具有相同的访问权限。但是,通过CGI运行PHP也要慢得多。将其作为模块运行始终是最快的选择。

通过 FastCGI 运行PHP可以缓解大多数情况下的性能下降,但它仍然比将其作为模块运行速度慢一点。

关于运行PHP作为模块时出现is_link(和is_link)这些问题的原因,我不知道。