2012-03-27 465 views
5

我對Windows Server 2008 R2上的PHP有一個非常惱人的問題。 IIS和Apache在同一臺機器上運行(Apache嵌入了另一個產品,並且這不是我的選擇)。Apache不會加載PHP的MySQL擴展,但IIS不會

IIS配置爲能夠使用PHP的多個版本,並沒有在那裏的PHP版本中已安裝的Windows安裝程序(這樣的php.exe不在路徑存在)。

Apache使用PHP的一個特定版本(5.2.5線程安全的 - 我又不能改變這是一個第三方應用程序對這一版本編譯PHP擴展)。

如果我檢查我的Apache站點中的phpinfo(),它沒有MySQL的條目,即使在php.ini中啓用了php_mysql.dll並且它存在於\ ext目錄中。如果我(暫時)將這個版本的PHP(相同的目錄,相同的php.ini)添加到IIS並使用phpinfo()設置測試網站,它會正確列出MySQL。我知道這不僅是phpinfo的一個奇怪的問題,因爲我有一個基於MySQL的PHP​​網站在Apache中運行,它失敗了Call to undefined function mysql_connect()

有人建議我將libmysql.dll從PHP目錄複製到C:\ Windows \ System32但這沒有什麼區別。由於服務器上有多個PHP版本,我想可能是加載了錯誤版本的libmysql.dll,但PATH不包含任何包含libmysql.dll的目錄。

IIS和Apache正在尋找在完全相同的PHP安裝,php.ini中,和ext目錄,但只有IIS可以加載MySQL擴展。 Apache是​​默認的系統帳戶,因爲它看起來像系統有權訪問所有的DLL。

Apache日誌沒有說明任何DLL無法加載。我在事件日誌中記錄了PHP錯誤,但沒有任何關於這些擴展的報告。

解決這個問題谷歌搜索後,我發現其他突然發生的問題在PHP中的Windows服務器,但通常分辨率上 - 重建php.ini文件,重新啓動IIS,重新啓動服務器 - 並沒有幫助。

任何關於下一步的建議都非常感謝!

+0

您是否檢查到c:\%php_5.2.5_install_path $ \中的dll被複制到C:\ Windows \ System32?例如'libmysql.dll'或'libmhash.dll'。我知道這是Apache + PHP所必需的,不確定是否需要IIS + PHP – JScoobyCed 2012-03-27 02:06:01

+0

@JScoobyCed這聽起來很有希望,但我也有在IIS中工作的PHP 5.3.10,它目前在連接到MySQL時沒有問題。是否存在將5.2.5 DLL複製到System32會對5.3.10產生負面影響的風險? – tomfumb 2012-03-27 16:25:01

+0

如果System32中已經存在5.3.10 DLL,是的,可能會影響PHP 5.3.10 – JScoobyCed 2012-03-28 01:22:36

回答

1

最終,這個問題歸結爲缺少PATH引用。雖然IIS似乎不需要在路徑中存在PHP或PHP模塊,但似乎Apache(或者也許是我的PHP版本)確實存在。我很幸運,因爲我只需要在IIS之外運行一個版本的PHP,因爲我不知道如果我有多個引用不同版本的PHP和路徑中的多個PHP目錄的Apache實例會發生什麼情況 - 可能總會失敗。

到目前爲止,似乎將Apache的PHP版本添加到路徑中並沒有影響PHP的IIS版本,但如果它突然發生,我會大聲發誓。

3

我知道這可能不是最終回答你的問題,但是,你有沒有嘗試配置Apache執行通過FastCGI的(mod_fcgid)PHP,並使用相同的二進制爲IIS呢?

我知道你正在使用mod_php,但通過FastCGI調用它將從Web服務器進程中抽象出PHP。如果擴展在通過FastCGI調用的PHP下正常加載,沒有理由不能在其他Web服務器上工作。

另外,我個人beleive,這是一個好主意,因爲PHP這樣當請求*。PHP文件纔會被調用。這樣,Apache就不會爲每個請求加載內存中的PHP,例如,這會爲您提供更好的服務靜態文件的性能。

更新

要做到這一點,你需要從http://httpd.apache.org/mod_fcgid/下載mod_fcgid,在你的Apache配置加載模塊這樣,

LoadModule fcgid_module modules/mod_fcgid.so 

接着,就指定要什麼二進制在請求PHP頁面時調用:

AddHandler fcgid-script .php 
FcgidWrapper "c:/php/php-cgi.exe" .php 

然後,擴展名爲.php的文件現在是e由PHP FastCGI包裝器執行。只要確保指定與IIS正在使用的相同的php-cgi.exe二進制文件即可。

以前在IIS中可用的所有擴展現在都可以在Apache中使用,因爲後面的PHP安裝在兩個環境中都是相同的。

讓我更新。

+0

感謝您 - 你能給我提示我將如何配置Apache以使用CGI? – tomfumb 2012-03-30 18:27:10

+0

我編輯了我的答案。 – 2012-03-30 18:35:42

+0

非常感謝您的更新。我不能在辦公時間內測試這種變化(PST),所以我會在週末放棄這個變化 – tomfumb 2012-03-30 18:51:10

1

你通常需要爲不同版本的PHP您正在運行不同的庫DLL文件。最好將這些放在自己的目錄中。

有幾個不同的事情可能導致模塊無法加載,包括PHP版本,無論您是運行線程安全還是非線程安全版本,以及如果二進制文件編譯爲VC6或VC9和匕首;。通常,最簡單的調試方法是從命令行運行php.exe,因爲它會吐出任何啓動錯誤(同時確保在php.ini中啓用了這些錯誤,並且您正在加載正確的php。 ini文件,當你這樣做)。

† IIRC VC6/VC9將與Visual Studio PHP的哪個版本一起編譯。

+0

感謝您的建議,如果我以前想過這可能會有所幫助,因爲我應該看到一個錯誤說php_mysql.dll無法找到 – tomfumb 2012-04-04 16:38:01

+0

沒問題,從您的後續答案我可能會建議設置'extension_dir '(或者只是你的php文件夾的目錄名或者文件夾的完整c:\路徑)在你的'php.ini'文件中,而不是使用'PATH'。這些應該是特定於每個PHP實例,並應指向包含該PHP的DLL的目錄。 FWIW'PATH'是分層的,所以Windows將使用包含它所查找文件的列表中的第一個文件夾,如您所說,這將會在運行多個版本的PHP時導致您的問題。 – George 2012-04-10 08:57:29

+0

也供將來參考,這裏有更多的幫助:http://php.net/manual/en/install.windows.extensions.php – George 2012-04-10 08:59:57