2014-10-28 73 views
4

我想在PHP中使用Windows 7上的符號鏈接。我使用Apache 2.4.10和PHP 5.5.15從普通用戶帳戶(非管理員)運行XAMPP。正如Symlink is not working in my local machine中建議的那樣,我設置了正確的權限以供我的用戶創建符號鏈接。這工作正常,我可以在沒有提升的情況下從命令行創建符號鏈接(mklink ...)。 PHP的symlink()函數不會拋出任何權限(代碼1314)錯誤。如何使Windows符號鏈接與mod_php一起使用?

當命令行或通過CGI一切加載它運行PHP按預期工作:

  • symlink()能夠創建符號鏈接(絕對和相對
    目標路徑)
  • is_link()返回true符號鏈接
  • filetype()返回 '鏈接' 的符號鏈接

然而,當我運行PHP作爲Apache模塊,我遇到各種各樣的麻煩:

  • symlink()只能夠創建符號鏈接,當目標是有效絕對路徑(使用相對路徑會拋出:Warning: symlink(): Could not fetch file information(error 2)
  • is_link()回報符號鏈接
  • filetype()回報'文件'/ '目錄'符號鏈接

這似乎與PHP symlink() fails on Windows 7有關,但該錯誤在PHP 5.4中修復,而我使用的是5.5。另外PHP是報告錯誤代碼2,不3.

除了我的主要問題(「?如何使這項工作」),我在尋找答案,以下幾個問題:

  1. 這是PHP(或Apache?)中的另一個bug嗎?

  2. 將PHP作爲一個模塊加載並通過CGI與這種情況有什麼關係?

和閱讀thread safety in PHP後:

  • 可以線程安全有什麼關係呢?
  • 我可以告訴大家,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> 
    

    回答

    0

    符號鏈接()只能夠創建符號鏈接,當目標是有效的絕對路徑(使用相對路徑會拋出:警告:符號鏈接():無法獲取文件信息(錯誤2))

    這是由於PHP以下錯誤:

    is_link()的符號鏈接

    返回false我已經注意到了同樣的事情,至少在我的當前設置。當PHP作爲Apache模塊而不是通過CGI運行時,對於任何符號鏈接,is_link函數始終返回false。我的設置是:

    • Windows 7的64位
    • XAMPP 1.8.3
    • PHP 5.5.11

    是什麼作爲一個模塊並通過CGI以及如何加載PHP之間的區別這可能與這件事有關嗎?

    通過CGI運行PHP的優點是,每個PHP進程都可以在不同的用戶下運行,而不是僅運行Apache的用戶運行。這對於高效的服務器環境非常有用,因此每個網站不需要具有相同的訪問權限。但是,通過CGI運行PHP也要慢得多。將它作爲模塊運行始終是最快的選擇。

    通過運行PHP FastCGI緩解了大多數情況下的性能下降,但它仍然比作爲模塊運行慢一點。

    至於爲什麼這些問題與is_link(和filetype)發生時運行PHP作爲一個模塊,我不知道。