顯示具有 PHP 標籤的文章。 顯示所有文章
顯示具有 PHP 標籤的文章。 顯示所有文章

2007年2月21日 星期三

PHP:Fatal error: Allowed memory size of 8388608 bytes exhausted

剛才try說留言時有錯誤訊息,應該是指這個:

Fatal error: Allowed memory size of 8388608 bytes exhausted (tried to allocate 137 bytes) in …

我是因為用了af-extended-live-archive吃掉太多記憶體而發生,Spam Karma2有時也會出現這個錯誤訊息,參照這篇的解法,memory limit提高就解決了(預設8M)。

在PHP script開頭這麼寫

ini_set(”memory_limit”,”12M”);

或是改/usr/local/etc/php.ini

memory_limit = 12M

2007年1月26日 星期五

超越Java(Beyond Java) - 4 (Java以外的語言)

書藉基本資料:超越Java(Beyond Java)

ch9討論其它語言,決定一個語言是否成為主流(或著說,取代Java),可分成話題性、時機、語言特性、殺手級應用來看,比方Smalltalk一直被認為是很美的語言,但30年過去仍未能成為主流,它的時機已過,未來也難以流行。Ruby興起很快,話題性夠、時機也對,語言特性好,近年來的Rails更是Web開發的殺手級應用,所以作者在本書花了大幅篇幅說明Ruby、說明Ruby on Rails,我經驗不足,看不懂Ruby更強的功能,不過寫個一陣子後會有所體會吧。

對語言有興趣的人,可以直接翻ch9看幾位專家的看法,很有意思。除了語言外,平台也需要討論,Ruby只是語言,不是平台,降低它的推廣力。提及Java時,或多或少在指JVM、J2EE、J2SE、J2ME,提及C#時也多少涉及.NET Framework、.NET Compact Framework。換句話說,我們說Java好時,其實同時指語言特性好(OOP、安全、規範多)和平台好(write once, run everywhere),JVM成功和重要的原因,可以參閱之前寫的”談JVM跨平台,卻不談scripting language跨平台的原因”。

這代表其它語言也有機會參與這些優秀的平台,Microsoft一直積極(?)強調CLR(Common Language Runtime),Java也有些案例,但都不太成功,像是Jython和JRuby,如果有組織積極推廣語言和Java平台、.NET平台整合,對這些語言是一大優勢。

下面節錄ch9一些有趣的內容:

Lisp

這是一個不簡單的傢伙。Lisp是世界級僅存的古老技術,人們不斷地重新發明或重新發現它,但是Lisp也是一大群家族,許多彼此不相容的設計和實踐,沒有任何一個看起來像是我們的家。當然,Common Lisp需要大修,但是由委員會來重新計計 Common Lisp 在此刻來說相當不恰當。Lisp需要一個仁慈的獨裁者,具有好的偉大的執行力,以及偉大行銷,才可能成功。
p168, by Steve Yegge 

作者另在p172提到 Lisp 的社群總由聰明的programmer組成,校園內也很流行,像MIT就強調用Lisp學習可以讓學生快地抽象思考。也許最後的語言都會回歸 Lisp,但Lisp太與眾不同,需要很多時間和精力學習。

PHP

2005 年最不可思議的一件事之一是,IBM 宣稱要支援 PHP,此舉無疑是針對意圖擁抱 PHP 的中小企業而來。
...
就和 Visual Basic 一樣,隨著開發者在錯誤的地方尋找簡單性,PHP 將會被利用在某些不適合的地方。
p170, by Bruce A.Tate (book author) 

相信許多人深有體會,我懷疑在資工學生裡,課餘寫PHP的機會搞不好比其它語言多,寫PHP是賺外快的最好機會。

Perl

某些 Perl 編程員寧願斷掉手指也不願意多打四個字元,才不管這些字元是否可以提升可讀性,畢竟難寫的程式應該也會難讀。
...
而 Perl 具有相當多火星文般的語法捷徑,簡直是神祕的溝通方式 (secret handshake )
...
說來有趣,但是對照起 Java 則是截然不同,還是別去用 Perl 吧 !
p170, by Bruce A.Tate (book author) 

這裡應該是比較開發大型多人專案的情況,有用過Perl的人都很享受快速用Perl解決瑣碎雜小事吧。

Smalltalk

早在 Java 尚未在 James Gosling (Java之父) 的眼中閃爍時,聰明的開發者就已經使用 Smalltalk建立成功的物件導向應用了。而「不是很聰明」的開發者用 Smalltalk 建立某些有史以來最醜的物件導向程式。
p171, by Bruce A.Tate (book author) 

作者認為Java的成功造成Smalltalk元氣大殺,它們都是良好的OOPL,Smalltalk語法特殊,主流的C++不願嘗試,選擇改良C++的Java則成為贏家。

Functional Language

用Haskell寫費氏數列(Fibonacci series):

fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + fib(n-2)

Java

我沒說 Java 已死,或著 Ruby 即將接班,或著延續伺服器將會支配一切。我只知道:

  • 我現在很受傷,我的顧客也是。我愈來愈難叫我的顧客要滿意 Java 的一切。
  • ...

p174, by Bruce A.Tate (book author) 

讀了「Beyond Java」後,我覺得我又想學Common Lisp,但之前挑戰多次(包含Scheme在內)失敗,我真不懂為什麼Lisp要用這麼多括號,讀寫都很麻煩,最近會先玩Ruby和Haskell吧,哦,還有Python,別忘了Google內部喜歡用Python寫system management。

