2017年10月8日 星期日

在 Windows Server 2003 安裝 PHP 5.6.24

在微軟的支持下,PHP 可以在 Windows 的平台上,順利且有效率的運作。其中,包括 fastcgi、sqlsrv、及 wincache 等,是由微軟所支持提供的。

但我個人猜測,也是在微軟的干預下,以 Windows Server 2003 及 Windows XP 推出已超過 10 年為理由,決定從 PHP 5.5 開始,不再支持這兩個 OS。因此在這兩個廣泛使用的 OS 上,就無法安裝執行新版的 PHP,只能繼續堅守 PHP 5.4 以前的版本了。

Windows Server 2003,和 2008 以後的 OS 比起來,只需要較小的硬碟空間,在 VM 上安裝執行,非常據有優勢。因此,直到目前 (2017年) 我們還是繼續堅守著 2003。

每過一段時間,我就會在網路上搜尋,是否有在 Windows Server 2003 安裝 PHP 5.6 的可能性。直到最近,才在 Stack Overflow 上找到一段問答,How to install PHP 5.5 on WinXp 。在這討論裡,也是常見的,已經停止支援等等的話,但有一小段不小心就會遺漏的留言
But there is an unofficial build of PHP 5.6 at http://www.apachelounge.com/viewtopic.php?t=6334
這真是讓人興奮的話。到這時才知道,已有人重新修補編譯 PHP 5.6.4,讓它可以在 2003/XP 上執行,雖然,特別提醒的那一句話 "Play with it, do not use in in production ... " 讓人很不安心,但終究是有了可能性。

後來,在 github 上,也找到有人說明修補和編譯的作法,ProgerXP/php-5.6-xp。也照著做了,不過,後來搞清楚那是針對 Apache 的作法,也就是編出來是 thread-safe 的執行檔。但是,在 cgi 模式下,要用 non-thread-safe 的作法,才能有較好的效率,因此,也就放棄了。

很幸運的,後來找到一個中文的網頁,PHP 7 and PHP 5.6 for Windows XP/2003。它只是建立了一個 nonxp.dll,再修改 exe 和 dll 的相關資訊,讓它可以在 2003/XP 上執行。

雖然,它也改了 PHP 7.0,讓它可以在 2003/XP 上執行,但是可以使用的 sqlsrv driver 只有到 PHP 5.6,請參考 Unofficial Microsoft SQL Server Driver for PHP (sqlsrv),所以,我只有使用 PHP 5.6 這個版本。安裝後,稍微比較了一下效能,PHP 5.6 的效能大約是 PHP 5.4 的兩倍,的確很吸引人。

目前,我在其中一部 Windows 2003 的伺服器上,使用修改過的 PHP 5.6.24,等一段時間後,確認沒有問題,再全面改用。有空,也要看一下 nonxp 的原始碼,針對用到其中的function 的功能,加以測試,以確認一切是正常的,用起來才會安心。

GitHub 上的原始碼

在取得 nonxp.dll 的原作者的同意後,已將 nonxp.dll 及 補丁工具的程式上傳 github: php-5.6-xp-2003

碰到的錯誤

採用 nonxp.dll 的作法,版本 PHP-5.6.24,使用 fastcgi 模式,送出 header('Content-Type: application/javascript'); 時,會產生 IIS 500 的錯誤。但是,讓人懊惱的是,有時會連續出錯,有時又很正常。對了,只要動到 Laravel 5.0 的 routes.php,就會一直出錯,這個檔到底用到了什麼功能,以致於如此? 再試用 Apache Lounge 的討論區的 Jan-E 所改的 PHP-5.6.4,一樣也會有此問題。再切回 PHP 5.4 就完全沒問題。

後來猜測可能是 Laravel 5.0 中的某些部分,在 PHP-5.6.24 下,會出錯。例如 nette/tracy
在 PHP 5.4 和 Laravel 5.0 下,可以安裝,但不能正常運作。

再次測試,把應用程式,搬到 Laravel 5.1 下,看起來,能正常運作,不會一直出現 IIS 500 的錯誤,再持續觀察吧。

沒有留言: