Firefox 的 DNS query (在 PAC 裡)

Brad Fitzpatrick 那邊看到一個疑似 Firefox JS engine 處理 DNS query 時的 bug 造成的 hang:Firefox + PAC considered harmful,在 MozillaBug 235853 裡有完整的說明。

所以自己寫 PAC 的人,一種解決方法是改用 FoxyProxy,另外一種則是暫時把地雷函式暫時改寫?

PS:最近開使用 FoxyProxy,發現對於一些連線的處理上不像以前要手動改 Proxy,方便許多,應該會列入以後重裝時的套件吧...

Firefox over SSH Tunnel

在北京上網時,有些網站會連不上,大多數的情況下可以透過 PuTTY 建 SSH Tunnel,把 HTTP 連線透過 PuTTY 加密就可以了。但是有時候是因為 domain 解出不同的 IP address 而造成連不上,像是 totorogo.dyndns.org。

這時候就要用 about:config 把 network.proxy.socks_remote_dns 改成 true,要求 Firefox 將查詢 DNS 的需求透過 PuTTY 所建出來的 Socks5 Tunnel 送出詢問,目前看起來還蠻正常的,暫時先這樣用看看...

Twitter

最近很少寫 Blog (程式沒寫幾行,倒是一堆行政上面的事情),不過 Twitter 上倒是常常念。

最近忙一些事情,像是寫不完的採購簽呈 (還好有一部分交給 slzzp 了),然後是開不完的會,如果要抽時間寫程式的話,就得在一般人下班後才有空了...

不管怎麼樣,最近看 jnlin 玩,以及我自己玩一些東西,有些有趣的想法,寫下來紀錄起來。

FreeBSD 7.0 的 SCHED_ULE 長期觀察下來 (超過兩個月) 算是相當穩定,這點在目前 PIXNET 的 Web Server 端可以看出來 (在 FreeBSD 跑 apache22 event 是使用 threading,配合 FastCGIPHP),但 gjournalZFS 在效率以及穩定度上都還不堪使用。(指 heavy I/O)

MyISAM 的讀取速度非常快,但不利於大量 Update (因為寫入的動作需要 table lock)。在國外的討論裡,一般都是推薦使用 InnoDB 解決這類 table 的情況,但實際上目前 InnoDB 的備份問題比起 MyISAM 麻煩 (經驗也是一個大問題),這點可能還要再考慮。

要解決 table lock 的問題,另外一種方式是透過拆 table,而且目前看起來拆 table 撐 performance 的方式似乎相當可行 (在概念上,這是一種 HyperDB 的變形),所以最近應該會對這個方向大量研究。不過就得做不少 Denormalize 的事情,還是得累積經驗...

如果有想到其他值得提的事情再寫好了...

Zend_Cache 與 Memcache Backend

Zend_Cache 是我一開始用 Zend Framework 的主因之一,除了包裝的不錯,使用 tag 的概念也讓我很在意:

Caching in Zend Framework is operated by frontends while cache records are stored through backend adapters (File, Sqlite, Memcache...) through a flexible system of IDs and tags. Using those, it is easy to delete specific types of records afterwards (for example: "delete all cache records marked with a given tag").

如果 cache 可以用 tag 處理的話,cache invalidate 的管理上會變得非常的容易。

用 File Backend 測了一下 tag 的功能發現沒什麼問題,但一直想不太出來在 Memcache 上面要怎麼實做 (而且要 atomic),後來實際拿 Memcache Backend 測了以後發現 tag 的功能在 Memcache Backend 上面不支援,翻了翻 source code 也確定了這件事情 XD

最近有人在 mailing list 上提到 memcached-tag 這個子計畫,看起來是有關係的 :p

Zend Framework 中,Zend_Controller 測試時遇到的問題

我有三天的時間卡在 Zend_Controller 的使用問題,不管怎麼用都會丟出 500 Internal Server Error。後來不斷的測試,發現他根本就會動,只是我測試的方法有問題。

先講一下 Zend_Controller 的用法,在引入 Zend_Controller_Front class 後 (方法請參考官方網站的說明):

  • 先用 $ctrl = Zend_Controller_Front::getInstance(); 取得 controller。(跟 I HAVE CONTROL 無關... 看不懂笑點的請參考 CLANNAD 00)
  • $ctrl->setParam('noViewRenderer', TRUE); 將預設啟用的 Renderer Helper 閹掉。
  • 然後用 $ctrl->addControllerDirectory('目錄位置'); 設定 Controller 目錄。
  • 最後用 $ctrl->dispatch(); 開始跑。

然後 controller 的目錄下放 IndexController.php 就會對應 http://host/index 以及 http://host/ (因為 index 是特殊的存在),放 TestController.php 就會對應 http://host/test,這些在官方文件裡都有還算清楚的範例。

我的錯誤是在,我錯誤的使用 GET 的 proxy 模擬 HTTP Request。簡單的說,以下的 HTTP Request 會造成 500:

GET http://test.host.domain/test HTTP/1.1
Host: test.host.domain

但這個不會:

GET /test HTTP/1.1
Host: test.host.domain

而我用 libwww-perl 內附的 GET 這個「指令」測試:

GET -SUe -p http://test.host.domain:80/ http://test.host.domain/test

這個指令會送出第一類 HTTP Request,於是就噴了... 就只是這樣的問題而已。

Zend Framework 的一些設定上的想法

開始使用 Zend Framework 後,一些設定上的想法。

首先是 Zend Framework 的引入設定,有些文章會建議放到 php.ini 裡,在 include_path 引入,但我認為比較好的方式是在 index.php 裡引入:

set_include_path(get_include_path() . ':' . dirname(__FILE__) . '/../weblib/ZendFramework-1.5.0PR/library');

如果大家都共用系統的 library,那麼在升級時很有可能會中獎。至於這個指令對於系統效率的部份,我覺得這個東西差不了多少,不需要對此計較,先把時間花在其他地方比較好。

再來是 .htaccess 的部份,Zend 的文件上建議把 css/js 之類的靜態圖檔設定到 Regular Expression 裡分開,我的建議是全部都丟給 index.php,然後靜態圖檔用另外一個 domain 放:

#
RewriteEngine On
RewriteBase /~gslin/zendtest
RewriteRule .* index.php [L]

原因是一開始先稍微規劃,先用一台機器跑 VirtualHost 服務兩個 domain,之後長大了才容易拆開。當靜態圖檔的量大到會影響動態的部份時,抽出來用 lighttpd 吐。

然後,既然都用了 Framework 這種東西,APC 之類的 opcode accelerator 一定要裝,不然速度會很慢。另外 APC 預設 30MB 的 cache 可能會不夠用,調大一點會比較好。

Apache 一定要用 FastCGIPHP 抽出來跑,不要用 mod_php5 的模式跑。這樣 Apache 就可以用 event 或是其他 threading MPM 執行,對於效率會有很大的改善,我在去年年底有寫過:Apache 2.2 的 MPM Event

基本上效率不要太斤斤計較,因為很有機會一個 SQL slow query 的改善,就可以大幅度改善整體的效率。現在一台看起來還算暴力的 x86-64 1U 伺服器不用 100k 就有一台 (雙四核心 Xeon 加上 12GB RAM 與 SCSI*2),把人力時間花在開發上面比較實際...

Zend Framework

這幾天除了在寫簽呈外,其他大多數的時間都在玩 Zend Framework

Zend Framework 與其他的 Framework 有個很大的地方不同,他所有的套件都是可以拆開來用的,也因為如此,有許多人覺得 Zend Framework 其實只是另外一套 PEAR 而提出批評。不過我後來對於這些想法看的比較開了,只要會抓貓的都是好老鼠... (XD)

文件如同 PHP 的慣例都蠻齊全的,在文件裡就有很多 sample code,大多數測試一下就可以用了。

不過我自己在測 Zend_Controller 的時候卡住,用了三天時間還是解決不了,最終在學弟給的 sample code 比較後找到問題,希望以後開發速度可以快很多...

Amazon S3 服務中斷兩個小時

Amazon S3 服務中斷兩個小時:Crash: Amazon's S3 utility goes down,在服務中斷的兩個小時內有大量的 500 回應。

有很多服務受到影響,國內比較有感覺的應該是 Twitter 的 Profile 圖片 (他們沒有用 Proxy Server 快取一層,而直接從 Amazon S3 吐圖還蠻讓人意外的),另外 WordPress.com 應該也受到影響 (不過他們有用 Proxy Server,熱門檔案應該沒有受到影響)。

這兩天應該會看到 Amazon 的公告。

Update:比較詳細的原因出來了,這篇被認為是官方的說明,解釋為某種 DDoS 攻擊造成認證系統超載:Re: Massive (500) Internal Server Error.outage started 35 minutes ago