2012-01-17 30 views
3

我正在爲我的網站編寫一個API,以及一個相當大的類來處理所有的API請求。做未使用的mysql連接會減慢腳本嗎?

大部分頁面(如果不是全部)網站上的所有頁面都會在加載時向api發送至少一個請求。這個網站最重要的優先事項是效率和結果,非常快速的服務器處理。

因此,當涉及到類和某些PHP函數時,我會尋求一些建議。

首先,它看起來像我正在寫的類可能最終將成爲大約3000行代碼。如果這是在每個頁面上初始化的,忽略這樣一個事實,即每個頁面只能使用一個或兩個類中的函數,這會使API變得更慢嗎?我是否應該爲每個類方法查看帶有擴展類的單獨文件?其次,我目前擁有與目錄中單獨文件中各種數據庫的所有連接。在每個連接中都有函數mysql_pconnect()。目前,我只需要這些文件。所以如果方法需要連接到x數據庫,那麼我只需將require(connection ...)放入方法中即可。在一個類中包含文件不好嗎?

我在問,因爲唯一的其他解決方案是要求頁面頂部的所有連接,以便類可以訪問它們而不需要每種方法。這就是爲什麼我想知道是否一次連接多個連接,即使它們沒有被使用,也是在服務器上徵稅?

所以三個問題真的:

  1. 是否即使正在使用在每一頁減慢腳本運行時,年初啓動的一大類只有一個類的方法?這就是爲什麼人們使用'class extends class'嗎?
  2. 在一個類中'require()'文件不好嗎?
  3. 未使用的連接到mysql數據庫會減慢腳本的運行時間嗎?

回答

3

不,一個未使用的MySQL連接不會消耗太多(如果有的話)cpu時間,儘管它會佔用一些內存來處理'狀態'的各個位,連接基礎。

但是請注意,MySQL的連接協議實際上相當「輕量級」。維持一個永久連接池聽起來很有吸引力,但建立新連接的成本已經非常低了。

持久連接是解決連接開銷的快速解決方案,但它們確實帶來了問題。最糟糕的是被遺棄的連接可能會使連接處於不確定狀態(進行中的事務,更改的服務器變量/配置等等),除非您非常小心,否則很容易造成無意中的死鎖。

+0

謝謝你的回覆。我不太明白無意之間的僵局是什麼意思。你能否爲我解釋一些細節? – 2012-01-17 19:51:09

+0

好的。某些腳本執行,啓動事務,建立一些鎖,然後由於任何原因而中止。如果它使用到數據庫的持久連接,那麼即使腳本已經死亡,該連接也會保持活動狀態。稍後,一些其他腳本被分配該連接,啓動它自己的數據庫操作,啓動事務,獲取鎖等等。因爲這個新腳本不知道以前發生了什麼,所以很容易開始請求鎖(明確地或以其他方式)被舊的死亡腳本的操作覆蓋,現在你被卡住了。 – 2012-01-17 21:34:06

+0

好吧,我正準備重寫我的class.mysql.php文件,這個文件實際上是一個sql函數庫,可以更快地執行查詢。你會建議我在這個班級內執行什麼來防止死鎖?試着抓..?儘管如果失敗的話,它不會再嘗試。你對上述其他問題有任何想法嗎? – 2012-01-17 22:01:36

1

如果你正在編寫一個API將數據從你的數據庫提供給多個第三方,那麼最好不要讓他們查詢數據庫,甚至不要通過web服務(除非你有第二到第二個db變種,各方需要立即)

更好的辦法是將xml文件寫入受保護的位置,並使用web服務來授權第三方並提供xml文件。 然後定期更新xml。

+0

我不允許任何第三方訪問數據庫查詢,所以這不是一個問題。我只想知道,在每個頁面頂部啓動一個類是否會增加腳本的運行時間,即使我只使用類的一個/兩個方法? – 2012-01-18 01:10:57

+0

爲什麼你需要一個API,如果只有你查詢數據庫? – Erik 2012-01-19 00:31:06

+0

我們的iPhone應用程序也查詢它。另外,我們希望將來能夠訪問其他人,但如果確實存在,我會製作一個SDK以防止人們訪問這些連接。 – 2012-01-19 01:58:45