2012-03-28 6 views
5

Tôi đang chạy Opencart 1.5.2 trên máy chủ của mình và sau khi nhập một số lượng lớn sản phẩm, tôi đã giảm tốc độ lớn. Tôi đã thử cài đặt vq mod để tăng tốc trang web ... không phải vậy.Opencart tốc độ tải cực kỳ chậm

Store

Tôi biết tôi có một số yếu tố trên trang web mà là tương đối lớn nhưng trước khi nhập khẩu nó đang chạy tốt.

+0

Tôi biết đã có một số câu trả lời nhưng có gì đó giúp đỡ là có một hộp máy chủ chuyên dụng và máy chủ cơ sở dữ liệu chuyên dụng. – TheBlackBenzKid

Trả lời

11

Số lượng sản phẩm trong các danh mục là nguồn tải trang chậm đáng kể trong opencart. Có một vài nơi này có thể được tính toán và bạn sẽ phải loại bỏ tất cả chúng để nhận thấy sự cải thiện về thời gian tải trang do yếu tố này.

Nếu bạn chỉnh sửa mô-đun Catalog, bạn có thể tắt số lượng sản phẩm cho menu điều hướng (được hiển thị trong cột bên trái theo mặc định) bằng cách đặt Product Count: thành Disabled.

Chủ đề mặc định cũng có số lượng sản phẩm được hiển thị trong menu chính của trang web. Bạn có thể tìm thấy mã này trong catalô/controller/common/header.php:

$product_total = $this->model_catalog_product->getTotalProducts($data); 

$children_data[] = array(
    'name' => $child['name'] . ' (' . $product_total . ')', 
    'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id']) 
); 

Remove hoặc nhận xét ra bất kỳ tài liệu tham khảo để $product_total:

//$product_total = $this->model_catalog_product->getTotalProducts($data); 

$children_data[] = array(
    'name' => $child['name'], 
    'href' => $this->url->link('product/category', 'path=' . $category['category_id'] . '_' . $child['category_id']) 
); 

Điều đó sẽ chăm sóc của tất cả các tài liệu tham khảo trong cài đặt opencart mặc định, nhưng nếu bạn đang sử dụng một chủ đề hoặc mô-đun tùy chỉnh, có thể có nhiều hơn. Nói chung, bạn có thể tìm kiếm toàn bộ danh mục/thư mục để tham chiếu đến model_catalog_product->getTotalProducts().

Nếu bạn tìm kiếm các tham chiếu khác tới getTotalProducts() Đảm bảo bạn không xóa các tham chiếu sử dụng số lượng sản phẩm để phân trang, nếu không, phân trang sẽ không hoạt động đúng cách. Dưới đây là ví dụ từ danh mục/bộ điều khiển/sản phẩm/tìm kiếm.php, một tệp cần số lượng sản phẩm hoạt động bình thường.

$pagination->total = $product_total; 

Xóa các tham chiếu này đã dẫn đến gần gấp 10 lần thời gian tải trang trên máy chủ phát triển của tôi trong cài đặt mở với ~ 2.000 sản phẩm.

0

Hãy xem trong catalog/controller/module/categories.php. Theo mặc định, mô-đun danh mục hiển thị số lượng sản phẩm bên cạnh mỗi mục trong menu. Điều này dẫn đến một chút chi phí truy vấn công bằng cho một tăng ux rất nhỏ (Theo ý kiến ​​của tôi).

Dòng

$product_total = $this->model_catalog_product->getTotalProducts($data); 

xuất hiện hai lần, nếu bạn nhận xét nó ra (và nơi $product_total được sử dụng dưới nó), bạn sẽ thấy lợi nhuận khá đáng kể.

9

Đã sắp xếp. Dường như có một cách tiếp cận "mới" trong các truy vấn SQL được phát hiện bởi nhóm OC và nó nên được gọi là "DDoS cho đến chết".

Cơ sở sản phẩm giờ đây đã phát triển thành 37 nghìn sản phẩm trong 129 danh mục (từ 18k qua đêm, lol ... không được viết rằng các tập lệnh nhập tự động và đưa vào lamer ...) Và thời gian tải đã tăng 6-12 giây để 20-25 giây, đánh máy chủ SQL cứng:

[quote] Вопросов начиная с запуска: 514.064.911 (ques kể từ khi khởi động) ø в час: 1.301.788 (ques avg cho giờ) ø в минуту: 21.696 (ques trung bình cho phút) ø в секунду: 362 (ques trung bình cho giây) [/ quote]

