• Main navigation
登入區塊
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站資訊區塊
站務管理者

kiang
 

tokimeki
 

sam0228
 

morris
 

shiang
 

SoltyRain
 

廣告



« 1 2 (3) 4 5 6 ... 8 »


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
Quite a regular
註冊日期:
2007/12/31 1:05
文章: 58
re : 我跟我那位朋友也有去,當時FIEND拿出來的東西,其概念跟我當初提得很類似,會後我們兩個都覺得蠻巧合的。

呵呵~~

沒有所謂的巧不巧..

其實 w3c 有提供 更細的架構表.

如您所說 區的切割 更細.

這是己知的做法 .

條條道路通羅馬 以您的能力會想到這樣的東西 我覺得不是巧合 .

您說是吧 ^^

發表日期:2008/1/10 0:17
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
Quite a regular
註冊日期:
2007/12/31 1:05
文章: 58
dear shirock :

re :
##################################
基本上,你誤用 findCount() 的使用場合了 (也許CakePHP官方的那個也是誤用了)。既然 findAll() 已經以 array 型態傳回了資料結果,何不直接用 PHP 的陣列函數 count() 取得資料結果陣列的筆數?我自己的系統是這樣做的(不是用CakePHP)。


//$num = $CALL->findCount() ;
$num = count($ecstart["record"]);


而 findCount() 的使用時機,則應該是用在我們"僅僅要"資料筆數,而不要資料內容的場合。這時我們使用 findCount() ,將資料查詢和筆數計算的動作在 Database 端處理後,僅僅只將資料筆數傳回 Application 端,以減少資料內容在 Application 端的暫時性地儲存動作。

CakePHP 基底元件的 method 設計是正確的。但是衍生元件的開發者在使用這些 method 時,還需要多下點功夫了解這些 method 的使用時機與場合。

##################################



小弟再補充說明一下 :

老實說 看完您的論點... @$%@#%@#%@#%@#

^^!! 算了 我覺得我真的很欠 k . 我真的蠻需要 知音的 鳴鳴~~

忍不住還是想跟您說 model 的設計 正確什麼? ^^!!

我在 model 和 db_sources 內並沒有看到 可以避免 二次 select 的method

分享一下 我的想法 片面之詞可能大家覺得小弟在說大話 :

1. count 陣列變數太誇張了..
我在 db
而且 findall 我己經下 limit 了說
塞入 變數 的想法 真的很酷 不敢用會被打死 .

2. 官方設計這種東西說正確 , 我有很大的意見喔.

說明一下 :

mysql_result 的 method 並沒有在 db_souces 下被運用.

一般情況下 , 我會利用 mysql_result 去取 出我要的 第 n 筆的 record .

然後用 while 告訴它我只要取幾筆..

而在沒有 conettion close 之前.

我就可以用 mysql_num_rows 去取得它的個數.

而我也沒有用 limit 去 下 query .

所以我可以 要出 我要的二種資料.

mysql 的function 並不是只有 fetch_array ....

為什麼一定要用 limit 去達成 page 效果

而 model 和 db_souces 又沒有提供 result 的用法

如此 即為 為什麼我覺得 cake在換頁的表現有待加強.

發表日期:2008/1/10 1:16
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
Quite a regular
註冊日期:
2007/12/31 1:05
文章: 58
re :
我知道下面的回應可能會變成打嘴砲,不過既然上面有問,FIEND有回,不回應一下不好意思。

#########################################

嘿嘿 怎麼會.. 我上了一課說 .^^

其實 我臉皮比較厚 , 討論問題的方式也比較 晰利 .

有更好的論點 小弟 很願意去吸收 .

在名詞的用法上 您就給在下上了一課.

也希望 在論點上相互推翻大家求進步 ^^



re :
2. 在多層架構下,每一層都有各自的MVC,FIEND認為不夠細膩可能是因為他覺得多層架構下仍維持一組MVC的緣故

3. 整個網際網路是「網」而非「層」的概念,因此MVC常常在實做上被打破,這是寫程式的權變,不能依此對MVC做適不適合的評論

這說法挺奇怪的,基本上 "三層式" 只是概念性的說法,以有別於主從式架構明顯的二層結構,並不是 "只有三層"。所以後來更常見的說法是 n-Tier 或 "分散式架構"。"層數"並不是愈多愈好,因此它"雖然"只有三層,並不表示它做的比較差。

