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

如何使windows符号链接与mod_php一起工作?,php,windows,apache,xampp,symlink,Php,Windows,Apache,Xampp,Symlink,我正在尝试从PHP中使用Windows7上的符号链接。我使用Apache 2.4.10和PHP 5.5.15从普通用户帐户(非管理员)运行XAMPP。按照中的建议,我为我的用户设置了创建符号链接的正确权限。这很好,我可以从命令行创建符号链接(mklink…),而无需提升。PHP的symlink()函数不会抛出任何权限(代码1314)错误 从命令行运行PHP或通过CGI加载PHP时,一切正常: symlink()能够创建符号链接(绝对和相对 目标路径) is\u link()对于符号链接返回tr

我正在尝试从PHP中使用Windows7上的符号链接。我使用Apache 2.4.10和PHP 5.5.15从普通用户帐户(非管理员)运行XAMPP。按照中的建议,我为我的用户设置了创建符号链接的正确权限。这很好,我可以从命令行创建符号链接(
mklink…
),而无需提升。PHP的
symlink()
函数不会抛出任何权限(代码1314)错误

从命令行运行PHP或通过CGI加载PHP时,一切正常:

  • symlink()
    能够创建符号链接(绝对和相对
    目标路径)
  • is\u link()
    对于符号链接返回true
  • filetype()
    返回符号链接的“link”
然而,当我将PHP作为apache模块运行时,我遇到了各种各样的麻烦:

  • 当目标是有效的绝对路径时,
    symlink()
    只能创建符号链接(使用相对路径将抛出:
    警告:symlink():无法获取文件信息(错误2)
  • is_link()
    返回符号链接的false
  • filetype()
    返回符号链接的'file'/'dir'
这似乎与有关,但该错误已在PHP5.4中修复,我使用的是5.5。此外,PHP正在报告错误代码2,而不是3

除了我的主要问题(“如何实现这一目标?”),我正在寻找以下问题的答案:

  • 这是PHP(或Apache)中的另一个bug吗?

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

  • 在阅读了以下内容后:

  • 线程安全与此有关吗?
  • 我可以看出mod_php现在被加载为线程安全版本(“phpt5ts.dll”)

    以下是httpd.conf的一部分,用于加载为模块(默认xampp设置):

    LoadFile“G:/xampp/php/php5ts.dll”
    加载文件“G:/xampp/php/libpq.dll”
    LoadModule php5_模块“G:/xampp/php/php5apache2_4.dll”
    SetHandler应用程序/x-httpd-php
    SetHandler应用程序/x-httpd-php-source
    
    以下是php cgi设置:

    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>
    
    <FilesMatch "\.php$">
        SetHandler application/x-httpd-php-cgi
    </FilesMatch>
    <IfModule actions_module>
        Action application/x-httpd-php-cgi "/php-cgi/php-cgi.exe"
    </IfModule>
    
    
    SetHandler应用程序/x-httpd-php-cgi
    动作应用程序/x-httpd-php-cgi“/php-cgi/php-cgi.exe”
    
    当目标是有效的绝对路径时,symlink()只能创建符号链接(使用相对路径将抛出:警告:symlink():无法获取文件信息(错误2))

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

    对于符号链接,is_link()返回false

    我也注意到了同样的事情,至少在我目前的设置下。当PHP作为Apache模块而不是通过CGI运行时,
    is\u link
    函数对于任何符号链接总是返回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
    (和
    filetype
    )出现这些问题的原因,我不知道