[PHP] Các kỹ thuật tăng tốc website

Nơi chức các bài viết dạng hướng dẫn, thủ thuật lập trình, kinh nghiệm lập trình ... được chia sẻ từ các thành viên
Trả lời
Hình đại diện của người dùng
nhatle
Bài viết: 8
Ngày tham gia: T.Tư Tháng 4 12, 2017 7:59 pm
Been thanked: 1 time

T.Năm Tháng 4 20, 2017 4:46 pm

Hôm nay mình sẽ chia sẻ các kỹ thuật tăng tốc website mà mình được biết :D
1. Vị trí server hosting
Hãy lựa chọn nơi đặt website của bạn ở các vùng địa lý mà phần lớn người dùng website của bạn ở đó, để giúp việc truy cập sẽ được nhanh hơn.
2. Giảm bớt các request
Sử dụng số lượng vừa phải các hình ảnh, script trên trang web. Nếu có thể thì hãy gom các file css, javascript lại để giảm bớt các request.
3. Tối ưu hóa các MySQL Query
  • Hạn chế join các bảng thì sẽ tốt hơn
  • Index hợp lý các field (nên index các field hay tìm kiếm)
  • Có thể chấp nhận dữ liệu dư thừa để tăng tốc độ xử lý (tùy trường hợp :D )
  • Tuyệt đối không dùng SELECT * chỉ select những field cần dùng
4. Nén kết quả trả về của file PHP
Sử dụng đoạn code sau:

Mã: Chọn hết

ob_start('ob_gzhandler'); 
5. Cache ở client dùng mod_header
Chúng ta có thể tạo cache ở máy client bằng cách sử dụng đoạn code sau:

Mã: Chọn hết

# cache images và flash 30 ngày
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf)$">
Header set Cache-Control "max-age=2592000"
</FilesMatch>
# cache text, css, và javascript, html files 1 tuần
<FilesMatch ".(js|css|pdf|txt|htm|html)$">
Header set Cache-Control "max-age=604800"
</FilesMatch>
# không cache scripts files
<FilesMatch "\.(php)$">
Header unset Cache-Control
</FilesMatch>
6. Opcode caching
Opcode là code của các trang PHP đã được dịch xong và lưu trong share memory để dùng lại mà không phải dịch lại khi có request. Có nhiều giải pháp bạn có thể dùng: 7. Server file caching
Nội dung file được lưu ở 1 nơi nào đó trên server sau khi kết xuất lần đầu tiên. Với những request đến sau, chỉ đọc file kết quả rồi trả về ngay lập tức
Cách làm như sau:
  1. Tạo 1 folder mới có tên là cache trong folder website
  • Tạo file .htaccess trong folder vừa mới tạo với nội dung như sau:

    Mã: Chọn hết

    Deny from all
  • Tạo trang cachebegin.php với nội dung sau:

    Mã: Chọn hết

    <?php
    $cachedir = 'cache/'; // folder lưu các file cache
    $cachetime = 3600*12; // Thời gian (Số giây) lưu files cache 
    $cacheext = 'ch'; // phần mở rộng của file được cache 
    $page ='http://'. $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; 
    $pathfile = $cachedir . md5($page) . '.' . $cacheext; 
    $file_created =(file_exists($pathfile))? filemtime($pathfile):0;
    if (time() - $cachetime < $file_created) {
        ob_start('ob_gzhandler');
        readfile($pathfile);   //đọc 1 file và echo nội dung ra buffer    
        ob_end_flush();
        exit();
    }
    ob_start('ob_gzhandler');
    
  • Tạo trang cacheend.php với nội dung như sau:

    Mã: Chọn hết

    <?php
    $cachedir = '../cache/'; 
    $cacheext = 'ch'; 
    $page = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']; 
    $pathfile = $cachedir . md5($page) . '.' . $cacheext; 
    $fp = fopen($pathfile, 'w'); 
    fwrite($fp, ob_get_contents());
    fclose($fp); 
    ob_end_flush(); 
    
  • Nhúng code xử lý cache vào trang chủ
    • Thêm vào dòng

      Mã: Chọn hết

      require_once "cachebegin.php";
      $str=ob_get_clean(); 
      ob_start('ob_gzhandler');
      echo $str;
      require_once "cacheend.php";
      
Lần đầu tiên viết bài, có gì sai sót mong mọi người góp ý :)
Đường tuy dài không đi không bao giờ đến
Việc tuy nhỏ không làm không bao giờ nên.

Hình đại diện của người dùng
luutruonghailan
Bài viết: 83
Ngày tham gia: T.Sáu Tháng 4 07, 2017 8:35 am
Đến từ: ZendVN
Has thanked: 2 time
Been thanked: 2 time
Liên hệ:

T.Sáu Tháng 4 21, 2017 2:12 pm

Cảm ơn bài chia sẻ của em, anh và mọi người chờ đợi các chia sẻ tiếp theo từ em đó :P !!!
;) ;) Multiple files in dev, a single file in prod

Hình đại diện của người dùng
DevCùi-VN
Bài viết: 7
Ngày tham gia: T.Hai Tháng 4 10, 2017 5:41 pm
Đến từ: Appota INC
Liên hệ:

