堆疊是一種後進先出的資料結構,這種資料結構類似上部開口的杯子,把從球上方的開口丟進杯子後,就要從上方的開口處取出球。
資料在堆疊中放進去的方式及取出的方式也是相同的,先丟進去的資料,必須等上層的資料都被取出後,才能取出。
這是一種後進先出的方式,最後丟進去的資料,可以最先被取出來使用,最早被丟進去的資料,卻必須在所有資料取出後,才能取出。
class Stack{
private $sp=-1;
private $spMax=100;
private $data=array();
public function pop(){
if($this->sp >= 0){
$result=$this->data[$this->sp];
unset($this->data[$this->sp]);
$this->sp--;
return $result;
}
}
public function push($data){
if($this->sp < $this->spMax){
$this->sp++;
$this->data[$this->sp]=$data;
}
}
public function setSpMax($max){
$this->spMax=(int)$max;
}
}
$stack = new Stack();
$stack->push('a');
$stack->push('b');
echo $stack->pop();
echo '
'."\n";
echo $stack->pop();
程式碼說明:
一個很簡單的類別,專門處理堆疊。
Stack::pop() 取出資料
Stack::push() 放進資料
Stack::setSpMax() 設定堆疊能存放的資料筆數
2008年12月30日 星期二
順其自然
最近在進行程式執行環境的設定,由於前輩留下許多的程式遺產及系統都是在windows系統下執行的,因此自己寫的程式也必須在windows下執行,為了讓自己的程式能夠在windows環境下執行,經歷了許多的苦頭,許多奇奇怪怪的問題總是百思不得其解,不過,到後來,問題找到解答了,也明白一句話,順其自然。
選擇程式語言,經過了滿多的掙扎,走過了許多徘徊,難以抉擇的十字路口,最終還是選擇php,這理由很多。想過以basic,搭配.net或asp在windows上跑,這些程式語言的撰寫界面親切,而且中文資源眾多,比較好入門,不過新台弊要準備多一些,想到這就讓我打退堂鼓,我不想砸太多錢在這些軟體上,也不想上網抓非法軟體,因為太懶惰了,而且msdn的文件,就算是中文的也看不太懂,翻譯的不太順。php是開放原始碼的軟體,可以隨意散佈使用,不用揹負太多法律及金錢的壓力,比較適合我的個性。開源軟體當然不只php,也曾買了很多perl的書,不過到後來沒有看完。Perl也不錯,只是不像php那麼風行,比較少人用。就看你喜歡哪一種了。
現在我明白,其實學哪套程式語言是沒有什麼差別的,只要學通一種,再學另一種程式語言,其實是很快的,所謂的很快是指基本的語法(80%的功能),背後的精髓就另當別論,專精一二種,其實就夠了,其他的語言在你精通一二種程式語言後,就可以觸類旁通了。
原來程式搭配的資料庫系統是mssql,這套跟php搭配,有點奇怪,因為mssql是微軟的,並非開放原始碼軟體,不過沒辦法,原來的系統是建構在mssql上的,總不能不用吧!為了使用mssql,還k了一個禮拜的書,寫了一堆mssql上的預儲程序來和php搭配使用,php最常搭配的資料庫是mysql,一般常見的應用系統都是以php搭配mysql,與mssql搭配使用的程式語言通常是.net的語言。
原來的資料庫規畫跟我預期的有落差,沒有規畫primary key,foreign key,維護很不方便。不過,也沒辦法了,只好硬幹,以php搭配mssql及預儲程序,總是可以把程式寫出來的,不過在後續的執行環境設定上,讓我吃足苦頭,實際上線後,程式常當,為了找原因,讓我頭痛很久。
後來找到一個解決辦法,在iis上設定應用程式集區,一個小時回收記憶體一次,要當就不會超過一個小時了,但終究不是一個好的解決辦法,而且回收記憶體,雖然對php的session不會有影響(php的session存在硬碟上),但asp的session會全部清空,問題是這台機器上有一堆asp寫的程式。
繼續找資料,才知道php雖然是thread safe的程式,但是許多的dll檔卻不是thread safe的程式,所以一旦碰到非thread safe的dll,php就會不穩定,雖然知道原因,但卻不知道是哪個dll是非thread safe的,但是要解決這個問題就必須以fastcgi的方式執行,這樣非thread safe的dll在這樣的環境下執行也不會有問題,只是在fastcgi下,mssql的dll檔根本跑不起來,這真是糟糕,沒辦法連資料庫,程式就沒作用。
最後終於找到原因了,把php模組需求跟中心的同事說後,同事在linux上架完系統後,我的程式一樣不能連mssql,自己找了php manual後才發現原來win上的ntwdblib.dll檔是非thread safe的,不穩定的原凶就是它了,把php連接mssql的底層函式庫改成dblib就一切正常,找到原因後,心頭真是舒服,不過就要麻煩同事架linux系統了,這樣跑起來才會穩定,也不用再頭痛了。
許多的事情順其自然是比較不會遇到這麼多的曲折,像這次以php搭配mssql就不是一個自然的搭配,開放原始碼搭配商業軟體,許多的問題,開放原始碼社群及微軟這家公司是沒有多餘的心力解決的,到時候就只能自求多福了,以最自然的方式進行,問題還是會比較少,因為這些問題都有人幫你解決了,只要專心寫程式就可以了,不用跟這些環境設定奮戰。
選擇程式語言,經過了滿多的掙扎,走過了許多徘徊,難以抉擇的十字路口,最終還是選擇php,這理由很多。想過以basic,搭配.net或asp在windows上跑,這些程式語言的撰寫界面親切,而且中文資源眾多,比較好入門,不過新台弊要準備多一些,想到這就讓我打退堂鼓,我不想砸太多錢在這些軟體上,也不想上網抓非法軟體,因為太懶惰了,而且msdn的文件,就算是中文的也看不太懂,翻譯的不太順。php是開放原始碼的軟體,可以隨意散佈使用,不用揹負太多法律及金錢的壓力,比較適合我的個性。開源軟體當然不只php,也曾買了很多perl的書,不過到後來沒有看完。Perl也不錯,只是不像php那麼風行,比較少人用。就看你喜歡哪一種了。
現在我明白,其實學哪套程式語言是沒有什麼差別的,只要學通一種,再學另一種程式語言,其實是很快的,所謂的很快是指基本的語法(80%的功能),背後的精髓就另當別論,專精一二種,其實就夠了,其他的語言在你精通一二種程式語言後,就可以觸類旁通了。
原來程式搭配的資料庫系統是mssql,這套跟php搭配,有點奇怪,因為mssql是微軟的,並非開放原始碼軟體,不過沒辦法,原來的系統是建構在mssql上的,總不能不用吧!為了使用mssql,還k了一個禮拜的書,寫了一堆mssql上的預儲程序來和php搭配使用,php最常搭配的資料庫是mysql,一般常見的應用系統都是以php搭配mysql,與mssql搭配使用的程式語言通常是.net的語言。
原來的資料庫規畫跟我預期的有落差,沒有規畫primary key,foreign key,維護很不方便。不過,也沒辦法了,只好硬幹,以php搭配mssql及預儲程序,總是可以把程式寫出來的,不過在後續的執行環境設定上,讓我吃足苦頭,實際上線後,程式常當,為了找原因,讓我頭痛很久。
後來找到一個解決辦法,在iis上設定應用程式集區,一個小時回收記憶體一次,要當就不會超過一個小時了,但終究不是一個好的解決辦法,而且回收記憶體,雖然對php的session不會有影響(php的session存在硬碟上),但asp的session會全部清空,問題是這台機器上有一堆asp寫的程式。
繼續找資料,才知道php雖然是thread safe的程式,但是許多的dll檔卻不是thread safe的程式,所以一旦碰到非thread safe的dll,php就會不穩定,雖然知道原因,但卻不知道是哪個dll是非thread safe的,但是要解決這個問題就必須以fastcgi的方式執行,這樣非thread safe的dll在這樣的環境下執行也不會有問題,只是在fastcgi下,mssql的dll檔根本跑不起來,這真是糟糕,沒辦法連資料庫,程式就沒作用。
最後終於找到原因了,把php模組需求跟中心的同事說後,同事在linux上架完系統後,我的程式一樣不能連mssql,自己找了php manual後才發現原來win上的ntwdblib.dll檔是非thread safe的,不穩定的原凶就是它了,把php連接mssql的底層函式庫改成dblib就一切正常,找到原因後,心頭真是舒服,不過就要麻煩同事架linux系統了,這樣跑起來才會穩定,也不用再頭痛了。
許多的事情順其自然是比較不會遇到這麼多的曲折,像這次以php搭配mssql就不是一個自然的搭配,開放原始碼搭配商業軟體,許多的問題,開放原始碼社群及微軟這家公司是沒有多餘的心力解決的,到時候就只能自求多福了,以最自然的方式進行,問題還是會比較少,因為這些問題都有人幫你解決了,只要專心寫程式就可以了,不用跟這些環境設定奮戰。
2008年12月16日 星期二
ms sql2000的php driver
http://blogs.msdn.com/sqlphp/archive/2007/10/09/welcome.aspx
上面的文章有說明,新版的mssql 2005 driver for php也支援 mssql 2000
這真是好消息,有微軟的正式支援,總是比較安心,不會心裡毛毛的。
上面的文章有說明,新版的mssql 2005 driver for php也支援 mssql 2000
這真是好消息,有微軟的正式支援,總是比較安心,不會心裡毛毛的。
2008年12月13日 星期六
2008年12月6日 星期六
連接db的問題
使用Zend_Db連接資料庫時,最好使用$db->closeConnection()關閉每次
使用後的資料庫連結,以免產生一堆有的沒的問題,
這是上線後的網站實際發生的狀況,使用$db->closeConnection()後就少了一些問題,
win上的記憶體管理做得似乎並不好。
使用後的資料庫連結,以免產生一堆有的沒的問題,
這是上線後的網站實際發生的狀況,使用$db->closeConnection()後就少了一些問題,
win上的記憶體管理做得似乎並不好。
Zend Framework出現空白頁
錯誤訊息顯示:
Fatal error: Cannot redeclare class Zend_Loader in .....lib\Zend\Loader.php on line 31
查了一下php manual
require及include的差別
require:只要在程式中都會執行檔案含入的動作,不論是不是在判斷式中
include:只有判斷式正確,才會執行檔案含入的動作
看了一下含入的路徑,由於是windows平台
路徑是: d:\a\b\c/lib
改了一下程式碼
/lib改成 DIRECTORY_SEPARATOR.'lib'
路徑就成了d:\a\b\c\lib
經過這些手續,暫時消除這個問題,不過還要再觀察一陣子。
Fatal error: Cannot redeclare class Zend_Loader in .....lib\Zend\Loader.php on line 31
查了一下php manual
require及include的差別
require:只要在程式中都會執行檔案含入的動作,不論是不是在判斷式中
include:只有判斷式正確,才會執行檔案含入的動作
看了一下含入的路徑,由於是windows平台
路徑是: d:\a\b\c/lib
改了一下程式碼
/lib改成 DIRECTORY_SEPARATOR.'lib'
路徑就成了d:\a\b\c\lib
經過這些手續,暫時消除這個問題,不過還要再觀察一陣子。
訂閱:
文章 (Atom)