還有一點,三層式並不等於 MVC ,雖然同樣是分三塊。

n-Tier的意義是將運算工作,分散交給不同的伺服器處理,以有效配置伺服器的處理效能。而最常見的分配策略,就是 Database, Application, Client 。

再說到 MVC ,則是基於"程式碼功能"的隔離策略。根據程式碼的功能分成 Model, View, Control 三個功能性區塊,以降低程式碼之間的耦合度,便於程式開發之分工與維護。

至於 n-Tier 和 MVC 之間出現扯不清的關聯,則是因為 n-Tier 在系統架構上就限制了程序員必須將不同功能的程式碼分開撰寫。在此結構性限制下,成熟的 MVC 策略顯然是程序員的上上之選。

事實上,就 web 應用開發工作內容來看,我們其實只在 n-Tier 架構中的 Application 和一部份的 Client 內容中打轉。MVC只被我們應用在其中的2層而已。如何在這2者之間劃上等號?

########################################

剛又看了一下 shirock 和 tokimeki 的文章 , 我大楖 了解 你們說的層和區的說法了

名詞的說法 再一次 跟大家說聲報歉 .

可能我一直看不起 mvc 而不接受使用它的名詞所致 .

也謝謝 shirock 將 model view control 和 content layer logic layer presentation 的 區別 細分給在下 .

#

網站程式 多層式架構設計 觀念 是在 mvc 還沒有出來前就有了 ..

當然小弟沒有想扭轉大家對名詞用法的 觀念 .

因為我的名詞用法是錯的 .


套用大大們的說法 小弟具體的表達對 mvc 架構的 不滿 .

一般網站應用程式中設計常見的層級 最常見的是三種 :

1. CONTENT LAYER

2. LOGIC LAYER

3. PRESENTATION LAYER

而 w3c 發佈的 xml 架構將它切割的更加的細 .

目地是讓它可以達到 :

1. 可維護性

2. 模組化

3. 展示邏輯層獨立 (標準化)

4. 內容邏輯層獨立 (標準化)

5. 可跨平台

6. 輕鬆變更資料庫

7. 程式碼可重覆使用


等等......


小弟指的 三層應該不同 mvc 指出的 三個模組 封裝 沒錯 .

但是不能把它 說成是三層式架構 再次謝謝二位老大的指教.

而我常把名詞混合使用 真的該打 ^^!! 覺得自己溝通能力要加強 呼呼

而這三層 mvc 則是 將 三種特性 邏輯特性 封裝起來 .

但也因此 使得 網站程式的架構上 變的不易維護 .

所以 在 真的專案實作上 我是完全不考慮使用 mvc 的做法的 .

但是不可否認的是 .

在多層的考量下 程式設計 會變的更加的困難 ....

新進工程師在入門上也會覺得寸步難行.

要教育到 維持 w3c 發佈出來的 xml 架構也還有一段距離.

所以 mvc 反而變的比 多層式架構的設計來的 活潑.

而讓許多 人淡忘 多層架構的好處.

也因為沒有多層的觀念.

在程式設計上 可以看到很多很頭大的設計 ......

所以我才對 mvc 這麼不爽 ^^!!

發表日期:2008/1/10 4:02
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
Just can't stay away
註冊日期:
2006/12/26 8:48
文章: 144
引用:

FIEND:

如果 我的 db 有 一千萬筆資料
我全部都要入 變數 再 count ...
應該會 error ....


1. count 陣列變數太誇張了..
我在 db
而且 findall 我己經下 limit 了說
塞入 變數 的想法 真的很酷 不敢用會被打死 .


你不了解查詢結果的記憶體管理機制。

當 PHP 向 DB 查詢資料後,資料內容就已經被儲存在 PHP 這方的記憶體內容了。說的更明白些:


$resource 
mysql_query($query);


此時 $resource 已經是一個儲存了查詢結果的變數(但型態不是陣列)。如果查詢結果有一千萬筆資料,那麼 $resultSet 就會配置那麼多的記憶體空間儲存那一千萬筆資料。接著再使用 mysql_fetch_array() 等方法取出個別資料記錄。

RTM:
引用:

PHP Manual::mysql_query

The returned result resource should be passed to mysql_fetch_array(), and other functions for dealing with result tables, to access the returned data.

----
PHP Manual::mysql_free_result

mysql_free_result() will free all memory associated with the result identifier result.

