php - 如何使 Windows 符号链接(symbolic link)与 mod_php 一起工作?

标签 php windows apache xampp symlink

我正在尝试从 PHP 中在 Windows 7 上使用符号链接(symbolic link)。我正在使用普通用户帐户(非管理员)使用 Apache 2.4.10 和 PHP 5.5.15 运行 XAMPP。正如 Symlink is not working in my local machine 中的建议我为我的用户设置了正确的权限来创建符号链接(symbolic link)。这工作正常,我能够在没有提升的情况下从命令行创建符号链接(symbolic link)(mklink ...)。 PHP 的 symlink() 函数不会抛出任何权限(代码 1314)错误。

当从命令行运行 PHP 或通过 CGI 加载它时,一切都按预期工作:

  • symlink() 能够创建符号链接(symbolic link)(绝对和相对
    目标路径)
  • is_link() 为符号链接(symbolic link)返回 true
  • filetype() 返回符号链接(symbolic link)的“链接”

但是,当我将 PHP 作为 apache 模块运行时,我遇到了各种麻烦:

  • symlink() 只能创建符号链接(symbolic link),当目标是有效的绝对路径时(使用相对路径将抛出:警告:symlink() : 无法获取文件信息(错误 2))
  • is_link() 为符号链接(symbolic link)返回 false
  • filetype() 为符号链接(symbolic link)返回 'file'/'dir'

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

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

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

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

在阅读了关于 thread safety in PHP 的内容之后:

  1. 线程安全与此有什么关系吗?

我可以看出 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>

最佳答案

symlink() is only able to create symbolic links, when target is a valid absolute path (using relative paths will throw: Warning: symlink(): Could not fetch file information(error 2))

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

is_link() returns false for symbolic links

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

  • Windows 7 x64
  • XAMPP 1.8.3
  • PHP 5.5.11

What is the difference between loading PHP as a module and through CGI and how could that relate to this matter?

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

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

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

关于php - 如何使 Windows 符号链接(symbolic link)与 mod_php 一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26600247/

相关文章:

javascript - 使用新 URL 打开模式弹出 div(如 Instagram)

php - 如何以人类可读的格式输出(到日志)多级数组?

python - Windows 上的扭曲 stdio.StandardIO

windows - 从多个文件中删除行

php - BinaryFileResponse 上的 session 丢弃安全 token

apache - 同时使用 ProxyPass 和 JkMount

php - Laravel 如何从非主键创建外键约束

php - MySQL 存储过程变量

c++ - 地址的奇怪错误

apache - 远程 apache httpd 服务器的 SSL 握手问题,在本地工作