Điều này là không bình thường, vì có 2 người dùng trên hệ thống - kịch bản tự động (giới hạn - 30 ques mỗi giây, sau đó ngủ (1)) và tôi (362-30 = 332 truy vấn mỗi giây? bởi một người? WTF devs?). Dựa trên thống kê này OC theo cách này sẽ cần một trang trại máy chủ nghiêm trọng để phục vụ hơn 500 người dùng cùng một lúc. Sẽ không xảy ra. Không phải trong cuộc đời này.

Tôi duy trì các trang web khác nhau và đã viết lại gần như tất cả chúng. Trang web được truy cập nhiều nhất của tôi (200 nghìn lượt truy cập mỗi ngày) đang tạo ra "chỉ" 2,5 triệu lít mỗi ngày. Và nó có nặng (nội dung), tin tôi đi. Nếu OC được nạp như nhau (200k lượt xem) điều này có nghĩa là sẽ có 100-120 triệu lít mỗi ngày.

CSONG các truy vấn không phải là quá khôn ngoan, cho máy chủ thời gian khó khăn với ORDER BY (như tôi nghi ngờ) và CHỌN DISTINCT (đau !!!).

CSONG có nhiều tùy chọn được đặt cho mỗi truy vấn, bất kể chúng có được đặt bởi người dùng hay không (sắp xếp, sắp xếp, v.v.). Điều này làm cho các câu hỏi dài hơn 4-5x so với dự kiến, ngay cả khi người dùng không muốn bất kỳ thứ tự sắp xếp nào (ASC, DESC, v.v.)

C thereNG có một số cách viết sai. Làm thế nào bạn có thể kéo tổng số cho bất cứ điều gì bằng cách sử dụng 5 phps và 3 truy vấn, miễn là bạn có thể làm đơn giản 1 dòng "SELECT COUNT (*) FROM ..."? Nhóm OC dường như không quan tâm đến thời gian thực thi và tải máy chủ.

Tôi muốn xin lỗi nếu ai đó bị xúc phạm bởi những gì tôi viết, nhưng trong trường hợp của tôi tôi đúng: toàn bộ cách tiếp cận là sai để đạt được mục tiêu (thực hiện nhanh trên 37k sản phẩm/129 con mèo). OC có thể tốt cho một người có 2 loại và 50 sản phẩm (lol?). Dunno. Và tôi có lẽ sẽ không tìm ra.

Khi INFO - bộ nhớ đệm không phải là giải pháp. Bộ nhớ đệm phía máy chủ là khá đủ. Bất cứ điều gì ngoài điều này có nghĩa là bạn có vấn đề mã hóa nghiêm trọng. Vì vậy, không ... Tôi sẽ lặp lại KHÔNG MUA mô-đun bộ nhớ đệm. Đang ẩn các vấn đề, không giải quyết chúng. Nếu một mô-đun bộ nhớ đệm có thể ẩn vấn đề trên các sản phẩm 40k, nó sẽ không thể làm điều đó trong các sản phẩm 140k. Bạn sẽ cần mô-đun bộ nhớ đệm cho mô-đun bộ nhớ đệm, lol.

Bây giờ, đến giải pháp. Cách dễ dàng. Chúng tôi sẽ chỉ sửa đổi các vấn đề chính. Tôi sẽ không giải thích những sửa đổi mà tôi đã thực hiện trên phiên bản của mình, vì chúng có nhiều tệp và rất quan trọng nếu bạn không hiểu bạn đang làm gì (bạn có thể mất tùy chọn OC bạn muốn giữ, trong khi tôi không quan tâm về các tùy chọn miễn là trang web đang tải trong nửa phút). Vì vậy, - sửa đổi nhỏ CHỈ.

Wil say - giải thích cho phiên bản 1.5.5.1 cổ phiếu, chủ đề chứng khoán. Có nghĩa là - không có mod. Sau khi sửa đổi, bạn sẽ mất khối bên trái với các danh mục, nhưng trang web của bạn sẽ tải NHANH CHÓNG (37k sản phẩm/129 mèo -> 0,17 giây trong tổng số 5 tải, khoảng cách máy chủ là ~ 200mi)

0) BACKUP trang web của bạn. Chúng tôi sẽ sửa đổi các tập tin. Bạn có thể làm một mớ hỗn độn kinh khủng. Và khóc sau đó.

1) Nhận/danh mục/bộ điều khiển/sản phẩm/danh mục.php Tìm dòng: 184

