寫出健壯的 PHP 應用程式(1): 防禦型程式寫法

Written by Simon Asika on

這幾年無論在帶團隊寫系統,還是自己開發 Opensource,感觸最深的其實是軟體健壯性這一塊。該怎麼描述軟體的健壯性呢,用 國家教育研究所 的定義來看吧,健壯性指的是:

軟體本身的周密程度。即撰寫程式時考慮到各種不同的使用情況,並事先加以定義處理,避免使用時產生錯誤。

關於健壯性

健壯性是一個很廣泛的討論主題,我想我也沒有能力描述的很完全,這裡以我自己本身常遇到的狀況來介紹一些概念,作為拋磚引玉。開發的時候顧及這些概念,可以讓系統出現未預期錯誤的機會降到最低。

這裡的錯誤不單純指系統 Error,甚至包含邏輯處理的錯誤(例如時間算錯、金錢算錯等等),都應該是開發過程中要極力避免的。但很可惜,在永遠不足夠的開發時間與無止盡的新需求下,我們很難有機會完整測試自己或團隊成員所寫的每一行 code 正不正確。此時正確的觀念可以幫助我們避開很多陷阱。


用 SplObjectStorage 來避免無窮迴圈

Written by Simon Asika on

SplObjectStorage 是一個方便我們儲存物件,並確認是否曾經儲存過的工具,無須煩惱物件的名稱。例如:

$storage = new SplObjectStorage;

$o1 = new StdClass;
$o2 = new StdClass;
$o3 = new StdClass;

$s->attach($o1);
$s->attach($o2);

var_dump($s->contains($o1));
var_dump($s->contains($o2));
var_dump($s->contains($o3));

結果會是:

bool(true)
bool(true)
bool(false)

PowerShell 執行 ps1 檔時出現「系統上已停用指令碼執行」錯誤

Written by Simon Asika on

當我們使用 PowerShell 執行自定 script 檔,卻出現「檔案無法載入,因為這個系統已停用指令碼執行」的訊息,表示在目前作業系統中的執行原則 ( Excution Policy ) 預設狀態為 Restricted,也就是不允許執行。

可透過一些指令進行執行原則變更,首先請用管理員權限打開 PowerShell,執行以下指令:

$ Set-ExecutionPolicy RemoteSigned

讓系統接受所有自訂或是信任來源的腳本檔案,這樣 ps1 檔就能帳常執行啦。


讓 PHPStorm IDE 自動使用 CodeSniffer 驗證程式碼

Written by Simon Asika on

p-2013-12-21-10.jpg

PHP_CodeSniffer 是很優秀的程式碼品質驗證工具,不只被用在團隊開發時維護編程標準,Open source 也廣泛使用這項工具來控管貢獻程式的品質。如果我們能夠在實際編輯程式的過程就依靠 CodeSniffer 幫助驗證則更有效率,PHPStorm 就是一套能夠在編輯過程直接整合 CodeSniffer 的工具。

安裝 CodeSniffer

先參考 在 Windows 安裝 PHP PEAR 這篇文章,將 PEAR 安裝起來,接著透過 PEAR 安裝 PHP_CodeSniffer:

$ pear install PHP_CodeSniffer

在 Windows 安裝 PHP PEAR

Written by Simon Asika on

pear.png

因為最近轉移工作環境到 AMPPS ,預設並沒有像 XAMPP 一樣安裝 PEAR,所以決定自行安裝起來使用。

設定環境變數

首先得讓 CMD 可以執行 php 指令,參考 設定環境變數讓 Windows cmd 命令列可以執行 php 指令 這篇文章,先加入 AMPPS 的 php 路徑。(其他伺服器包也是同樣的設定)

我為了管理方便,想把 pear 裝在 C:\bin\pear 下面,所以環境變數記得加上這個位置,然後重開機。


安裝 Ubuntu Server 的一些初始網路設定

Written by Simon Asika on

平時太習慣 VPS 設定好的環境,剛安裝完單機版 Ununtu 之後就是連不上網路,不過內網連的好好的。希望將主機當成伺服器的使用者需要記得先做幾項設定,讓網路暢通。

設定靜態 IP

輸入以下指令編輯網路設定:

$ sudo vim /etc/network/interface

改成如下設定


讓 Windows 的 CMD 可以顯示 ANSI 顏色

Written by Simon Asika on

p2013-11-04-5.jpg

Windows 的命令列無論是傳統 CMD 還是新的 PowerShell 都是黑白的世界,就像熊貓只能拍黑白照片一樣。不過我們可以裝點小東西,讓 Windows 也能擁有七彩繽紛的命令列。


PHP Slim 教學 - 用 Slim 整合 Twig 打造 Prototype 系統

Written by Simon Asika on

img

一直以來都在用 HTML + Bootstrap 來做 Prototype , 之前是自己用 Native PHP 寫了簡易的 Routing 與 Helper Proxy,直接用檔案結構當作網址階層,作為一個靜態頁面又能簡單支持PHP的系統來說很足夠了,也就這樣用了很久。

單純覺得想玩點新玩具,所以研究了一下有沒有合用的 Micro Framework,Silex 稍嫌厚重了點,所以就選了 Slim 來用。


實作 PHP Daemon 接收 Unix Signal 訊號

Written by Simon Asika on

Signal.png

一個 Daemon 守護進程除了存在記憶體中默默執行工作之外,也需要能夠接收訊號來處理事情,並且能夠寫入一些 Log 訊息讓使用者查詢。

前幾天寫了 用 PHP Daemon 創建 HTTP Server,但範例中的 Daemon 其實不夠完整,我們這次額外來實作讓 Daemon 可以接收 Unix 的訊號(Signal),來處理事情吧。


用 PHP Daemon 寫一個 HTTP Server

Written by Simon Asika on

111143969_35533831ab.jpg

(Image via)

今年 PHPConf 的一大亮點在於大家終於發現,原來 PHP 結合 Libevent 可以爆發出驚人的效能,把各大對手遠遠甩在腦後。事實上,早從 PHP4 開始,就已經有完整的 Socket 與 cli 環境支援,很容易就能編寫即時回應的 Comet Service 用在留言板之類的功能。

之所以沒有那麼普及,是因為採用 Socket 編寫 Web Server 相較於直接搞個 Ajax long polling 來說太過難懂,而且至今網路上對於 PHP Socket 的教學也不多。不過相關的一些函式庫其實也蠻多的了,例如 Socket.io, phpsocket.iophpDaemon ,這幾套都可以幫助我們寫出即時回應的伺服器事件回應。

會想要寫這篇,是因為最近剛好想要用 PHP 寫個背景應用程式(Daemon)來處理一些常駐服務,研究的過程發現,其實藉由 PHP CLI 介面,fork 兩次自己成為 Daemon 守護進程以後,就可以提供一個獨立於 Apache 之外簡單的 HTTP Server 功能。


Control Tools

WS-logo