mysql_free_result() only needs to be called if you are concerned about how much memory is being used for queries that return large result sets.


那被查詢出的一千萬筆資料並不是保存在 DB 端。

有碼有真相,來一段測試過程。首先查詢一個上萬筆的記錄結果,然後 sleep() 暫停 PHP 程式執行。再以 top(Unix) 或 工作管理員(windows) 觀看 PHP 程式查詢前後使用的記憶體變化量,就知道查詢的資料結果是被儲存在哪了。

<?php
$link 
mysql_connect('localhost''mysql_user''mysql_password');

$query 'SELECT * FROM my_table'//有幾萬筆資料的查詢結果

$resource mysql_query($query$link);

sleep(120); //暫停2分鐘

mysql_free_result($resource);

sleep(120);

?>


你說把一千萬筆資料"塞入變數"會被打死,那你連 findAll() 都不能用,因為會被打死。你只能每次都向 DB 查詢"剛好一筆"資料。但我相信,這樣做絕對死更快。

ps. PHP 口中的 resource 其實就是一個"塞入很多內容的變數"。


引用:

FIEND:

mysql_result 的 method 並沒有在 db_souces 下被運用.
一般情況下 , 我會利用 mysql_result 去取 出我要的 第 n 筆的 record .
然後用 while 告訴它我只要取幾筆..
而在沒有 conettion close 之前.
我就可以用 mysql_num_rows 去取得它的個數.
而我也沒有用 limit 去 下 query .
所以我可以 要出 我要的二種資料.
mysql 的function 並不是只有 fetch_array ....
為什麼一定要用 limit 去達成 page 效果
而 model 和 db_souces 又沒有提供 result 的用法
如此 即為 為什麼我覺得 cake在換頁的表現有待加強.


一個經驗老道的 PHP programmer ,會定義一個 SPL::ArrayObject 的衍生類別,將 resource 及存取函數都封裝進去。


$resource 
mysql_query($query);

class 
ResultSet extends ArrayObject {
    protected 
$resource;

    public function 
__construct($resource) {
        
$this->resource $resource;
    }
    
    public function 
count() {
        return 
mysql_num_rows($this->resource);
    }

    public function 
offsetGet($index) {
        return 
mysql_result($this->resource$index);
    }  
}

$dbResultSet = new ResultSet($resource);

echo 
count($dbResultSet);


$record mysql_result($resource0);

$record $dbResultSet[0];


如此一來,用 count() 取得資料結果筆數有何問題?

啥,CakePHP 沒用 ArrayObject ,而是直接把 resource 的記錄內容轉成 array ?那也沒什麼不好啊,直接用陣列運算子就能操作資料了,比 mysql_xxx() 更簡單。所以你抱怨 "mysql_result 的 method 並沒有在 db_souces 下被運用",這毫無意義。


再說到 limit 的問題,這實際上就是記憶體管理的問題,也就是我在本文第一段回應的內容,但由於你不清楚這方面的機制,所以我再強調一次,在換頁功能中使用 limit 是為了節省記憶體。

最後,我要修正一下我前篇回應的錯誤。我前篇回應了忽略了 findAll() 有 limit n 的敘述在內,所以用 count() 得到的數目必定小於等於 n ,而不是結果總筆數。因為一次 交易只能回傳一個結果。就此而言,先用 findAll() 再用 findCount() 是不得已的舉措。

就算我在一次交易中塞入2行查詢敘述,一個查內容(limit n),一個查 count ,但 DB 只會回傳最後一行查詢敘述的結果,第一行敘述的結果則不會回傳。

不過老練的 SQL 人員會一招 UNION 指令,可以把2個查詢敘述併成一行,使得2個查詢結果合併為一個,就可以傳回來了。

發表日期:2008/1/10 11:46
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
Just can't stay away
註冊日期:
2006/12/26 8:48
文章: 144
你說的 W3C 架構,就是基於 MVC 策略的架構。你一邊說多層架構多好,又一邊抱怨 MVC 。顯然你還是沒搞清楚那些是什麼。

Anyway, 免費授業到此為止, 請你務必去找"觀念正確的書"看看。

發表日期:2008/1/10 11:56
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
Quite a regular
註冊日期:
2007/12/31 1:05
文章: 58
引用:

你不了解查詢結果的記憶體管理機制。

當 PHP 向 DB 查詢資料後,資料內容就已經被儲存在 PHP 這方的記憶體內容了。說的更明白些:

