寫 The Paradiso – iCards 程式筆記 Part I

The Paradiso – iCards 寄出後, 要做個每張卡片寄出的統計. 我就直接以每個檔名為 key. 每寄一次累加次數. 這當然可以寫到資料庫. 但是, 我個人認為寫到檔案就很好用了.所以就想把記憶體內的 array 資料寫到檔案. 等要做統計的時候, 透過檔案再把記憶體的 array 還原. 所以用到 serialize() 和 unserialize() 兩個 functions. 還算滿簡單使用的.

Pseudo Code 如下 :

如果計數檔案存在 {
    把計數檔案還原成 array.
    如果要累加的 key 存在 {
        就再加 1
    } 否則 {
        設定該累加的 key 為 1
    }
    再把記憶體的 array 儲存至檔案
} 否則 {
    建立計數檔案
}

程式碼如下 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// hit counters
if (file_exists($counterfile)) {
    $counter = unserialize(file_get_contents($counterfile));
    if (array_key_exists($imgname, $counter)) {
        $counter[$imgname]++;
    } else {
        $counter[$imgname] = 1;
    }
    $fp = fopen($counterfile, "w+") or die("I could not open $counterfile.");
    fwrite($fp, serialize($counter));
    fclose($fp);
} else {
    $counter = array();
    $counter[$imgname] = 1;
    $fp = fopen($counterfile, "w+") or die("I could not open $counterfile.");
    fwrite($fp, serialize($counter));
    fclose($fp);
}

被儲存的 array 會長得像下列模樣 :

a:7:{s:12:”DSC06375.jpg”;i:1;s:12:”DSC03007.jpg”;i:2;s:12:”IMGP1645.jpg”;i:3;s:12:”DSC06291.jpg”;i:5;s:12:”DSCF0201.jpg”;i:1;s:12:”DSC05590.jpg”;i:1;s:12:”DSC07558.jpg”;i:1;}[

在上面的例子, 可以清楚的知道serialize() 和 unserialize() 可以省去很多麻煩. 且相當實用. 這個小功能實作後就可以衍生出 top 10, top 20 的小功能. (待續)…