這一篇是完結篇,要談最後一部分:調用 功能的設計。
先看源碼:
function 開始($註記 = false){
$this->調用 = array();
$this->堆疊 = array();
HACGIS 發表在 痞客邦 留言(0) 人氣()
今天要談的是有關測試這個功能項目的解說,廢話不多說,來看源碼:
private function &耗時(&$開始, &$結束){
$耗時 = array();
$次數 = count($開始);
HACGIS 發表在 痞客邦 留言(0) 人氣()
恩~感謝朋友們的關心,這幾天有點小感冒,不過總算把藍星侵略者143完食。
現在讓我們來看一下源碼解說,以下三個函數是時點這項功能相關的函數:
function 時點($註記){
$this->時點[$註記] = microtime(true);
HACGIS 發表在 痞客邦 留言(0) 人氣()
讓我們繼續之前的話題,上一次我說會考慮加入自動註記的功能,不過我考慮了一下,決定還是不要,因為我沒辦法假設每個出入口都會被設置進入與離開點,但是在下個版本,我還是會加上一個欄位「函數」,來標明這個時點是屬於哪個函數的,接下來讓我們來看看各項功能的成員函數的解說。
時點:
- 時點($註記):設定某個時點。
- 時差($開始, $結束):傳回兩個註記之間的時差。
- &彙整:時點($表格 = false):將曾紀錄過的時點資訊傳回,若$表格 == true,則傳回HTML的表格資料。
測試:
HACGIS 發表在 痞客邦 留言(1) 人氣()
首先讓我來談一下,我改寫的這個量測類別與PEAR::Benchmark有何不同。
- 量測是一個單一且未繼承其他類別的單純類別,而Benchmark是繼承PEAR類別且根據功能拆分成三個小類別。
- 量測在輸出的部份僅輸出HTML,而Benchmark可選擇輸出HTML及Plain。
- 量測在輸出上交由其他的一般函數來處理,而Benchmark則交由成員函數來處理。
- 量測在計算上不考慮使用BCmath模組,而Benchmark則有。
- 量測在測試函數的方式上可選擇不同的參數傳遞方式,而Benchmark則僅有一種方式。
- 量測在調用函數的分析上考慮了多重出口的情況,而Benchmark不考慮。
大致上就如以上所述,接下來我先談一下量測這個類別與其他的程式有何不同,以及為何要如此設計的考量。
量測的類別通常使用於開發過程中,或是在維護階段尋找程式執行的瓶頸,幾乎不會被用在一般正在線上執行的系統中,所以我才會將三個功能全部放在一起。
HACGIS 發表在 痞客邦 留言(0) 人氣()
要下載請按
這裡。
這是我參考PEAR::Benchmark寫出來的一個效能分析物件。
使用方法請參考原始碼以及example.php
這幾天我會把設計上的考量以及為甚麼要如此設計分幾篇文章寫出來。
HACGIS 發表在 痞客邦 留言(0) 人氣()
話說我這個使用參照到病態的人,來寫這個應該蠻適合的。
首先要提得是為甚麼要使用參照?
最重要的理由是為了減少複製變數的成本,這個成本包括記憶體的使用以及時間上的消耗。
如果你看過PHP的原始碼,PHP的變數基本上是由ZVAL這個結構所控制的,所以不管是不是使用參照,當我們作函數的參數傳遞、返回值以及變數賦值的時候,這個結構的產生是不可避免的。
HACGIS 發表在 痞客邦 留言(12) 人氣()
在寫PHP程式的時候,我常常希望能有「同名異式」的東西出現,不過我知道那是辦不到的。
C++的同名異式是編譯器靠著函數的簽名型態自己處理,實際上是在編譯的時候把函數名稱編碼掉了,只是寫程式的人不自知而已。
由於PHP的變數是弱型態,所以用C++的方式也沒法達到同樣的效果。
而我比較愚蠢,同時我也信任自己的編程手法,所以我自己對函數作命名,而不依賴__call這種魔術方法作前處理,而對於單純的函數,即便想用魔術方法也沒輒。
HACGIS 發表在 痞客邦 留言(0) 人氣()
今天在找資料時看到
這一篇,我心血來潮重做了一下這個實驗,結果發現差異沒有那麼明顯。
當然可能是因為我用的是PHP 5.2,或是機器是雙核心的關係,實際的最大差距也不過是2~3倍。
程式碼在下面:
<?php
HACGIS 發表在 痞客邦 留言(0) 人氣()
對於目前可以簡單搞到的資料庫系統,以及PHP官網正式登錄的API,在連線的部份我都做了一番研究。
也由於實做的關係,我決定這一個禮拜要改寫程式碼,把目前的設計由工廠模式改為策略模式。
也就是說,會根據目前可用的extension來決定用什麼樣的Driver來操作DB。
之前曾在某個網站上有人提出測試報告,執行的速度分別為:
HACGIS 發表在 痞客邦 留言(0) 人氣()
PHPSecInfo 是一套檢測 php.ini 裡面相關的安全設定的工具。
目前檢測的項目不多,不過可以簡單的作一下自我測試,我舉程式裡幾個跟數字有關的上限值(單位都是bytes):
- memory_limit:8*1024*1024 (8M,PHP預設建議值為 16M)
- post_max_size:256*1024 (256K,PHP預設建議值為 8M)
- upload_max_filesize:256*1024 (256K,PHP預設建議值為 2M)
說實話,在實際應用上即便以 PHP的建議值我都覺得太苛,沒想到這套軟體的標準更嚴苛。
HACGIS 發表在 痞客邦 留言(0) 人氣()
parse_str 與build_http_query的問題都出在陣列的「索引」編解碼上。
若索引中含有 '.' (dot), ' ' (white space)等字元,parse_str解出來的會變成 '_' (underline)。
build_http_query則是把索引前後的[]也編碼掉了,所以如果索引中含有 '[', ']' 的話,在解碼的判斷上會有問題,不過有趣的是,parse_str可以很正確的解出來。
HACGIS 發表在 痞客邦 留言(0) 人氣()
我發現parse_str在解碼含有' ', '.'等字元時,會發生問題,所以我打算寫個函數取代它。
而這個陣列用的賦值函數算是副產品,會被使用在一些特殊的情況中。
function &陣列:參照(&$陣列, &$索引表 = array()){
$參照 = &$陣列;
HACGIS 發表在 痞客邦 留言(0) 人氣()
配合之前寫的路徑修正函數,稍微調整一下,寫出新的兩個函數:解析網址、路徑修正。
function &解析網址($網址) {
$解析 = parse_url($網址);
HACGIS 發表在 痞客邦 留言(2) 人氣()
其實前幾天就發現這個問題了,只是當時還沒有時間去作report bug,剛剛花了點時間去
報告。
這個問題我是覺得應該是與
sqlite_close的傳回值是void有關,因為dbx的函數其實也是去呼叫相對應的資料庫API函數,而void == false,所以當用dbx來操作SQLite時,就會發生dbx_close總是傳回false的問題。
其他像:mysql、pgsql、mssql、oci8都是正常的,因為他們對應的xxxxx_close函數都會有傳回值。
HACGIS 發表在 痞客邦 留言(0) 人氣()
Firebird 與 PHP 的連線,其實是很簡單的,在安裝 PHP 的機器上,編輯底下這個檔案
%WINDIR%\\system32\\drivers\\etc\\services
在檔案中加上這一行:
gds_db 3050/tcp #firebird Database
這樣就可以連線了。
HACGIS 發表在 痞客邦 留言(0) 人氣()
DB2 Express-C 的與 PHP 連線的方式,其實只要安裝DB2 9 Runtime Client套件就可以了,這是比較保險的方式,不過這個檔案要23MB(僅English),有點大就是。
其他的方式不推薦,因為需要額外設定一些環境變數,有點麻煩。
HACGIS 發表在 痞客邦 留言(0) 人氣()
這兩天用VPC做了一個虛擬機器,把實驗用的資料庫們丟過去,順便測一下網路上寫的連線方式看對不對。
我發現對於
Oracle 10g Express Edition的方式,作法上跟網路上
這篇以及
這篇說的有點出入。
首先要解釋的是,那篇文章講的應該是是Oracle 10g Enterprise/Standard Editions 的作法,所以他所說的那三個在
Instant Client裡面的dll,並不適用於Oracle 10g Express Edition。
HACGIS 發表在 痞客邦 留言(0) 人氣()
對啦,我是在重新造輪子沒錯,目前正在寫一個類似adodb的東西,開發平台是XP SP2+Apache 2.2+PHP 5.2。
目前只先處理連線的部份,其他的慢慢搞。
有些該紀錄的東西先記下來,
這裡有一份資料庫預設的帳號密碼。
目前我裝過的一些資料庫的問題:
- DB++:網站上找不到可下載的連結。
- FrontBase:授權要填的表單太麻煩,我頭一次看到要求要填MAC的
- Informix、Ingres:安裝過程失敗
HACGIS 發表在 痞客邦 留言(0) 人氣()
我是使用
SQL Server 2005 Express Edition 來作測試,有些地方要手動改。
- 下載
http://webzila.com/dll/1/ntwdblib.zip
- 解開得到 ntwdblib.dll ,把這個檔複製到 php 的安裝目錄,替換掉 php 內建的。
連線的範例:
HACGIS 發表在 痞客邦 留言(0) 人氣()