$resource = mysql_query($query);


此時 $resource 已經是一個儲存了查詢結果的變數(但型態不是陣列)。如果查詢結果有一千萬筆資料,那麼 $resultSet 就會配置那麼多的記憶體空間儲存那一千萬筆資料。接著再使用 mysql_fetch_array() 等引用:
方法取出個別資料記錄。



謝謝您花這麼多時間 不厭其煩的解說 這個問題 .

很高興可以跟您討論這個問題 .



我對您的講法保留很大的疑問 也對您的認知感到不可思議.

另外... 看到你做的實驗我不小心放聲大笑了 ^^!! SORRY .

我的認知 查詢結果是放在 DB 的 記憶體內容 .

然後 PHP 再去跟 DB SERVER 要.

當然對您做的實驗 我覺得 這個實驗不代表什麼.

如果 說 PHP 將 配置記憶體切到這麼大?

但不代表 它將 DB 的內容也全都放進記憶體了.

一般正常流程 PHP 會保留一些做為 連結用的 快取資料 量是很小的.

所以為何 PHP.INI 開 8MB 記憶體 我照樣可以 QUERY 3千萬筆資料做 REPORT

將 1G 的 TABLE 的資料 拉出來?

若如您所說 全都拉出來 放在 PHP MEMORY , 我覺得 這真的有點奇怪?

應該說 您的觀念 讓我覺得不可思議 DB 的連結 不可能是這樣設計的.

如果 遇到 TB 級的 DB 這種方式 大家都不用寫程式了.

所以 我實在無法說服自己 去相信 QUERY後 東西會全都放入 PHP 記憶體.

的說法.




引用:

$resource = mysql_query($query);

class ResultSet extends ArrayObject {
protected $resource;

public function __construct($resource) {
$this->resource = $resource;
}

public function count() {
return mysql_num_rows($this->resource);
}

public function offsetGet($index) {
return mysql_result($this->resource, $index);
}
}

$dbResultSet = new ResultSet($resource);

echo count($dbResultSet);


$record = mysql_result($resource, 0);

$record = $dbResultSet[0];


如此一來,用 count() 取得資料結果筆數有何問題?


我覺得你可能搞錯了.

上述的 SPL::ArrayObject 內容就是我習慣的寫法.

我很清礎上述的 OBJ 的用法 .

怎麼可能這樣用 , 你是不是搞錯了?

我覺得你對 OO 的觀念怪怪的 這個 OBJ 是去模擬 ARRAY

所以你 呼叫 COUNT 時 .

它其實等於 是去呼叫 ARRAY OBJ 的 COUNT

也就是去 呼叫

public function count() {
return mysql_num_rows($this->resource);
}

###

這個 用法 .NET 的 DBO 也是這樣用的.

所以不懂程式的人

都會以為是 DB 丟到 ARRAY ..

這個我很久以前就跟同事討論過了.

你不能說它是陣列.

而是它是去模擬 ARRAY .

引用:

你說的 W3C 架構,就是基於 MVC 策略的架構。你一邊說多層架構多好,又一邊抱怨 MVC 。顯然你還是沒搞清楚那些是什麼。

Anyway, 免費授業到此為止, 請你務必去找"觀念正確的書"看看。


W3C 就是基於 MVC 策略的架構?

你發明的嗎?

CCCC

發表日期:2008/1/10 13:11
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
Just can't stay away
註冊日期:
2006/12/26 8:48
文章: 144
你運氣不錯,剛好有這麼一篇:PHP Large result sets and summary tables.

文章中說:
引用:

Because by default mysql_query uses mysql_store_result C library call and buffers all result set in the process memory. Not good if there are over 50 millions of rows. Note this limit is not controlled by memory_limit PHP config variable because that only controls memory which passes via PHP memory management which does not apply to MySQL result set.


我苦命些,寫PHP程式時搭配過 MS SQL, PostgreSQL, DB2 。所以我還真的遇到查詢結果筆數太多,必須提高 memory_limit 設定值的時候。

==================

我從頭到尾都沒說 ResultSet 這個"我定義的類別"的實例是 array.

第一,我說 CakePHP 的 findAll() 回傳的是一個 array 。請問這有錯嗎?