Phải chứa: $product_total = $this->model_catalog_product->getTotalProducts($data);

Replace with: //$product_total = $this->model_catalog_product->getTotalProducts($data);

Mô tả: Bình luận ra loại tính là phải mất khá damd nhiều để đếm sản phẩm trong 129 loại (129 truy vấn WTF.? ?)

2) Nhận /catalog/controller/product/category.php Tìm dòng: 187

Phải chứa: 'name' => $result['name'] . ($this->config->get('config_product_count') ? ' (' . $product_total . ')' : ''),

Replace with: 'name' => $result['name'],

Mô tả: Dọn dẹp - không có đếm được hiển thị trong các thể loại, như chúng ta don `t đếm chúng nữa.

3) Nhận /catalog/controller/product/category.php Tìm dòng: 388 Phải chứa: 'common/column_left',

Replace with: // 'common/column_left',

Mô tả: hệ Skippng của cột bên trái trong hạng mục lượt xem.

4) Nhận /catalog/controller/product/product.php Tìm dòng: 463 Phải chứa: 'common/column_left',

Replace with: // 'common/column_left',

Mô tả: hệ Skippng của cột bên trái theo quan điểm của sản phẩm .

5) Nhận /store/catalog/view/theme/default/template/product/product.tpl Tìm dòng: 1

Phải chứa: <?php echo $header; ?><?php echo $column_left; ?><?php echo $column_right; ?>

Replace with: <?php echo $header; ?><?php echo $column_right; ?>

Mô tả: Xóa cột bên trái khỏi chế độ xem chủ đề - sản phẩm.

6) Nhận /store/catalog/view/theme/default/template/product/category.tpl Tìm dòng: 1

Phải chứa: <?php echo $header; ?><?php echo $column_left; ?><?php echo $column_right; ?>

Replace with: <?php echo $header; ?><?php echo $column_right; ?>

Mô tả: Xóa cột bên trái khỏi chế độ xem chủ đề - danh mục.

XONG. Kiểm tra tốc độ tải của bạn. Nên khá tuyệt vời, nếu vấn đề của bạn giống như tôi.

LƯU Ý: Xin lưu ý rằng tôi không quen với phiên bản OC này và chưa bao giờ sử dụng nó trước đây. Vì chúng tôi đã giải quyết được một phần vấn đề, nó không được giải quyết triệt để. Đây là bản sửa lỗi tạm thời. Xóa các phần gây tải chậm là giải pháp cho đến khi bạn viết lại chúng, lần này hy vọng sẽ tốt hơn. Tôi sẵn sàng viết lại nó, nếu ai đó muốn trả giá cao hơn cho sếp của tôi. Tôi có thể đi nghỉ và làm việc cho bạn:) Thanh toán của tôi hiện tại là 4700 € mỗi tuần.Việc hiểu và viết lại cột bên trái này đúng cách sẽ không mất nhiều hơn 1-2 ngày làm việc.

PP. Sẽ đăng bài này ở một vài nơi, bởi vì tôi không nghĩ rằng nhóm phát triển OC sẽ thích những gì họ đã đọc, bất kể tôi không có ý xúc phạm họ - chỉ để chỉ ra những sai lầm nghiêm trọng mà họ đã thực hiện (25,31 thời gian tải trung bình cho mỗi trang trong các bài kiểm tra - không có khách hàng nào sẽ chờ hơn 3-4 giây trước khi chuyển sang trang khác! Dafuq?). Và bằng cách không cho phép tôi đăng thông tin này, mọi người không biết cách giải quyết vấn đề và đi mua một "mô-đun bộ nhớ đệm" thực sự là các tệp trên đĩa cứng như hoang dã. Lãng phí tiền bạc, lãng phí tài nguyên ổ đĩa cứng, lãng phí điện ... và tất cả điều này - để tạo ra một ảo ảnh mọi thứ đều chạy tốt, trong khi nó không.

+0

Đối với nhiều thay đổi cốt lõi – TheBlackBenzKid

+0

Phương pháp này giúp ích rất nhiều. Cảm ơn bạn! –

+1

Đã được sắp xếp. Dường như có một cách tiếp cận "mới" trong các truy vấn SQL được phát hiện bởi nhóm OC và nó nên được gọi là "DDoS cho đến chết". +1 – Jordy

0

Có thể bạn cần Bộ đệm ẩn toàn bộ trang FPC được thực hiện để tăng tốc cửa hàng của bạn bằng cách tạo tệp đơn giản để tải thay vì tất cả khung công tác mở. Tiện ích mở rộng này sẽ lưu vào bộ nhớ cache tất cả các trang danh mục của bạn nhưng sẽ giữ cho thông tin cụ thể của người dùng động.

Liên kết: Full Page Cache

0

Tôi đã tìm thấy giải pháp khác cho sự cố. Về cơ bản, MySQL bị nghẹt thở khi nó cố gắng lọc kết quả truy vấn từ cả hai bảng Product_category và Product_Tag cùng một lúc. Tôi đã viết một vqMod cho OC 1.5.2.1 để thay thế hàm getTotalProducts() và xây dựng các truy vấn SQL riêng lẻ được thực thi dựa trên 2 bảng. Sau đó nó sử dụng một UNION SQL để kết quả của cả hai truy vấn với nhau. Giải pháp này cải thiện hiệu suất và cho phép bạn tiếp tục sử dụng bộ đếm sản phẩm trên trang web của mình.

Điều này làm thời gian tải trang của tôi từ 45 đến 50 giây xuống dưới 1 giây !!!

Tôi chỉ đăng tải các tập tin vqMod đây: http://www.opencart.com/index.php?route=extension/extension/info&token=7bc7d0149c7101c3d336b2e0b29e3f03&extension_id=13155

Hãy cho tôi biết nếu bạn có bất kỳ câu hỏi và tôi sẽ giúp nơi tôi có thể.

10

Nếu bạn có seo urls được bật trong opencart của mình, đó có thể là nguồn chậm đáng kể.

Tôi có oc v1.5.5.1 với khoảng 3K danh mục và 40K sản phẩm. Tôi chạy nó trên chia sẻ lưu trữ, và lúc đầu tiên thời gian tải của tôi là khoảng 40 giây và cao hơn. Sau đó, tôi đã nhận được nhiều hơn một chút vào opencart, và nhận ra rằng nó đang làm cho một số lượng lớn các yêu cầu trên bảng oc_url_alias trong cơ sở dữ liệu oc. Vì vậy, lời khuyên của tôi là:

1. Add index to query column in oc_url_alias table

Với điều này thời gian tải của tôi đã giảm xuống còn khoảng 7 giây mỗi trang.

2. Add index to keyword column in oc_url_alias table

Sau khi cả hai bước tôi đã nhận nó xuống khoảng 1-3 giây cho mỗi trang.

Bây giờ oc tôi đang chạy trong khoảng 1 giây cho mỗi trang, tôi đã đạt được điều đó bằng cách thêm một số chỉ số hơn trong bảng mysql của tôi, theo bài của anh chàng này http://bloke.org/php/opencart-is-slow-with-many-categories/, đó là:

  1. Index on parent_id column in category table
  2. Index on category_id column in product_to_category table
  3. Index on language_id column in category_description table
  4. Index on store_id column in category_to_store table
  5. Index on attribute_id AND language_id columns in product_attribute table
  6. Index on manufacturer_id column in product table
  7. Index on language_id column in product_description table
  8. Index on store_id column in product_to_store table

Ngoài ra, như đã nói ở trên trong câu trả lời khác, tôi cũng loại bỏ đếm sản phẩm trong: catalog/controller/product/category.phpcatalog/controller/module/categories.php. Nếu vẫn gặp sự cố chậm, bạn hoàn toàn có thể tắt mô-đun danh mục từ thanh bên.

Cuối cùng, bạn có thể thử sử dụng tiện ích mở rộng này: http://www.opencart.com/index.php?route=extension/extension/info&extension_id=10464, nhưng không hỗ trợ url seo vì vậy tôi phải tinh chỉnh một chút (bằng cách giải mã tham số $_REQUEST['_route_'], có chứa yêu cầu url seo, trong hàm run).

+0

Xin chào. Bạn có thể vui lòng chia sẻ cách giải quyết đó cho url seo url không? – geryjuhasz

1

Hãy nhìn vào tập tin .htaccess, như được giải thích trong this tutorial:

`## EXPIRES CACHING ## 
<IfModule mod_expires.c> 
ExpiresActive On 
ExpiresByType image/jpg "access plus 1 week" 
ExpiresByType image/jpeg "access plus 1 week" 
ExpiresByType image/gif "access plus 1 week" 
ExpiresByType image/png "access plus 1 week" 
ExpiresByType text/css "access plus 1 week" 
ExpiresByType application/pdf "access plus 1 week" 
ExpiresByType text/x-javascript "access plus 1 week" 
ExpiresByType application/x-shockwave-flash "access plus 1 week" 
ExpiresByType image/x-icon "access plus 1 week" 
ExpiresDefault "access plus 1 week" 
</IfModule> 
## EXPIRES CACHING ##` 
1

