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?
2013年1月29日 星期二
2013年1月9日 星期三
工程師想要什麼?
我們組最近有個需求, 想要監控 mysql 各個 table 的 row size,
直接讓某台 cron 機器, 開 mysql connection 到各台 mysql 讀 INFORMATION_SCHEMA 是最直覺的,
也有同事說, 讓 mysql server 自己讀自己的 INFORMATION_SCHEMA,
讓別人透過 http 來讀 json 就好, 但是這樣可能就得跑一下 apache 之類的.
後來我研究了一下, 公司內部本來就有一個 package, 可以透過 http 提供 mysql 各項的 metrics,
原本想要稍微修改這個 package, 讓我們想要提供的資料可以套用進去,
更深入研究之後, 發現這個 package 的 desc 寫著 mysql status framework,
Framework 唷, 真厲害, 而他真的就是一套用 perl 寫的簡單 framework,
用了 AnyEvent::HTTPD 做前端, 用了內部的 dbm 當 storage,
只要繼承他的 perl module, 寫一些 callback function,
就可以把怎樣搜集資料, 以及 http handler 都搞定,
立馬就寫了一下, 大概不到一百行就搞定我們要的功能,
也不會有 performance impact,
因為往 mysql 的 query 都不是即時的,
是透過 collector 每多久查一下, 寫到 storage,
前端的 AnyEvent::HTTPD 收到 request, 往 storage 查, 馬上就吐出去.
簡單, 好用, 又讓我覺得很爽.
工程師想要的是什麼? 就是這種偶然遇到的小 hack 得到的喜悅呀.
直接讓某台 cron 機器, 開 mysql connection 到各台 mysql 讀 INFORMATION_SCHEMA 是最直覺的,
也有同事說, 讓 mysql server 自己讀自己的 INFORMATION_SCHEMA,
讓別人透過 http 來讀 json 就好, 但是這樣可能就得跑一下 apache 之類的.
後來我研究了一下, 公司內部本來就有一個 package, 可以透過 http 提供 mysql 各項的 metrics,
原本想要稍微修改這個 package, 讓我們想要提供的資料可以套用進去,
更深入研究之後, 發現這個 package 的 desc 寫著 mysql status framework,
Framework 唷, 真厲害, 而他真的就是一套用 perl 寫的簡單 framework,
用了 AnyEvent::HTTPD 做前端, 用了內部的 dbm 當 storage,
只要繼承他的 perl module, 寫一些 callback function,
就可以把怎樣搜集資料, 以及 http handler 都搞定,
立馬就寫了一下, 大概不到一百行就搞定我們要的功能,
也不會有 performance impact,
因為往 mysql 的 query 都不是即時的,
是透過 collector 每多久查一下, 寫到 storage,
前端的 AnyEvent::HTTPD 收到 request, 往 storage 查, 馬上就吐出去.
簡單, 好用, 又讓我覺得很爽.
工程師想要的是什麼? 就是這種偶然遇到的小 hack 得到的喜悅呀.
訂閱:
文章 (Atom)