用 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 功能。


自行設定 Balsamiq Mockups 的字體(支援中文)

Written by Simon Asika on

p2013-10-12-3.jpg

Balsamiq Mockups 是一套非常好用的 UI Wireframe 繪製工具,不過過去許多時間來,字體一直是大家煩惱的問題之一。

Balsamiq 預設使用了一種類似 Comic Sans 的字體,叫做 Balsamiq Sans,搭配 UI 元件的手繪畫風,別有一番味道。但是這個字體其實不支援中文,在過去比較早期的版本中,必須要自行設定「Use System Fonts」才能夠讓中文顯現。

p2013-10-12-4.jpg


設定環境變數讓 Windows cmd 命令列可以執行 php 指令

Written by Simon Asika on

很多時候,當我們安裝完一些 Apache + PHP + MySQL 的整合包,他並不會幫我們設定好環境變數,一旦我們想要執行 php 指令來呼叫檔案執行,就會出現 php 不是內部或外部命令、可執行的程式或批次檔。 之類的訊息。

這是因為在 Windows 上,需要靠 PATH 環境變數來指定我們所輸入的命令列指令,參考那些資料夾來尋找程式執行。我們舉 XAMPP 為例,它的 php.exe 放在 C:\xampp\php\ 下面,所以我必須在環境變數中,加入這個位置,才能讓 CMD 執行 php 指令。


用 Native PHP 編寫 Command Line (CLI) 程式

Written by Simon Asika on

phpcli.gif

許多 php 套件如 Symfony Console 或 Joomla CLI Application 接已經幫我們封裝好方便的 CLI 介面可以直接使用,這裡來聊聊如果不使用 Framework ,該如何自行操作 PHP IO Stream 來輸入與輸出內容到命令列上面。

安裝 PHP CLI 套件

某些 Linux 的 LAMP 包預設沒有安裝 CLI 模組,可以自行安裝,以 Ubuntu 為例:

apt-get install php5-cli

Windows 可參考: 設定環境變數讓 Windows 命令列可以執行 php 指令


用 Markdown 寫作的另一個選擇: ACE X Markdown Editor 與 RemoteImage

Written by Simon Asika on

akmarkdown-remoteimage.png

前陣子 XDite 推出了 Logdown 蠻紅的,看來想用 Markdown 認真寫作的人也是不少。

其實在 Logdown 推出之前幾個月,為了要寫 Joomla! 開發教學,我也是想喝牛奶開了一間牧場的自己寫了一個整合 ACEMarkItUp 的 Joomla! 編輯器 ACE X Markdown Editor,再加上支援 FTP 與本地端拖拉上傳圖片的媒體管理器 RemoteImage。(結果我到現在都還沒動手寫教學)

這兩套都在Joomla!線上套件目錄免費釋出一陣子了,整體風評不錯,本來想說國內沒什麼人在用Joomla寫技術部落格,所以想說在國外推廣就好了。

後來想想,稍微寫點介紹文章也好,因為平時實在太忙了,最近整個轉向去協助 Joomla Framework 的開發,很久沒理這些 joomla 套件了,多讓些人知道這些工具,以後想丟到 Github 射後不理看看會不會有人來幫忙發展。


用 Nested Set Model 建立巢狀資料表

Written by Simon Asika on

400px-NestedSetModel.svg.png

是說,因為Joomla!本身就有內建的關係,已經用了很久的 Nested set model 了,最近才發現其實中文環境下對這類用法的討論不是很多。簡體的文章倒是有個兩三篇,不如來寫個繁體版的吧。

Nested set model 是一個用來方便處理樹狀節點資料結構的資料模型,可以讓我們在不需要遍歷整顆樹的情況下,用極少的主機資源獲取節點、計算節點數量或是映射關連資料表。


PHP 開發者工具

Written by Simon Asika on


讓 Ajax Chosen 適應中文搜尋與選字

Written by Simon Asika on

130731-0001.jpg

既上次的jQuery Chosen 中文搜尋 狀況解決後,又遇到 Ajax Chosen 的問題。 Ajax Chosen 是英語系國家開發的,在輸入文字時沒有選字問題,但在中文就麻煩了,首先 AjaxChosen 是用最後輸入的延遲時間來自動搜尋,預設 500 毫秒,所以中文輸入法常常還來不及選字就送出去了,而一旦送出去後,選字功能會被終止掉造成無法繼續選字。


Joomla! 的最高權限使用者 Root User

Written by Simon Asika on

在 joomla 中,除了Super User 群組之外,另外還有一種方式可以設定最高權限使用者,該使用者所有的權限驗證都能夠通過。而 Root User 只能夠設定在 configuration.php 檔案中。

我們可以看看 JUser 中的驗證程式碼:


PHP 的 static 與 self 兩個關鍵字的差異

Written by Simon Asika on

在 PHP 的語法中,我們都知道 self 代表的是當下靜態 class 的自己,所以我們可以用 $instance = new self($a, $b); 來取得由自己生成的物件。

但另外有一個 static 關鍵字也可以用,例如 $instance = new static($a, $b); ,兩者差異在於,當B類別繼承自A類別時,若使用的是 A 類別的 Method,此時self會代表A類別,static代表B類別。若使用的是 B 類別的 Method,則static代表A類別,self代表B類別。

換句話講 self 代表 get_class()static 代表 get_called_class()


Control Tools

WS-logo