FreeBSD 的 php5-5.2.12 掛掉的原因

從上一篇FreeBSD 的 lang/php5 (5.2.11) 是壞的寫完到現在也過了一段時間了,
漸漸的網路上終於看到有些人開始關注,
但是數量其實不多,
因為這個災情有限定對象:
1. 要用 FreeBSD 才會遇到。
2. apache 要用 MPM=prefork 以外的狀況才會遇到;也就是 php 在 thread safety 是 enabled 的狀態下才會發生。

這類災情最明顯的狀況就是 php -v 打下去就出現 segmentation fault,
不過事實上也是有分兩類災情。

第一類災情不限定於 FreeBSD,
也是早就已經解決的問題。
這類災情的狀況是 php -v 一打下去什麼字都沒出現就直接出現 segmentation fault,
原因是因為裝了 php5-recode 這個 extension,
但沒有在 /usr/local/etc/php/extensions.ini 裡擺好它的位置
問題的發生原因和解決方法在這都有提到了:
http://www.php.net/manual/en/recode.installation.php
簡單說就是把 extension=recode.so 這行用力往上搬吧。
雖然說要這樣做的理由其實很讓人想笑,
但在網路環境裡一堆人各自寫自己的東西就難免會發生這種事,
把它當成借鏡就好。
遇到這類問題的人通常連 apache 都開不起來,
所以願意認真去解決的人其實不少。

第二類災情才是本篇的正題,
輸入 php -v 以後會很歡樂的出現你預期會有的版本資訊,
接著就以迅雷不及掩耳的速度很悽慘的當了:

PHP 5.2.12 (cli) (built: Feb 26 2010 03:19:05)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
Segmentation fault (core dumped)

這個問題會影響到 CLI 跟 CGI,
不過對掛著 mod_php5 跑的 apache 並不會有任何影響,
所以無視它的人就相對的多。
然而現在也漸漸的引起了一些人的關注:
http://forums.freebsd.org/showthread.php?t=8965
並做了 send-pr:
http://www.freebsd.org/cgi/query-pr.cgi?pr=141226

簡單說他們發現有人亂寫了 /usr/ports/textproc/libxml2/files/patch-configure 這個檔案,
造成編出來的 libxml2 不是 thread-safe 的,
解決方法就是把那個檔裡的最下面這段直接砍了就好了:

請特別注意,
那個 send-pr 雖然已經被 close 掉並說已經 resolved 了,
不過那個是假象。
正如前面所說,
要遇到這問題需要相當特定的環境,
所以請勿相信這個人說的話:

From: olli hauer
Date: Sat, 23 Jan 2010 18:29:22 +0100
Please close the PR it seems the issues are solved.

At least I have no issues in combination of libxml2, php, postgres.

Thanks
olli

要是相信他你絕對會後悔

所以目前遇到這個問題請自力救濟去砍了那段 patch 吧,
不然就是上 mailing list 或 bug tracker 去戰了,
對於把已經 close 掉的 pr 再 open 起來戰的遊戲我玩得很累,
就留給有心的人去戰吧。