2013年1月29日 星期二

pecl-solr

pecl-solr 是一個 php 的 extension, 用 curl & libxml2 處理從 solr 吐回來的資料,
資料的格式可能是 xml, json 或是 serialize 過的 php array string.


這幾天在看 freebsd 的 pr, 發現寫 pecl-solr 的這群人非常的天才,
即使他們全部都有 @php.net 的帳號.


首先, 用 curl 去 solr 拉 search result, 如果格式是 xml 的話,
再用 libxml2 處理 search result, 轉成 php array.
(以上都是在 extension 裡面呼叫, 所以都是用到 c 的 function)


但是 build 出來的 solr.so 並沒有 link 到 libcurl & libxml2.
往上追到 Makefile, 發現根本沒有 "-lcurl -lxml2" 等 keyword,

Makefile 是透過 configure 產出的,
那是不是 configure 的時候出了什麼問題?

也不是, config.log 怎樣看都是對的,
有抓到 curl & libxml2 的 library & header file, 判斷都是對的.

configure 是透過 phpize 讀取 config.m4 產生的.
那 config.m4 有沒有問題?

config.m4 在 curl 判斷上, 將 -lcurl 的定義放進了 CURL_SHARED_LIBADD

最後會用 PHP_SUBST 來把要 link 的 library 放進 Makefile 裡面,
但是他的 config.m4 裡面是這樣的.

PHP_SUBST(SOAP_SHARED_LIBADD)

你明明是 solr extension, 為什麼要用 SOAP 這名字?
並且為什麼上面寫的是 CURL_SHARED_LIBADD,

第一, 名字寫錯了, 第二, 就算寫錯, 兩個寫的一樣也是兜的起來,

這樣怎麼可能會去 link 到對的 library?


然後又發現 pecl-solr 有一些 unit test, 跑了一下,
錯誤訊息裡面說我沒有裝 php curl extension.

code 怎樣看都是直接 call libcurl 的 c function, 為什麼要我裝 php curl extension?

再繼續看 php_solr.c 發現他在裡面 require 了 php curl & libxml2 extension.


真相大白, 為什麼在 runtime 的時候都不會有問題?

因為很白痴的要求一定要裝 php curl & libxml2, 所以不會發生 undefined symbol 的問題,

但是這不是脫褲子放屁嗎?


php-curl 大家用得比較多, 但是 php-libxml2 在我所知道的人裡面, 很少人直接 call 這個,
pecl-solr 只是直接 call c function, 為什麼要 require php-libxml2 extension?

沒有留言: