PHP 控制 QPS (Query Per Second) 的寫法

寫個簡易的範例,如果送出 REQUEST 很頻繁,卻不想把對方打死,可以控制一下 QPS ,單位是毫秒。

WTF 系列 – PHP 的 Array Concatenate

這篇文章放在草稿好久了,今天抽空把他寫完。

PHP 的 Array Concatenate 有兩個方法一個是用 array_merge 另一個是用運算子 + (array union operator)

array_merge 可以把兩個 array 合併起來,但是行為需要注意,

array_merge($a, $b)

當 array 被當作 map 使用時,他的 key 是字串或是數字處理起來結果不同。

當 key 是字串:會把 $a 附加在 $b 的最尾端。如果 $a 和 $b 有相同的 key 的話,後者會覆蓋掉前者的值

當 key 是整數:不會覆蓋,而是 array 當成 list 處理 而不是 map 處理。

結論:如果你預期 PHP 的 Array 是個 MAP ,那應該用字串當 Key ,不要用數字或是其他東西當 Key ,避免非預期的行為發生。

另外,還有 + 這個 array union operator 。 如果你不想重複 key 對應的 value 被複寫 (當 array 是 map),或是 array 被 re-index (當 array 是 list) ,就要用 + 。

結論:因為 PHP 的 Array 可以是 list 也可以 map ,所以在 Array 操作上要特別小心。

IMGUPUP – A simple PHP image uploader

介紹一個我寫的開放原始碼專案:IMGUPUP

原本我只是想寫個 script 支援圖片上傳而已,但不小心越寫越大,於是最終就變成一個相簿了。目前功能很弱,畢竟開發目的主要是滿足合我自己需求,所以如果你也有用,而且想要新功能,歡迎在 github 的 issue 提出,當然也歡迎送 PR 過來。


我從 Gallery 2 的時代就開始用它當成我的相簿,差不多六年前升級到 Gallery 3 ,為了和 Gallery 2 向下相容,我還寫了一個外掛 (連結一) 。當時管理的照片數量差不多是五千多張。不過 Gallery 3 有幾個很討厭的問題:

1. 相片和相簿的網址是根據階層關係決定的,舉例來說:相簿的網址會像是這樣: http://host/相本A/相本B/ ,而相片的網址也繼承了這個概念,於是就更長了。

2. 檔案實際存放的路徑也是根據階層關係決定的。相簿的階層直接對到實體路徑的階層。

3. 為了 SEO 的緣故,會拿相片/相簿的標題來當網址

以上三者的設計對於一般人來說或許很親切,但對我來說非常痛苦,因為我很喜歡把相簿搬來搬去,或是重新分類。而在這個過程中,所有網址都會改變,但這不是我所希望的,因為相片網址一改,我文章裡面的連結就得跟著改,然後就…

有鑑於 Gallery 3 有以上缺點,且 Gallery 3 實在有太多我用不到的功能,所以我就自己動手寫了一個新相簿,初期開發的功能很單純:

1. 照片有 permalink ,檔名是亂數產生的,網址不考慮 SEO 所以網址會像是這樣: http://host/kjaJd.jpg ,如此一來我相簿怎麼搬怎麼分類都和相片無關

2. 還是有相簿功能,但目前相簿不分階層

3. 登入登出功能。

4. 大量上傳功能 / 根據 URL 擷取遠端圖片。

Framework 我採用 CodeIgniter 3.X 因為這套 Framework 很好用,而且我沒空學 survey 新的。程式碼放在 GITHUB 上面 (連結二)

整個寫好大概斷斷續續花了我一至兩週的時間 (畢竟我還要打電動和看影集) ,如果有建議也歡迎和我分享。

連結一:Gallery3 轉換筆記

連結二:https://github.com/roga/imgupup/

PHP 在 callback function 使用超過一個以上的變數

這個問題在 PHP 5.3 非常好解決,因為有 anonymous function 可以用,但如果環境還停留在較早以前的 PHP 的話,可以用以下解法

workaround:

anonymous function: