PHP公告系統

網誌一定都有時間性,程式也一定有Bug,就算沒Bug,人類慾望無窮,會一直加入/補強功能,不然夾不死也不用連出四代iOS,如果想追蹤最新的版本資訊,在我把整隻程式丟到Google Project Hosting之前,請按下以下連結追蹤,當然skydrive上的一定是最新版的,然後我也一定不會保留舊版的程式碼XD
請按此:https://kelunyang.wordpress.com/tag/php%E5%85%AC%E5%91%8A%E7%B3%BB%E7%B5%B1/

繼一年前慘遭陳大光荼毒,寫完PHP問卷系統之後,我又再度為元智大學(?!)做出了貢獻,不知道徐總裁可不可以因為這樣送我一台N97(誤

嗯,那如同標題所示,這隻程式就是一個公告系統,又根據陳大光的要求,這隻程式不可以使用資料庫,因此全部都是XML和檔案系統混和操作的XML Database,當然這會有缺點的

  • 程式名稱:PHP公告系統
  • 版本號:目前已經釋出算1.0版XD
  • 釋出日期:2009/10/03

這支程式最主要的功能就是發布公告,目前實際上會把他用在陳大光打工的單位裡,我自己的目的是要補足我一直想在暑假設計的架站機模組,這算第一步吧,接下來希望有時間還可以做相簿系統(為什麼不用現成的?因為不喜歡,好啦我也會參考現成的架構XD),有幾項功能是我在建構的時候主要考慮的

  • 必須使用XML和檔案系統當作資料庫,不使用任何資料庫系統,但是必須要保留擴充性(如果這是你的需求,那你找到了XD)
  • 反應速度要快
  • 主程式要小
  • 要建構在MVC Pattern上,View端和Controller鬆綁,全部依靠JSON或者是在PHP裡作curl/file_get_content解決
  • View端的非管理功能要用HTML建構,因為這樣比較能和早期的系統混合
  • 輸出成Word 2003 XML的電子檔和直接用zip打包附件下載

要下載的人請點下圖,抱歉Skydrive的內崁功能好像關掉了,這張圖不是很好看,要試用的人請到這裡:http://www.pavilion-gift.com.tw/XMLBulletin/(點右上角的「登入管理畫面」之後使用guest登入,帳號密碼同)
image

跳轉後看功能介紹和開發心得

首先,有幾個部分是會做補強的,也就是這個版本沒有的部分(這個版本是給單純一個學校單位使用,因此缺少某些部分並不會影響使用)

  • 權限控管(目前所有的使用者權限都是一樣的)
  • Flash大量上傳模組
  • MySQL的Model
  • 非Ajax版本的控制功能
  • 「搜尋公告」
  • 針對個別公告下「tag」
  • 子單位

開發經驗

我知道世界上有一套公告系統叫做Ann(http://26.to/nextime/,這個站好像死掉了?),和我之前寫的問卷系統一樣,他是戴興能先生的作品,Ann被廣泛的用在台灣各大機關學校這我也知道,因為敝校中崙高中之前也是用戶之一XD(也有很多學校買了網站系統之後就拋棄Ann了,還有些人是用Dreamweaver快速產生公告系統的,這自然不在話下),不過因為一些特殊的要求,因此我放棄了這個解決方案

這隻程式非常遵守MVC Pattern,所以一切都是依靠OO原則運作,這個好處是我開發的速度會比較快,以後維護也容易,請看系統架構圖XD(其實MVC模式在web中廣泛的被使用,但是一般的開發往往會忽略),另外這支程式使用的framework也會被運用在問卷系統的改版中
image

雖然這樣講,我也沒有用目前常見的任何framework作,大概是我很堅持自己動手吧,不過如果你看懂了這張圖,就可以發現要把這個系統改到SQL上非常輕鬆容易,只要在model端寫好對應的函式就搞定了

早期的MVC架構,像是Smarty就很依賴版型引擎,但是我自己很討厭那樣子,基本上PHP就是一套排版引擎,所以在設計的時候應該有辦法繞過去把HTML和PHP混成一坨的窘境(從高一開始寫PHP到現在我真的很厭惡PHP和HTML混在一坨,就算有好的編輯器還是很難看),Ajax提供了一個機會,controller只需要回傳JSON,剩下交給JavaScript,這樣的好處是哪天我想改寫一個Silverlight版本時,非常容易移植,不過這造成admin.php有將近八百行的JavaScript…(其實是我懶,把全部功能都寫到同一頁去XD)

然後這隻程式因為陳大光的需求,所以放棄了SQL資料庫,全部採用XML Database,我覺得這個有好有壞,好處是我被迫好好想該怎麼規劃資料庫,因為沒有MySQL幫我做select的動作,壞處是我要是寫的演算法不好,讀入資料的速度會比靠MySQL慢,這算一個危機,因此我也沒有開發搜尋功能,不然實在太浪費效能了(實在很難想像要是大量讀入XML作成DOM tree會佔掉多少記憶體,雖然預計部屬的機器聽說是Xeon的機器)

XML資料庫的另外一個缺點是他等於拿檔案系統來當作資料庫,一般資料庫都會有交易功能(Transaction),可以避免同時寫入讀取造成的錯誤(這也是ACID原則),但是檔案系統不可能擁有這一點,最簡單的說,PHP是被HTTP Server呼叫的,每一個PHP process都是獨立的,所以他們彼此把XML載入記憶體,再修改存檔的話就糟糕了@@"(我跟大光本來說該用Java或是其他語言實作一套保護介面,但是這不等於是檔案型資料庫嗎,那我拿SQLite不就好了嗎…Orz)

然後這隻程式中我自己也寫了一套JavaScript的API,所以很多元件長的都很像,這是因為我都是用呼叫的,開發這串API還讓我學到不少的,比如說暑假看Design Pattern沒想到工廠方法和靜態工廠方法可以幹嘛,在作xmlhttprequest的時候就可以用上了(雖然JavaScript基本上沒有OO支援,不過也可以將就啦!)

其他大概就這樣了,目前系統可以正常的運作所以也算是正常,不過PHP對OO的支援真的很低,連多載都沒有,或許有機會改用ASP或其他語言吧XD

功能介紹

其實說真的這是一套非常簡單的公告系統,就功能來說還蠻單純的,不過後台有大量的Ajax,請注意使用時要打開JavaScript,然後要是您對於版面不滿意,請更改CSS資料夾內的檔案,或者你可以重寫一個View,科科

首先是疑難排解,遇到以下錯誤一定無法使用,而且這支程式一定不能自己從這個錯誤中修復

image
假設,在執行安裝程式(或者其他網頁)時你看到這一行錯誤,那就請到php.ini中打開allow_url_fopen(http://us2.php.net/manual/en/filesystem.configuration.php
image
列表應該了無新意,這個是提供打包下載和列印版本下載的功能,不可諱言,輸出成WordXML不是一個好點子,或許該輸出成PDF

image
這個是我最愛的一項功能,因為xmlhttprequest用Command Pattern包裝起來,在做成一個static factory之後,每一項動作完成就可以再叫系統去拿「系統記錄」這個method,所以還蠻好玩的,雖然目前寫的字沒啥意義XD

image
在重新參考Linux的sudo之後,這個登入視窗就寫完了,只要發生auth fail這個exception,javascript會馬上中斷目前的動作,交給登入視窗處理,當然要知道到底有沒有登入逾時或是以登出來賴著不走,是依靠後端的session判斷的

image
泡泡,這又是一項最近寫完的JavaScript API了XD

image
上傳模組又是一項好玩的設計,本來我也不知道上傳可以不用換頁,結果查了資料(http://www.josephjiang.com/prototype/ajax-uploader/demo.html)之後發現用header 204 no-content就可以讓瀏覽器停止換頁,便可以達到一個流暢的效果,不過本人不大愛這種上傳,比較好的解法還是應該透過Flash,問題是出在PHP根本不知道自己上傳了多少size,新版的PHP 5.2據說掛上APC就可以抓上傳進度(http://www.ibm.com/developerworks/library/os-php-v525/index.html),問題是出在誰會打開APC呢?也有些人建議乾脆自己寫一個簡單的socket來處理,那不等於做一個http setver嗎,因此這部分還需要思考一下XD

image
全域單位,這又是一個比較有意思的功能,因為公告中真的會需要一個可以跨單位的公告(比如說「全校」等級),但是如果可以隨意下tag,就會出現組合數C的(單位總數)取(單位總數+1)種這麼多的數量,效能上可能會比較差,目前的處理是先建立一個單位,把他設定成是「全域」,他的公告就會自動port到大家的公告區塊裡,我也很希望可以用tag解,那這就等我想出來該怎麼做再說XD

另外,感謝陳大光提供備份指令,這套系統目前使用XML資料庫,因此備份當然不能靠MySQL,所以主要要備份的是bulletins和data,這個指令剛好都包含了,應該會蠻有用的XD

其他大概就這樣了,要使用的人就歡迎下載囉XD

對「PHP公告系統」的一則回應

  1. 這系統如果有什麼好的,就只是架構可能比較清楚而已,其實我演算法都寫得很簡單,效率應該不會好到哪,也沒什麼厲害的啦XD
    不過歡迎試用之後發表建議和心得喔XD

  2. 按照"安裝前請先讀我"之內容指示
    下載好檔案解壓縮按了網址打開首頁
    結果都是空白的頁面
    沒有任何畫面

  3. 按照"安裝前請先讀我"之內容指示
    下載好檔案解壓縮按了網址打開首頁
    結果都是空白的頁面
    沒有任何畫面
    請問是什麼問題

  4. 抱歉這個晚才回覆您
    請問您的HTTP伺服器(Apache、IIS或其他的)版本是什麼呢?然後PHP的版本是?(然後您有測試過可以跑其他的PHP網頁嗎?例如開一張空白的文字文件,輸入再到瀏覽器裡去看這張網頁會出現什麼呢?)
    另外可以麻煩您進入首頁之後,打開HTTP伺服器的errorlog,例如在Apache是httpd-error.log,可以寄到kelunyang@gmail.com給我看看錯誤是什麼嗎?

發表留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料