2009-02-27 39 views
24

Tôi cần lưu trữ một loạt thông tin cấu hình trong PHP.Cách tốt nhất để lưu trữ các biến cấu hình trong PHP là gì?

Tôi suy nghĩ về sau ....

// Doesn't seem right. 
$mysqlPass = 'password'; 

// Seems slightly better. 
$config = array(
    'mysql_pass' => 'password' 
); 

// Seems dangerous having this data accessible by anything. but it can't be 
// changed via this method. 
define('MYSQL_PASSWORD', 'password'); 

// Don't know if this is such a good idea. 
class Config 
{ 
    const static MYSQL_PASSWORD = 'password'; 
}  

Đây là tất cả tôi đã nghĩ đến việc cho đến nay. Tôi dự định nhập thông tin cấu hình này vào ứng dụng của tôi với require /config.inc.php.

Điều gì làm việc cho bạn liên quan đến lưu trữ dữ liệu cấu hình và thực tiễn tốt nhất liên quan đến điều này là gì?

Trả lời

7

Tôi luôn đi với tùy chọn # 2 và chỉ đảm bảo rằng không có ai ngoài chủ sở hữu có bất kỳ loại quyền truy cập nào vào nó. Đây là phương pháp phổ biến nhất trong số các ứng dụng PHP như Joomla, vBulletin, Gallery và nhiều ứng dụng khác.

Phương pháp đầu tiên quá lộn xộn với tôi (khả năng đọc) và thứ ba là quá nguy hiểm để thực hiện. Tôi đã không bao giờ nghĩ về phương pháp lớp, vì vậy một người nào đó có thể cung cấp đầu vào của họ trên đó. Nhưng tôi đoán nó là tốt miễn là quyền truy cập được sử dụng vào việc sử dụng của lớp.


Ví dụ ..

define('EXAMPLE1', "test1"); // scenario 1 
$example2 = "test2"; // scenario 2 

function DealWithUserInput($input) 
{ 
    return eval($input); 
} 

Bây giờ ví dụ mã này thực sự là ngớ ngẩn, nhưng chỉ là một ví dụ. Hãy xem xét những gì có thể được trả về bởi chức năng tùy thuộc vào kịch bản mà người dùng có thể cố gắng sử dụng trong đầu vào của họ.

Trường hợp 2 sẽ chỉ gây ra sự cố nếu bạn đặt nó thành toàn cầu trong hàm. Nếu không, nó nằm ngoài phạm vi và không thể truy cập được.

+0

Có nguy hiểm trong cách mà nếu một số người dùng nhập vào với MYSQL_PASSWORD nó có thể được thông qua với mật khẩu thực tế? – alex

+0

Đó sẽ là những gì có thể xảy ra nếu bạn làm theo phương pháp thứ hai mà bạn đã liệt kê. Về bản chất, nó đặt nó như là một biến toàn cầu, có thể xem được trong bất kỳ phạm vi nào. Bạn có thể chọn cách các lớp hoặc chức năng có thể truy cập mảng $ config, miễn là bạn không hiển thị nó ở phạm vi sai, bạn nên ổn. –

+0

Đã chỉnh sửa bài đăng để đưa ra ví dụ về hai cách khác nhau mà bạn có thể có nội dung được xác định trong mã của mình và cách người dùng có thể nhận được thông tin. –

1

Tôi thường sử dụng phương pháp thứ hai ... Khi xử lý các kết nối cơ sở dữ liệu, tôi thường mở một kết nối ở đầu yêu cầu, sau đó đóng kết nối ở cuối. Tôi có một chức năng thiết lập kết nối, sau đó loại bỏ tên người dùng/mật khẩu khỏi mảng toàn cầu (với hàm unset()), Điều này ngăn cản các phần khác của hệ thống truy cập dữ liệu kết nối mysql "nhạy cảm".

0

Tôi cũng có tùy chọn 2 cho hầu hết các giá trị cấu hình. Nếu bạn sẽ triển khai Lớp thì tôi sẽ liên kết các giá trị cụ thể với Lớp mà nó ảnh hưởng thay vì Lớp cấu hình chung.

Trong ví dụ của bạn, Lớp của bạn sẽ dành cho kết nối cơ sở dữ liệu và một cá thể sẽ lưu mật khẩu, db_name, v.v. Điều này sẽ gói gọn dữ liệu và cũng cung cấp phương tiện dễ dàng để tạo nhiều kết nối nếu cần.

+0

Đúng vậy, ngoại trừ khi bạn muốn chỉnh sửa một tệp để có thể thay đổi bất kỳ dữ liệu cấu hình nào, thì các hằng số được gắn với một lớp Db sẽ làm cho nó trở nên khó khăn hơn một điểm truy cập (đó là điều tôi muốn) – alex

4

Tôi muốn nói điều này cũng phụ thuộc vào userbase một chút. Nếu cấu hình phải rất thân thiện với người dùng hoặc người dùng phải có khả năng thay đổi cấu hình qua web, v.v.

Tôi sử dụng Zend Config Ini cho cài đặt này và các cài đặt khác được lưu trong SQL DB.

+0

Chưa bao giờ nghe về phương pháp đó trước đây. Tốt để biết! –

Các vấn đề liên quan