2006年12月26日 星期二

PHP用mysql_connect() or mysql_pconnect()?

最近發現pconnect在high loading時可能因pconnection不夠而無法取資料,出現這樣的錯誤訊息:

Warning: mysql_pconnect(): Too many connections

但用connect的寫法,要保留打開的$connection做為sql query使用,coding上較麻煩,雖說可以寫成class,將$connection變數存在class內,避免這個麻煩。還有connect可能要自己free query result(如果keep connection較久的話),而pconnect不用處理free(但不見得沒問題 XD ),看了WordPress和SMF的code,它們都用connect,沒有用簡易的pconnect。這麼說來,大規模的PHP program,還是用connect自己管較好囉? :( 不清楚PEAR或PECL怎麼處理的。

偷懶的小東西還是繼續用pconnect吧 XD ,也可以透過tube DB or web server的方式避免out of pconnection,比方增加MySQL pconnection數,或降低web alive connection,在Apache裡是設MaxKeepAliveRequests和KeepAliveTimeout吧。

2006年12月20日 星期三

mysql_fetch_*()的選擇

自從看到foreach ($result as $key => $value)的寫法後,愈想愈覺得mysql_fetch_assoc()才是王道,如同PHP官網所寫,它多了很多便利性,並且效能和最陽春的mysql_fetch_row不相上下。

極端點的例子來說,自己寫一個loader,像Smarty一樣,會把自訂的keyword換成準備好的data,配合foreach的寫法,程式不需知道有幾種field、field名稱為何,就能把keyword轉成data。例如template.html長這樣:

<a href=#link#><img src=#source# /></a>

HTML裡的keyword要和table field同名,DB table img_link裡有多個field,其中兩個為link和source,loader可以這麼寫:

$str = file_get_contents("template.html"); $sql = "SELECT * from img_link"; $r = db_query($sql); $assoc = mysql_fetch_assoc($r); foreach ($assoc as $key => $val) { preg_replace("/#$key#/", "'$val'", $str); }

這個例子省略重覆template內容和while ($assoc = mysql_fetch_assoc($r))的寫法,只是描述概念而已,功能愈複雜時,愈顯得出mysql_fetch_assoc()的彈性。

mysql_fetch_row()的好處是簡單好寫,如果SQL是寫成”SELECT field_a, field_b, …, field_n from table”的形式,程式固定把$row[0], $row[1]放進間接變數,有簡單的好處,比方像這個例子,之後要傳$board到別function裡,但$board一些細項可能從不同table或不同field拿出來的,只要變動SQL,把field的位置放對,之後的程式不用更動:

$board['chinese_name'] = $row[0]; $board['introduction'] = $row[1]; $board[$type] = $row[2];

mysql_fetch_row()另一個好處是取多個table時,同名field不會被擠掉,mysql_fetch_assoc()需要在SQL裡做alias,或是如這篇描述的方法處理,將資料統一包成二維陣列,用$drow[TABLE][FIELD]的方式索引,有點笨重。

mysql_fetch_array()是mysql_fetch_row() + mysql_fetch_assoc()的函式,不多描述,參閱官網就好。

但我就不懂mysql_fetch_object()的優勢在那,google了一下,只有看到這篇在談它,結論是mysql_fetch_object()是廢材,又慢(別篇說的)又難用。記得我初學PHP時,特別愛用mysql_fetch_object(),總覺得用 -> 來索引較清爽,只是單純的OOO病發作罷。bye bye,我曾經的最愛:mysql_fetch_object(),我們因不了解而在一起,又因了解而分開。

ps. OOO:Over Object-Oriented,忽然想到的詞,看起來不錯用 :P 。

2006年12月12日 星期二

PHP date/time format的minute是 i 啊

忽然發現上篇的po文時間是12分,往前一看,清一色都是12分發表,再往前分別是11分和10分,原以為是WordPress的bug,trace code後好像無誤,到php manual查看date,才發現我用錯參數了...,是 i 不是 m 啊 XD

m Numeric representation of a month, with leading zeros
i Minutes with leading zeros

2006年11月24日 星期五

助教專用:Demo時間登錄表

前言

這學期當助教,預計有四次demo,有感於大學時老是吐糟助教用紙筆登錄,自己當助教時當然要用網頁登錄,這是e化的時代啊!

雖說唸資工和寫網頁沒直接關聯,沒人說資工系助教一定要會寫網頁,不過與其用紙筆統計再輸入電腦,不如花些時間從根本解決,藉機練習前陣子看到的foreach tip,DB schema設計和網站實作都滿順的,愉快的經驗。

Requirement

  • 讓學生上網登錄demo時間
  • 資料庫有存學生名單,防止登錄不存在的學號
  • 管理介面:簡易管理員登入機制
  • 管理介面:設定demo時間範圍和每單位時間的人數
  • 管理介面:輸入學生名單
  • 管理介面:刪除登錄
  • 管理介面:自動補完未登錄的同學
  • 管理介面:下載時間表為excel檔

Limitation

  • demo範圍不能拆成多天,一天苦完比較痛快 T_T
  • 不能透過網頁介面安裝系統和清空資料,用phpMyAdmin比較快啦

Download

下載ta_demo_tool.tgz。下載解開後參照readme.txt使用。

Screenshots

ta_demo_tool_screenshot2



ta_demo_tool_screenshot