T.Hai Tháng 4 24, 2017 5:37 pm

Mình xin bổ sung :
1. Nếu dùng database MYSQL thì Bạn có thể sử dụng mô hình MYSQL Master- Slave
Tại thời điểm hoạt động bình thường mọi request sẽ được đưa đến vào MySQL master. Khi MySQL master die, request sẽ được đẩy qua cho MySQL slave xử lí. Khi MySQL master hoạt động lại bình thường, request sẽ được trả về cho MySQL master.
2. Trong các vòng foreach bạn nên sử dụng unset() :D

Hình đại diện của người dùng
nhatle
Bài viết: 8
Ngày tham gia: T.Tư Tháng 4 12, 2017 7:59 pm
Been thanked: 1 time

T.Tư Tháng 4 26, 2017 7:31 am

DevCùi-VN đã viết:
T.Hai Tháng 4 24, 2017 5:37 pm
Mình xin bổ sung :
1. Nếu dùng database MYSQL thì Bạn có thể sử dụng mô hình MYSQL Master- Slave
Tại thời điểm hoạt động bình thường mọi request sẽ được đưa đến vào MySQL master. Khi MySQL master die, request sẽ được đẩy qua cho MySQL slave xử lí. Khi MySQL master hoạt động lại bình thường, request sẽ được trả về cho MySQL master.
2. Trong các vòng foreach bạn nên sử dụng unset() :D
Mình cảm ơn chia sẻ của bạn, mình sẽ tìm hiểu thêm về cái này :)
Đường tuy dài không đi không bao giờ đến
Việc tuy nhỏ không làm không bao giờ nên.

Hình đại diện của người dùng
khoanguyen
Bài viết: 15
Ngày tham gia: T.Ba Tháng 4 11, 2017 4:33 pm
Đến từ: http://google.com
Been thanked: 2 time

T.Bảy Tháng 4 29, 2017 12:35 am

DevCùi-VN đã viết:
T.Hai Tháng 4 24, 2017 5:37 pm
Mình xin bổ sung :
1. Nếu dùng database MYSQL thì Bạn có thể sử dụng mô hình MYSQL Master- Slave
Tại thời điểm hoạt động bình thường mọi request sẽ được đưa đến vào MySQL master. Khi MySQL master die, request sẽ được đẩy qua cho MySQL slave xử lí. Khi MySQL master hoạt động lại bình thường, request sẽ được trả về cho MySQL master.
Bạn cấu hình này nên cẩn thận. Con Salve (S) chỉ có nhiệm vụ nhận dữ liệu từ Master (M) và không tự động sync dữ liệu ngược lại M. Nên khi con M chết con S lên chạy và nhận dữ liệu thì khi con M sống dậy không nhận được data mới nhất, nên phải import lại = tay rất nguy hiểm.

=> Giải pháp của mình hiện sử dụng là cấu hình Master - Master, khi 1 trong 2 con chết thì con còn lại sẽ lên làm Master và tự động sync data qua lại con Master chính nếu Master chính được mở lên lại.

Còn để tăng tốc con Database thì chỉ có tiền ($$$) mở rộng phân tán dữ liệu nó ra "MySQL Cluster".

Còn nếu bạn ngầu và đẹp trai hơn nữa, thì optimize lúc start dự án luôn. Sử dụng 2 query connection 1 cho database ghi record và 1 cho database chỉ read record thì tuyệt
Tập tin đính kèm
mevNr10.png
mevNr10.png (99.42 KiB) Đã xem 512 lần
Nothing is impossible, keep moving forward!!!

Hình đại diện của người dùng
DevCùi-VN
Bài viết: 7
Ngày tham gia: T.Hai Tháng 4 10, 2017 5:41 pm
Đến từ: Appota INC
Liên hệ:

T.Tư Tháng 5 03, 2017 4:52 pm

khoanguyen đã viết:
T.Bảy Tháng 4 29, 2017 12:35 am
Bạn cấu hình này nên cẩn thận. Con Salve (S) chỉ có nhiệm vụ nhận dữ liệu từ Master (M) và không tự động sync dữ liệu ngược lại M. Nên khi con M chết con S lên chạy và nhận dữ liệu thì khi con M sống dậy không nhận được data mới nhất, nên phải import lại = tay rất nguy hiểm.

=> Giải pháp của mình hiện sử dụng là cấu hình Master - Master, khi 1 trong 2 con chết thì con còn lại sẽ lên làm Master và tự động sync data qua lại con Master chính nếu Master chính được mở lên lại.

Còn để tăng tốc con Database thì chỉ có tiền ($$$) mở rộng phân tán dữ liệu nó ra "MySQL Cluster".

Còn nếu bạn ngầu và đẹp trai hơn nữa, thì optimize lúc start dự án luôn. Sử dụng 2 query connection 1 cho database ghi record và 1 cho database chỉ read record thì tuyệt
- Cảm ơn bạn :shock: .. Sao không thấy nút like đâu nhỉ ?

Trả lời
  • Thông tin
  • Đang trực tuyến

    Đang xem chuyên mục này: Không có thành viên nào trực tuyến.2 khách