接續
我前天說到我要找時間查查到底是什麼原因造成PHP
的Segmentation Fault
,我想本篇文章的標題已經指名原因了,那我就結束這回合。
當然我還是在這邊紀錄一下流程以及解決方法,然後在除錯的過程中還順便解了一個PHPBrew
的Bug
,這個Bug
就是關於./configure
找不到libpcre(.a|.so)
的問題,原因是出在於系統架構的判斷。
先不管這個,我之前說過只要preg_match()
只要輸入的字串一長就會發生錯誤,所以我們朝PCRE Library
進行。
觀察 ./configure 設定配置
我找了一個之前編譯的正常PHP
所使用的配置,現在有問題的配置做比對。其中發現PCRE
的設定方式不相同。
舊的配置關於PCRE
的部份只有--with-pcre-regex
,而新的配置則是--with-pcre-regex=/usr --with-pcre-dir=/usr
。
新的--with-pcre-regex=/usr
其實不影響執行,真正有問題的部份出在於--with-pcre-regex
與--with-pcre-regex=/usr
的對於實際編時所引入的函式庫不同。
--with-pcre-regex
所代表的是編譯時引入PHP
內建的PCRE
函式庫,而--with-pcre-regex=/usr
所代表的是引入外部的PCRE
函式庫。
造成的原因是因為PHPBrew
的版次問題所造成,它會檢查系統中是否已經有PCRE
函式庫,如果已經存在就會自動在--with-pcre-regex
後面加上prefix
。
使用不同的函式庫
為了要測試原因是否是系統內建的問題,或者是只要引入外部PCRE
就會出錯,所以我就另外編譯了新的PCRE
函式庫作為測試。
- PCRE版本
- 8.31-2
Ubuntu 13.10
內建 - 8.32
PHP 5.4.25
內建 - 8.34 自行編譯最新版
- 8.31-2
編譯過程我就省略,PHP 5.4.25
以及自行編譯的PCRE
都可以正常執行。最後結果就是系統內建的PCRE
有問題,並且連帶系統內建的PHP 5.5.3
都會出現同樣的問題。
解決方案
雖然不知道內建的PCRE
究竟是哪邊出問題,不過我有兩種解決方法。不是移除系統內建的PCRE
讓PHP
用本身的函式庫,就是使用自行編譯的PCRE
。
下面我就把我的PHPBrew
安裝設定公開出來,因為我是使用自行編譯的PCRE
所以在最後要指定函式庫位置。
phpbrew -d install 5.4.25 +default+db+openssl+iconv -- --with-pcre-regex=/opt/pcre