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

Posted

技术标签:

【中文标题】如何使 windows 符号链接与 mod_php 一起工作?【英文标题】:How to make windows symlinks work with mod_php? 【发布时间】:2014-12-23 09:07:48 【问题描述】:

我正在尝试在 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() 只能创建符号链接,当目标是有效的绝对路径(使用相对路径会抛出: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。

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

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

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

在阅读了thread safety in PHP之后:

    线程安全与此有关吗?

我可以看出 mod_php 现在被加载为线程安全版本(“phpt5ts.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】:

symlink() 只能创建符号链接,当 target 是有效的绝对路径时(使用相对路径会抛出:Warning: symlink(): Could not fetch file information(error 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 XAMPP 1.8.3 PHP 5.5.11

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

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

通过 FastCGI 运行 PHP 在很大程度上缓解了性能下降,但仍然比作为模块运行慢一点。

至于为什么is_link(和filetype)在将PHP作为模块运行时会出现这些问题,我不知道。

【讨论】:

以上是关于如何使 windows 符号链接与 mod_php 一起工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何找到文件/文件夹(Windows 和 UNIX)的所有硬链接和符号链接?

PHP 之 FastCGI 与 mod_php

Windows:导航到符号链接

将 spdy 与 mod_php 一起使用

Windows MSVC 符号表(.lib文件)(C++符号表解析)(符号表是如何产生的)(第四步:链接)

Linux创建文件链接(ln | 符号链接和硬链接)