第二,我說對於 $resource 這樣"不是陣列"的變數,我們會定義一個類別去封裝它,使得我們可以用"陣列運算子"去操作它的實例。老兄,運算子覆載是什麼知道吧?我有說 $dbResultSet 這個實例是一個 PHP 原生型態陣列(primitive type array)嗎?

第三,從純OO的角度來看,一個 ArrayObject 類別的實例就是一個 array。只是 Java/C#/PHP 在這方面做得不夠純,所以有 primitive type array ,也有 array object。

要不要看看 Ruby, JavaScript 的 array 是怎麼做的?如果你覺得那是初學者玩的,不妨再看看 SmallTalk 。它們的陣列可沒有分 primitive type array 和 array object 。

你把 Java/C# 這些混血OOPL 當作 OOPL 的標準來說別人不懂程式或不懂OO,未免可笑。

發表日期:2008/1/10 14:37
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
Quite a regular
註冊日期:
2007/12/31 1:05
文章: 58
我突然覺得自己很像烏賊 ^^!!

縮短一下 討論的內容.


1.

MVC != n-Tier

MVC 將 N-TIER 各別放在自己的 元件內 但也可以不要尊守 N-TIRE

導致 很多人太 FOCUS MVC 而忽略 N-TIER .

謝謝指教 .




RE :
####################################
我苦命些,寫PHP程式時搭配過 MS SQL, PostgreSQL, DB2 。所以我還真的遇到查詢結果筆數太多,必須提高 memory_limit 設定值的時候。
####################################

2. 有點偏離主題了 ^^!! SORRY 用詞激烈 跟您說聲報歉.

拉回主題 :

大家實驗的數據和想法盡然有這麼大的落差 .

A . 我的認知是 QUERY 完 資料會放在 DB 的記憶體 , PHP 端只會有一些快取的資料 .

B . shirock 的認知是 QUERY 完 資料會放在 PHP 的記憶體 .
(不知道有沒有看錯 因為我覺得這個想法很怪)

發表日期:2008/1/10 15:04
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
Just can't stay away
註冊日期:
2006/12/26 8:48
文章: 144
我都把參考文章貼出來了,你還不看就回覆啊。真服了你。

參考文章中已經很明白指出 mysql_query 跳過 PHP 內建記憶體配置機制,而直接使用 mysql C library 的函數儲存資料在 PHP 程序這端。而 memory_limit 只會管制到 PHP 內建記憶體配置機制的使用上限。所以 mysql_query 查詢大量資料時,不會受到 memory_limit 的限制。

你說你用 PHP +MySQL 查詢大量資料時不會受到 memory_limit 限制,原因在此。

但是其他資料庫的查詢函數則是用 PHP內建記憶體配置機制儲存資料。所以當我用 PHP 向 PostgreSQL, MS SQL 等 DB 查詢大筆資料內容時,就會受到 memory_limit 的限制。

這不是我的"認知",而是程式碼明擺著的事實。

發表日期:2008/1/10 16:27
應用擴展 工具箱


回覆: [分享] 小弟寫的 cakephp 換頁 排序 功能 (第一版)
Quite a regular
註冊日期:
2007/12/31 1:05
文章: 58
RE :
Because by default mysql_query uses mysql_store_result C library call and buffers all result set in the process memory. Not good if there are over 50 millions of rows. Note this limit is not controlled by memory_limit PHP config variable because that only controls memory which passes via PHP memory management which does not apply to MySQL result set.

mysql_query 跳過 PHP 內建記憶體配置機制,而直接使用 mysql C library 的函數儲存資料在 PHP 程序這端。而 memory_limit 只會管制到 PHP 內建記憶體配置機制的使用上限。所以 mysql_query 查詢大量資料時,不會受到 memory_limit 的限制。



###########

因為你是截取 BLOG 的文章 所以我覺得它只是 加強你的說法.


"result set" 這個字眼 小弟覺得它並不全然表示把資料全往 PHP C LIB MEMORY 放 .

而是把 OBJ INDEX 暫存在 MEMORY .

如果說 它會將 QUERY 結果全撈到記憶體

那為什麼上頭的說法 建議五千萬筆 以內呢?

假設我的 DB 是 TB 級的 .

不要說 五千萬 像你的說法 .

幾百萬筆資料 我在 SELECT * 時就灌爆 SERVER 的記憶體了.

根本就玩不下去.

站在 系統設計的角度.

您的論點我覺得根本就站不住腳 .

發表日期:2008/1/10 19:05
應用擴展 工具箱







[進階搜尋]