2010-01-16 27 views
1

我正在用php,ajax,javascript,mysql構建一個webapp。我一直在擔心一些事情,但不確定是否真的有問題。以下是代碼如何工作的基本概念......我想知道現在是否應該更改它,或者如果它是按照原樣使用的話。性能對我來說很重要......超過5,000名用戶應該可以在不出現任何性能問題的情況下使用該應用程序。我擔心的一部分只是作爲自學成才的開發人員的偏執狂,並不瞭解那裏的所有最佳實踐。php類的性能問題...我該怎麼做?

這裏是基本的web應用程序的功能:

用戶通過通過onclick事件瀏覽器中執行一個電話 - > AJAX調用phpPG1.php。 - > phpPG1.php對數據庫運行查詢並將結果存儲在數組中,然後包含另一個名爲HTMLphp.php的PHP頁面,從HTMLphp.php頁面實例化新對象,這是一個類 - >類的calles函數並傳遞包含查詢結果的數組 - >類函數生成HTML表並返回一個字符串 - > phpPG1.php頁返回帶有表數據的字符串給顯示字符串的ajax調用在它所屬的給定DIV標記中。

HTMLphp.php包含用於返回整個webapp的HTML表的所有函數。 HTMLphp.php看起來是這樣的:

Class HTML_stuff 
{ 
    function html_TABLE1($results_array) 
    { 

     $string = 'THE HTML TABLE WITH ITS DATA IN IT' 
     return $string 
    } 

    function html_TABLE2($results_array) 
    { 

     $string = 'THE HTML TABLE WITH ITS DATA IN IT' 
     return $string 
    } 

} 

所以,這是我的問題。 HTMLphp.php頁面中現在有5,606行代碼,代表該類中的100個左右的函數。基本上,我的web應用程序中的每個頁面都「包含」了此頁面,以便能夠使用類功能來顯示html表格。我用webapp完成了一半的工作,所以會有更多的代碼添加到這個文件中。我並不完全贊同計算機如何執行代碼,特別是在使用類對象時,但我理解「解釋性語言」如php的基礎知識。

我想知道這是不是一個好主意,如果我應該這樣做:對於HTML_stuff類中的每個函數,只需簡單地刪除每個函數的代碼,並將其放置在它自己單獨的.php頁面中包括像這樣:

Class HTML_stuff 
{ 
    function html_TABLE1($results_array) 
    { 
     include_once 'TABLE1.php'; //the html table for this function. 
     return $string; 
    } 

    function html_TABLE2($results_array) 
    { 
     include_once 'TABLE2.php'; 
     return $string; 
    } 
} 

我的基本假設是,我只包括所需的HTML,當我撥打電話的特定功能,從而降低了HTMLphp.php頁面的假設這個總體規模在整個網站會幫助性能......我在這個思想的左邊領域?我的一部分人認爲這與第一種選擇是一樣的,只是組織方式不同而已,它會對整體表現做任何事情。不過,我確實在某處讀到「較少」的表現更好。

其他人做了什麼,或者還有其他關於如何做這種事情的最佳做法?對於5,000到10,000個用戶的網站而言,這可以忽略不計嗎?

謝謝。

+0

「代表班級中的100個左右的功能」 - 你只有50%完成了這門課程?這聽起來很奇怪,至少可以說;-) – VolkerK 2010-01-16 00:42:12

回答

2

將特定的PHP文件包含在函數/方法中而不是打開包含文件中,肯定會有所幫助,因爲只有所需的項目纔會被包含和解釋。但PHP解釋器仍然需要經歷那個龐大類的5000行代碼,而恕我直言是一種非常糟糕的解決方法,並且將是一個主要瓶頸。

實際上,5000-10000個用戶不是很多,但它又取決於使用情況。如果它們都可以同時登錄,並在服務器上發出請求(類似於每分鐘10k個請求或約166個請求/秒),並且很少或沒有涉及緩存,那麼它可能是一個嚴重的瓶頸,但是再次取決於很多因素。相反,一個好方法是使用某種類型的負載測試工具,如abJMeter,並找出真實的。

如果結果在做這些測試後看起來不太好,那麼找出瓶頸是什麼。您可以使用APC或Memcache來實施緩存,或其他各種方式來提高性能。但是在黑暗中拍攝時,我會說5k線條班是你應該考慮拆分的東西,不僅僅是出於性能方面的原因,而且還有一個好的設計。也許,如果構建這些HTML片斷的邏輯不是太複雜,那麼可以通過將數據作爲JSON/XML發送,然後讓Javascript使用此數據構造表來將其卸載到客戶端。

+0

我查看了將表的構建卸載到客戶端,但邏輯足夠複雜,我調用多個php類對象將各種數據部分放入表中,我真的看不到我如何擁有客戶端代之以做。另一個問題是,表列會從結果集到結果集發生很大變化,所以創建一個可以反覆使用的類,只是根據輸入輸出一個表,我看不出如何去做這個時候列總是在變化。 – Ronedog 2010-01-16 01:48:27

+0

如果數據是以對象數組的形式提供的,那麼它只是循環訪問值和創建每行的問題。像jQuery和MooTools這樣的庫在簡化DOM創建方面非常出色。但正如你所說,由於html邏輯非常複雜,將其卸載到客戶端可能會有太多工作。 – Anurag 2010-02-02 23:40:58

2

你真的有超過100個功能在你的班級?
也許(不,我110%肯定)你的班級沒有很好的設計,特別是如果它是「唯一」的HTML表格創建。

面向對象編程是一種很好的技術,但您必須正確使用它。我覺得你只是把所有的程序功能放到一個地方。這不是OOP。而且很難維護代碼。

100個方法在一個類中的方式太多了。重構你的代碼,把它放到多個類中,只導入你真正需要的。即使不知道更多關於你的應用程序,我可以說它(和你)會從中受益。

我不能讓你使用具有良好的良心這樣一類;)

你問你應該做些什麼呢?
PHP的背景下學習OOP,也許讀了一些關於Design Patterns的內容。

編輯:

我剛纔看到你有一個函數來創建應用程序中每個HTML,這是正確的?如果是這樣的話,你真的應該考慮動態地構建你的表,這將導致更少的代碼,並且可能更容易維護。

+0

我同意,這就是爲什麼我想把它放在那裏。當你說動態構建表時,你究竟意味着什麼?你能給我一個你如何做到這一點的代碼示例以及實現它的可能方式嗎?每個頁面基本上都是DISPLAY的,EDIT的,創建新的數據。例如,以聯繫人列表爲例,顯示部分列出了表格中的所有聯繫人,編輯部分列出了具有輸入框的聯繫人之一以更改數據,新表格與編輯頁面完全相同。我應該使用編輯,顯示和創建新功能爲該頁面創建一個類嗎? – Ronedog 2010-01-16 01:10:35

0

問題已解決。我改變了代碼,只讀取通話時需要的功能。現在它讀取幾百行而不是5,000行。