Bài viết theo PHP performance tips của: Eric Higgins, Google Webmaster
Để hiểu rõ nội dung tác giả khuyến cáo trình độ PHP từ mức bắt đầu cho tới trung bình.
PHP là một ngôn ngữ kịch bản thông dụng, được sử dụng ở nhiều site. Trong bài viết này chúng tôi hy vọng sẽ giúp bạn tăng hiệu năng cho mã PHP của mình bằng vài sự thay đổi mà bạn có thể thực hiện nhanh chóng, dễ dàng. Hãy nhớ rằng hiệu năng còn phụ thuộc nhiều vào phiên bản PHP, môi trường máy chủ và sự phức tạp code của bạn
Video
Profile your code to pinpoint bottlenecks
"Hoare's dictum states that Premature optimization is the root of all evil",
Một sai lầm khi cố gắng làm cho website hoạt động nhanh hơn là sự hấp tấp trong quá trình tối ưu hoá. Trước khi chỉnh sửa mã nguồn, bạn cần phải xác định chính xác nguyên nhân làm website hoạt động kém hiệu quả qua bài viết này và rất nhiều những bài viết về việc tối ưu hoá mã nguồn PHP khác. Hoặc có thể nguyên nhận do cơ sở dữ liệu hoạt động không chính xác, sự cố về network...Bằng việc định hình mã nguồn php của mình, bạn có thể xác định đâu là vấn đề gây nện trở ngại.
Upgrade your version of PHP
Nhóm phát triển PHP đã có một số cải tiến đáng kể qua nhiều năm. Nếu máy chủ của bạn vẫn chạy sử dụng phiên bản cũ như PHP 3 hay PHP 4 hãy nâng cấp lên phiên bản mới trước khi bạn tiến hành tối ưu code.
Use caching
Sử dụng một module cache, như là Memcache, hoặc hệ thống templating hỗ trợ cache như Smarty có thể giúp bạn tăng hiệu quả cho website bằng cách cache kết quả database và các trang được tạo ra.
Use output buffering
PHP sử dụng bộ nhớ đệm để lưu tất cả dữ liệu mà mã của bạn in ra. Bộ đệm này có thể khiến cho các trang của bạn có vẻ như chậm chạp, bởi vì người dùng phải đợi để bộ đệm được lấp đầy trước khi chuyển tới họ dữ liệu. May mắn là bạn có thể thay đổi một số thứ để khiến PHP đẩy dữ liệu ra sớm hơn, làm cho người dùng cảm thấy website hoạt động nhanh hơn.
Don't copy variables for no reason
Đôi khi người dùng PHP chưa có kinh nghiệm cố gắng làm cho code của mình 'sạch sẽ hơn' bằng cách copy biến đã được xác định thành biến với tên ngắn hơn trước khi làm việc với chúng. Thực tế là việc này lại tiêu phí gấp đôi lượng bộ nhớ, vì vậy dẫn đến mã thực thi chậm hơn. Ở ví dụ sau, hãy tưởng tượng nếu một người dùng xấu đưa vào trường textarea ký tự có dung lượng 512KB. Điều này đồng nghĩa với việc bạn mất 1MB bộ nhớ!
$description = strip_tags($_POST['description']);
echo $description;
Không có lý do nào để copy giá trị ở đây cả. Bạn có thể đơn giản sử dụng như sau để tránh sự hao phí bộ nhớ:
echo strip_tags($_POST['description']);
Avoid doing SQL queries within a loop
Một lỗi thông dụng nữa là đặt một câu truy vấn SQL trong vòng lặp. Kết quả là database bị 'quay mòng mòng' dẫn tới việc thực thi chậm chạp. Ở ví dụ sau, bạn có thể thay đổi vòng lặp để tạo ra câu truy vấn đơn và chèn vào tất cả người dùng 1 lần.
foreach ($userList as $user) {
$query = 'INSERT INTO users (first_name,last_name) VALUES("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
mysql_query($query);
}
Produces:
INSERT INTO users (first_name,last_name) VALUES("John", "Doe")
Thay vì sử dụng vòng lặp, bạn có thể tổ hợp dữ liệu lại vào một câu truy vấn đơn.
$userData = [];
foreach ($userList as $user) {
$userData[] = '("' . $user['first_name'] . '", "' . $user['last_name'] . '")';
}
$query = 'INSERT INTO users (first_name,last_name) VALUES' . implode(',', $iserData); mysql_query($query);
Produces:
INSERT INTO users (first_name,last_name) VALUES("John", "Doe"),("Jane", "Doe")...
Use single-quotes for long strings
PHP engine cho phép cả dấu nháy đơn (' ') và dấu nháy kép (" ") để bao một chuỗi, nhưng chúng khác nhau!. Sử dụng dấu nháy kép cho chuỗi, PHP engine sẽ phải tìm trong chuỗi xem có biến hay không, và thay thế chúng bằng giá trị. Với chuỗi dài mà không chứa biến đó là một sự lãng phí.
$output = "This is the content for a very long article which is a few hundred lines long and goes on and on and on ...";
Đổi từ dấu nháy kép sang dấu nháy đơn tránh được việc PHP engine phải mất thêm một công đoạn như đã nói ở trên:
$output = 'This is the content for a very long article which is a few hundred lines long and goes on and on and on ...';
Use switch/case instead of if/else
Sử dụng mệnh đề switch/case thay cho mệnh đề if/else và thử lại với biến đơn để thấy kết quả hiệu năng, dễ đọc, tính bảo trì. Lưu ý rằng Switch/case là phép so sánh không chặt chẽ, bạn cần cân nhắc thật kĩ khi sử dụng mệnh đề này.
if($_POST['action'] == 'add') {
addUser();
} elseif ($_POST['action'] == 'delete') {
deleteUser();
} elseif ($_POST['action'] == 'edit') {
editUser();
} else {
defaultAction();
}
Thay vào đó, bạn có thể sử dụng Switch/case để kiểm tra lại giá trị của biến$_POST['action']:
switch($_POST['action']) {
case 'add': addUser();
break;
case 'delete': deleteUser();
break;
case 'edit': editUser();
break;
default: defaultAction();
break;
}
Additional resources
|