Gea-Suan Lin's BLOG for Work

Friday, April 11, 2008

用 MySQL connect timeout 處理 DB failover 以及 load sharing

程式碼大約是這樣:
function foo(array $db_srvs)
{
// $db_srvs 是簡單的 array('db1', 'db2', 'db3') 即可
shuffle($db_srvs);
ini_set('mysql.connect_timeout', 1);
foreach ($db_srvs as $h) {
$db = @mysql_connect($db_srvs, $user, $pass, $dbname);
if ($db)
return $db;
}
return NULL;
}

當然還是要有其他的 monitoring software 去盯 MySQL server,不然會有很多連線會卡一秒鐘...

Tuesday, April 08, 2008

用 rsync 同步程式碼

如標題所寫的,用 rsync 同步程式碼。

我的打算是用 Subversion 更新,然後用 post-commit 把程式碼推出去,配合 --exclude 的參數去掉 .svn/ 的目錄。

Monday, April 07, 2008

KISS

好的架構會保持 KISS principle

Zend Framework 裡 Zend_Controller 的 module

現在還在想要怎麼處理這個部份,如果全部塞 default module,那麼事情都很簡單,但是 Controller 檔案就會很大,撇開效能問題,管理上也是一個大問題。

如果使用 module 拆開,那麼 controllers/models/views 都會拆開,controllers 本身是小問題,但 models 必須逐個加到 include_path 裡 (參考「缺乏 Model 支援的 Zend Framework」這篇的方法),而且 views 的部份就沒有比較好的方法共用 (像是我寫了一個 forwardurl.phtml,以非 30x Redirect 的方式重導)。

應該會用後者的方法,不過要想方法把 models 與 views 的問題解決...

有時候很好玩

有台機器叫做 develop,但是大家都沒在上面開發,都跑去一台叫做 testphp 的機器開發,然後上面跑 RoR...

Tuesday, October 30, 2007

FreeBSD 的 mod_extract_forwarded2

一般的 reverse proxy 都不是 reverse NAT,所以 Apache 端必須要做一些處理才能拿到正確的使用者 IP Address,一般都是以 欄位做為判斷的標準,不過這樣的缺點是 PHP 必需要自己判斷。

就是直接把可信任來源的 替代成使用者端的 IP Address,如此一來 的程式不需要改變程式碼,與以前一樣只需要用 $_SERVER["REMOTE_ADDR"] 就可以取得使用者的 IP Address。

下的 安裝完後其實是有問題的,安裝完後的設定是:
LoadModule extract_forwarded2_module libexec/apache22/mod_extract_forwarded2.so

但應該改成:
LoadModule extract_forwarded_module libexec/apache22/mod_extract_forwarded2.so

然後對 reverse proxy 的 IP Address 設定:
AddAcceptForwarder 10.0.0.100

你可以寫個小程式,從不同 IP Address 帶 X-Forwarded-For 參數,將 $_SERVER["REMOTE_ADDR"] 印出測試看看。

Powered by ScribeFire.

Sunday, October 14, 2007

AMR codec (3gp 在 ffmpeg 裡的支援問題)

剛剛發現,現在想要讓 支援 3gp 已經不需要自己 patch 了,而可以安裝 後直接在 compile 時使用。

Monday, October 01, 2007

PHP 內的 extract()

這陣子在 trace 程式碼的時候發現公司裡面的 Programmer 對於 extract() 的用法似乎不是很熟悉。

以往我們會用 foreach$_POST 的變數複製到全域變數上:
foreach ($_POST as $k => $v)
${"pvar_$k"} = $v;

但實際上 有現成的函數可以用:
extract($_POST, EXTR_PREFIX_ALL, "pvar");
extract($_GET, EXTR_PREFIX_ALL, "gvar");
extract($_COOKIE, EXTR_PREFIX_ALL, "cvar");

這樣就可以用 $pvar_variable 取得 $_POST["variable"] 的值。

Saturday, July 14, 2007

在 DBIx::Class 內的兩項功能

兩個功能,第一個是比較複雜的 SQL query,第二個是自訂函數。

第一個功能是透過 scalar reference 做的,像是想要下:
UPDATE mytable SET viewnum = viewnum + 1 WHERE id = 123;

這樣的指令,那麼就用:
my $element = $c->model('MyDB')->find(123);
$element->update({viewnum => \'viewnum + 1'})

這個問題還蠻常在 的 mailing list 上被問,原因在於這是 的範疇,所以沒仔細看完文件不太會知道這個用法。

第二個功能其實還蠻重要的,因為有些 complex operation 沒辦法放到 Trigger 時得在 Database Library 這層做,其實是個蠻常見的情況,但我找了不少說明文件都沒有提到解法。後來發現其實在 就有提供了,不過因為這個功能還是 EXPERIMENTAL,所以大多數的文件都沒有講。

我建議用自訂函數後要把 的 mailing list 訂起來看,之後的版本可能是以其他方式解決這個問題。