Trong một cửa hàng tôi làm việc trên đó là bản 1.5.6.4_rc (tôi khá chắc chắn áp dụng ot phiên bản của bạn quá) các vấn đề là như sau:

foreach ($ loại như $ category) trong danh mục/điều khiển/mô-đun/category.php xung quanh dòng 33

foreach ($ loại như $ category trong danh mục/điều khiển/common/tiêu đề .php quanh dòng 107

Do mã đó, chúng tôi đã có hơn 900 truy vấn db nhiều từ $ this-> url-> link() cùng với nhiều người khác.

Chúng tôi tạo ra một vqmod để giải quyết vấn đề này bằng bộ nhớ đệm loại dữ liệu này để ít nhất nó sẽ chỉ xảy ra khi bộ nhớ cache tái sinh:

<modification> 

    <id>Cache category data to speed up page load for store with many categories and sub categories.</id> 
    <version>1.0.0</version> 
    <vqmver>2.3.2</vqmver> 
    <author>Weismann Web</author> 

    <file name="catalog/controller/module/category.php"> 
     <operation> 
      <search position="after"><![CDATA[ 
      foreach ($categories as $category) { 
      ]]></search> 
      <add><![CDATA[ 
      $category_data = $this->cache->get('vqmod_category_data_controller_module_category'); 

      if ($category_data) { 
       $this->data['categories'] = $category_data; 
       break; 
      } 
      ]]></add> 
     </operation> 
     <operation> 
      <search position="before"><![CDATA[ 
      if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/module/category.tpl')) { 
      ]]></search> 
      <add><![CDATA[ 
      if (!$category_data) { 
      $this->cache->set('vqmod_category_data_controller_module_category', $this->data['categories']); 
      } 
      ]]></add> 
     </operation> 
    </file> 

<file name="catalog/controller/common/header.php"> 
     <operation> 
      <search position="after"><![CDATA[ 
      foreach ($categories as $category) { 
      ]]></search> 
      <add><![CDATA[ 
      $category_data = $this->cache->get('vqmod_category_data_controller_common_header'); 

      if ($category_data) { 
       $this->data['categories'] = $category_data; 
       break; 
      } 
      ]]></add> 
     </operation> 
     <operation> 
      <search position="before"><![CDATA[ 
      $this->children = array(
      ]]></search> 
      <add><![CDATA[ 
      if (!$category_data) { 
      $this->cache->set('vqmod_category_data_controller_common_header', $this->data['categories']); 
      } 
      ]]></add> 
     </operation> 
    </file> 


</modification> 

Dưới đây là bài viết của tôi về nó trên các diễn đàn Opencart: Issue With Slow Opencart When Having Lots of Categories

0

Đây là những gì đã sửa cho tôi. Như áp phích trước đã đề cập đến nguyên nhân chính gây ra sự chậm lại là:

danh mục/model/catalog/product.php -> chức năng công cộng getTotalProducts ($ data = array()) { ...

Đặt này vào đầu của hàm:

public function getTotalProducts($data = array()) { 
    if (isset($_SESSION['totalproducts'.$_SERVER['QUERY_STRING']])){ 
     return $_SESSION['totalproducts'.$_SERVER['QUERY_STRING']]; 
    } 

Đặt này ở cuối

$_SESSION['totalproducts'.$_SERVER['QUERY_STRING']] = $query->row['total']; 
    return $query->row['total']; 
} 

Bằng cách này, bạn không cần phải bình luận bất cứ điều gì ra ngoài, nhưng tổng sản phẩm sẽ là sai nếu nó được cập nhật trong khi một phiên hoạt động.

Hy vọng điều đó sẽ hữu ích.

0

Bạn nên tạo 02 chỉ mục cho cột từ khóa và truy vấn trong bảng OC_URL_ALIAS. Bạn sẽ bị ấn tượng với tốc độ. Tôi đã sử dụng PageSpeed ​​Insight của Google để đo tốc độ trang web của mình. Lần đầu tiên, kết quả là "Trong thử nghiệm của chúng tôi, máy chủ của bạn đã phản hồi trong 12,2 giây". Sau khi tạo hai chỉ mục, thời gian phản hồi là 7,8 giây :)