2012-03-01 159 views
2

我最近一直在爲爲我工作的公司構建的網站進行大修。因爲我在一年前開始了這個項目,所以我的編程技巧已經有了很大的提高,我希望能夠加快網站的速度。我對這個項目的主要焦點是安全性和速度。我一直在做的一件事是改變我所有的PHP連接,以確保它們安全快速。這是我一般遵循從數據庫中提取的東西時的格式:優化PHP連接

<?php 

    //Connect to MySQL 
    require_once('includes/config.php'); 

    $link = mysql_connect($host, $user, $pass); 
    if(!$link) { 
     die('Server connection failed. Please refresh the window. If this problem persits, please send an e-mail to <me>'); 
    } 
    $db = mysql_select_db($database); 
    if(!$db) { 
     die("Unable to select database"); 
    } 

    $qry="SELECT * FROM <table> WHERE Category='<parameter>' ORDER BY substr(`P/N`,1,4) ASC"; 
    $result=mysql_query($qry); 

while($row = mysql_fetch_array($result)) 
    { 
    echo " 
    //Output code 
"; 
    } 
?> 

首先,什麼是存儲連接變量的最佳方式,如MySQL用戶名/密碼?在上面的代碼中,我使用了一個包含我所有服務器變量的require_once('includes/config.php')。這是一個安全的方式來做到這一點?或者,還有更好的方法?其次,我應該更好地管理內存嗎?我正在閱讀關於mysql_close()的這個網站上的PHP文檔和問題,並且我得出結論,我並不需要它。但是,最近我一直在獲得相當數量的失敗連接。

警告:mysql_connect()函數[function.mysql-CONNECT]:無法連接到MySQL服務器

是否有可能這個錯誤是我的一個壞的編碼技術結束了嗎?或者更可能與我們的託管公司?

回答

2

您可以將您的登錄名和密碼存儲在Web根目錄下,並將其包含在require_once()中。

您可以使用mysql_pconnect()來使用持久連接,以便將來的查詢只使用打開的連接而不嘗試重新連接。理想情況下,您希望儘可能多地使用緩存層來消除這些連接,以便USER只訪問緩存,並且您的緩存編寫器只能訪問數據庫。然後,您設置一個cron或事件驅動的系統,以合理的時間間隔更新緩存,以根據您的應用程序需求控制負載。

+0

如果我們自己沒有託管網站,這可能嗎? – 2012-03-01 17:59:24

+0

當然,我不明白爲什麼不。我已經爲在Hostrocket和MediaTemple上託管自己站點的客戶完成了所有這些功能。 – AlienWebguy 2012-03-01 18:09:16

+0

OMG pconnect作爲一種治療方法。 – 2012-03-01 18:10:28

0

您應該擁有MySQL root用戶名和密碼,這樣人們無法通過互聯網訪問文件,但PHP仍然可以像在本地計算機上一樣。這可以避免像搞亂PHP配置這樣的事情,使你的密碼可以訪問。

+0

如果我們自己沒有託管網站,這可能嗎? – 2012-03-01 17:59:01

+0

是的,如果你使用FTP你有一個文件夾叫做public_html或htdocs或類似的文件必須在裏面可以通過互聯網訪問? – Joel 2012-03-01 18:48:23

1

一噸人存儲他們的數據庫連接像這樣和require它根據需要。你可以使用一個ORM層,如RedBeanDoctrine來抽象連接,所以你的代碼中沒有直接的sql。

mysql_close()這裏的manual說什麼:

mysql_close()關閉到與指定連接標識所關聯的MySQL服務器 非持久連接。

通常不需要使用mysql_close(),因爲非持久性打開 鏈接在腳本執行結束時自動關閉。

作爲Joel提到的,你絕對不應該在一個面向web的應用程序上執行查詢,使用戶只有訪問數據庫所需的權限。在任何地方打開root訪問權限只是要求被黑客入侵。

-3

這是一個安全的方法嗎?

警告:mysql_connect()函數[function.mysql-CONNECT]:無法連接到MySQL服務器

這就是問題數據庫服務器,而不是你的應用程序