php,php,是的,還是php.已經寫過四篇和php相關的東東了.(>,>,>,>)但是還是覺得不過癮,還是想把半年來用php寫命令列程序的一點心得總結出來,希望在回顧的過程中,自己也得到昇華和提高.
簡單回顧一下已經寫過的東西:
自己執行',可不是將php編譯成二進位程式碼,從而具有可執行權限.是指,給php加個檔案頭:#!/usr/bin/php,然後透過chmod給檔案執行權限,以達到不用每次為了執行它,都在文件前面加個php的目的,具體見
>. 2.讓你的程序讓出當前佔用的終端.
著,先前的時候為了把它放到後台,我們會運行它的時候,在末尾加一個&放到後台.或者運行一個screen or tmux然後在裡面運行它.但是,但是,這些做法總是感覺很argy,現在有了更好的解決方式,就是讓它自己把自己放到後台,具體見
>. 3.除了手工輸入資料,還可以接收別人傳過來的世界裡能夠和其它小程式共同完成一個使命是件很光榮的事兒喲~怎麼樣才可以做到呢?具體見:
>
有句話說:'溫故而知新,可以為師夷'.咱溫故了一下,發現沒有知道新的東西,那咱就繼續講新的東西吧:)個人覺得現在的php腳本技術,已經很成熟很完善了,而且易學易用,很容易就可以上手.在使用php寫命令列腳本的時候,筆者主要用在兩個方向:後台服務,命令行程序.後台服務因為要在服務端,一直運行,長駐內存,所以要格外注意代碼的優化.命令行程序裡的一些東東,可以直接應用在後台服務,ok,開練: 後台服務,ok,開練:
後台服務,ok,開練:
後台服務:
1.後台運轉
2 .長駐內存
第一點,程序要長期運行,看來只能放到while(0)裡了.先前準備用這個方式的時候,看網上很多資料不提倡php用這種方式.但是不用這種方式用啥呢?goto?那是5.3以後特性,而現在伺服器強調穩定多數用的是5.2的版本.而且這樣強制在代碼中跳來跳去的指令,你敢用嗎?最後還是用while嘍.在測試伺服器跑了一個多月,感覺很好很強大!
第二點,提到長駐內存就不得不提內存釋放問題.php沒有內存回收機制,雖然不像c那樣,要自己分配和清理內存,但是還是注意一些好,小心駛得萬年船.所以在內存使用上,筆者堅持一個原則:函數裡的內存不管,主程序裡的內存用完就unset.這樣也可以避免變量重名帶來意外的效果.(當然了,php好像是可以變量重名的,誰後來誰生效,但是養成一個好的習慣很重要:))
3.以禁用輸出
輸出是指禁止輸出使用禁用輸出
輸出是指禁止輸出使用禁用?是,但不全對!因為linux的世界裡輸出有兩種,一種是正常輸出,一種是錯誤輸出.正常輸出,自不必說了,寫的再好的代碼,一個echo馬上就退了.再有就是錯誤輸出,一定要抑制錯誤!舉個例子來說:mysql_connect.這個指令執行的結果有兩種:成功,失敗.大多數情況,很容易成功的.於是乎很多人相當然的認為,這個函數一定會成功的!於是你會看到很多網頁在出錯的時候,提示mysql連接失敗的信息.網頁還好,因為是一個人一次,這個人失敗了,說不定下個人的時候就成功了,但是後台服務不一樣,如果你不處理這些錯誤,程序直接就退了!所以,為了程序的健壯性,一定要懂得抑制錯誤.再者,考慮全面,也是男人成熟的表現:)
4 .訊號控制
一個完整的後台程式,怎麼能必需靠'kill -9 pid'這樣的暴力方式來終結呢?php裡,也有完美的訊號解決方案.讓你的程式支援start,stop,restart,status只是信手捻來的事兒.
5.運轉日誌
後台程式,禁用輸出了,肯定就要寫日誌了.從啟動到正在幹啥事兒,到什麼時候因為什麼原因退出,肯定都要有詳細的記錄.在我還沒整明白信號的時候,日誌裡只有啟動和運行記錄,然後又是啟動和運行記錄,鬱悶,後來終於可以知道程序是嘛時候退出的了:)在寫日誌的時候,我發現一個很帥的函數file_put_contents,而且她支持追加.這樣的話,我就可以做到用'tail -f 日誌名'實時看運行狀態了:)
命令列程式:
print的要快很多.echo後面可以用逗號分割多個句子,輸入的效率要比用點連接快很多.所以,當我要處理大量的文本,希望最後一次將它們寫到文件裡的時候,我多麼希望可以不用'.'來連接這些東西,因為我不想時間都浪費在連接字符串上!php跟我說話,你可以做到!於是我驚喜的發現ob_start可以!例如:
ob_start;
,xxx,xxxx;
file_put_contents('filename',ob_get_contents);
ob_clean; .修正時區錯誤
linux裝個系統是很簡單的事兒.但是讓筆者很鬱悶的是:好多人可以把linux系統裝成中文版(因為安裝語言選擇了中文),卻把時間弄成了紐約時間(西八區,中國是東八區).所以作為程式設計師,不要奢望一切東西預設就是對的,為了保證自己的程式不出問題,在寫日誌,或者輸出時間的時候最好自己定義一下時區:date_default_timezone_set('PRC') :)