Không Có Gì

www.mediafire.com/tuchikara


Bạn nghĩ gì về bài viết này?

Fix lỗi Opencart load chậm

Thực ra mình không muốn viết dài, nhưng phải ghi chi tiết để các bạn hiểu rõ nguyên nhân cũng như cách khắc phục nếu chẳng may website của các bạn cũng bị trường hợp tương tự.

Hôm 2/4 vừa rồi site vpptuantu.com bên mình không thể truy cập, trang web load rất chậm. Đến đầu buổi chiều thì không vào được luôn, bị nhà cung cấp host tạm ngưng phục vụ. Thật là tai họa….

Sau khi kiểm tra, mình có liên hệ lại với bên StableHost thì được trả lời là web của mình sử dụng tài nguyên CPU và bộ nhớ vượt quy định cho phép. (Chỉ được sử dụng tài nguyên từ 5% – 95% trong khoảng thời gian 90s đổ lại). Trong khi đó vpptuantu.com lúc này đang chạy từ 100% – 200% liên tục luôn. Và họ có dẫn chứng minh họa để diễn giải việc tạm ngưng phục vụ là đúng. Xem xong hình thì không thể cãi rồi.

CPU_usage

Ngoài ra họ còn chỉ rõ những sript nào gây ra tình trạng này. Đoạn script họ gửi thì nhiều, nhưng có một đoạn được lặp lại nhiều lần. Các bạn xem ở dưới:

SELECT COUNT(DISTINCT p.product_id) AS total FROM oc_category_path cp
LEFT JOIN oc_product_to_category p2c ON (cp.category_id = p2c.category_id)
LEFT JOIN oc_product p ON (p2c.product_id = p.product_id)
LEFT JOIN oc_product_description pd ON (p.product_id = pd.product_id)
LEFT JOIN oc_product_to_store p2s ON (p.product_id = p2s.product_id)
WHERE pd.language_id = ‘2’ AND p.status = ‘1’ AND p.date_available <= NOW() AND p2s.store_id = ‘0’ AND cp.path_id = ‘129’

Đoạn script trên là một câu truy vấn sql vào database, ở đây mình không giải thích chi tiết cú pháp của đoạn code vì nó thuộc về chuyên ngành.

Nhưng ý nghĩa của nó là “Đếm số sản phẩm dựa vào số id đường dẫn của một nhóm sản phẩm nào đó trên website” nghĩa là: khi người dùng chọn một nhóm sản phẩm a trên website thì website sẽ truyền đường dẫn của nhóm sản phẩm a này vào câu truy vấn ở trên ==> câu truy vấn ở trên sẽ thực hiện và trả về tổng số lượng sản phẩm đang có thuộc nhóm sản phẩm a.

Vế lý thuyết thì câu truy vấn trên không có sai. Nhưng, rất dở ở chỗ left join quá nhiều bảng trong một câu truy vấn. Nếu trường hợp mỗi bảng liên kết ở trên có khoảng 2.000 record thì server sẽ bị quá tải. Đó là chưa nói đến việc thực tế khách hàng thường hay click chọn một lúc nhiều nhóm sản phẩm để xem cho tiện, lúc này chắc chắn là website sẽ đứng luôn vì  server xử lý không kịp.

Giải pháp cho vấn đề ở trên, chúng ta có 2 cách:

1) Có thể tách câu truy vấn ở trên thành hai hoặc ba câu truy vấn. Mỗi câu truy vấn chỉ left join với 1 hoặc tối đa 2 bảng.
2) Tắt luôn cái chức năng đếm không cần thiết này đi.

Và mình sẽ chọn cách thứ 2

Để biết cách tắt như thế nào thì các bạn có thể xem lại bài viết về Tối ưu hóa code để Opencart load nhanh hơn

Câu hỏi đặt ra là, website của mình cũng đã tắt chức năng trên theo như bài hướng dẫn trước đây rồi, vậy thì tại sao đến hôm 2/4 nó vẫn còn chạy chức năng đếm đó. Sau cùng thì cũng lòi ra. Chúng ta đã quên tắt chức năng này trên thanh menu ngang ở bài viết trước.

Để tắt chức năng đếm hoàn toàn, các bạn tìm đến file theo đường dẫn bên dưới:

Lưu ý: Các bạn nhớ backup file trước khi chỉnh sửa (phiên bản Opencart áp dụng 1.5.6.x)

1) catalog/controller/common/header.php  – Tắt trên menu ở header
2) catalog/controller/module/category.php  — Tắt trên menu bên trái

Trong file header.php, tìm đến đoạn:

header-1
thay thế thành
header-2
Trong file category.php, tìm đến đoạn:
category-1
thay thế thành
category-2
tiếp tục tìm đến đoạn
category-3
thay thế thành
category-4
Sau khi điều chỉnh thì chắc chắn website của bạn sẽ load nhanh, và tài nguyên server sẽ ổn định ở mức 5 – 10% thôi.
TUCHIKARA