• Skip to main content

DungNQ

1001 cách để trở thành Webmaster

You are here: Home / Home

Hiệu chỉnh Google XML Sitemap Plugin cho website có số lượng bài viết lớn

September 12, 2016 by dungnq Leave a Comment

Google XML Sitemap là một trong những plugin không thể thiếu của tôi, trước đây khi plugin này chưa hỗ trợ Multisite, tôi đã không sử dụng nó, nhưng rồi tới khi nó hỗ trợ, tôi lại không sử dụng tính năng cho Multisite của nó :D, đúng là ngịch lý của cuộc sống.

Về cơ bản, chức năng của nó không thay đổi nhiều, có một cải tiến lớn đó là việc hỗ trợ Nginx, với cấu hình sau, đây là những gì bạn cần cấu hình thêm khi chạy WordPress cùng Nginx

rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.xml$ "/index.php?xml_sitemap=params=$2" last;
rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.xml\.gz$ "/index.php?xml_sitemap=params=$2;zip=true" last;
rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.html$ "/index.php?xml_sitemap=params=$2;html=true" last;
rewrite ^/sitemap(-+([a-zA-Z0-9_-]+))?\.html.gz$ "/index.php?xml_sitemap=params=$2;html=true;zip=true" last;

Việc cấu hình trên, mục đích để  Rewrite đường dẫn sao cho thật dễ nhớ, không có thì cũng không sao cả, bạn sẽ có một link sitemap với vô số các tham biến ở sau. Tôi sử dụng cho việc không phải nhớ mỗi khi submit website lên Google Webmaster Tool, hay Bing.

Quay về nội dung chính, một plugin tốt như vậy, có hơn 1 triệu lượt download tại sao lại có vấn đề. Trở ngại nằm ở chỗ, khi xây dựng plugin, tác giả chưa tính tới việc dữ liệu sẽ dày lên trong tương lai, vốn là người mong muốn trải nghiệm với hệ thống lớn, tôi luôn sẵn sàng để kiểm tra đâu là plugin tốt, và đối với tôi, đó phải là plugin thiết kế tốt cho tương lai của dữ liệu khổng lồ.

Hai điểm quan trọng Plugin này mắc phải đó là sử dụng truy vấn SQL không tuân thủ nguyên tắc đơn giản.

//Statement to query the actual posts for this post type
      $qs = "
        SELECT
          p.ID,
          p.post_author,
          p.post_status,
          p.post_name,
          p.post_parent,
          p.post_type,
          p.post_date,
          p.post_date_gmt,
          p.post_modified,
          p.post_modified_gmt,
          p.comment_count
        FROM
          {$wpdb->posts} p
        WHERE
          p.post_password = ''
          AND p.post_type = '%s'
          AND p.post_status = 'publish'
          AND YEAR(p.post_date_gmt) = %d
          AND MONTH(p.post_date_gmt) = %d
          {$exPostSQL}
          {$exCatSQL}
        ORDER BY
          p.post_date_gmt DESC
      ";

Bạn thấy đấy, trong truy vấn WHERE tác giả sử dụng hàm YEAR và MONTH để so sánh, mục đích truy vấn này để lọc ra các bài viết có trong cùng một tháng. Tất nhiên bạn có thể thay đổi như sau để có thể giúp hệ thống chạy nhanh hơn, đừng quên comment lại các dòng trên nhé.

// @dungnq optimize start
                        if ($month == 12) {
                            $next_year = $year+1;
                            $next_month = '01';
                        }
                        else {
                            $next_year = $year;
                            $next_month = $month+1;
                        }
                        
                        $qs = "
        SELECT
          p.ID,
          p.post_author,
          p.post_status,
          p.post_name,
          p.post_parent,
          p.post_type,
          p.post_date,
          p.post_date_gmt,
          p.post_modified,
          p.post_modified_gmt,
          p.comment_count
        FROM
          {$wpdb->posts} p
        WHERE
          p.post_password = ''
          AND p.post_type = '%s'
          AND p.post_status = 'publish'
          AND p.post_date_gmt >= '{$year}-{$month}-01 00:00:00'
                                        AND p.post_date_gmt 
Thay đổi ở trên của tôi rất đơn giản, hay vi sử dụng hàm trong câu lệnh điều kiện WHERE tôi xác định luôn một khoảng thời gian nhất định từ là ngày phát hành bài viết phải từ 0 giờ này 1 của tháng, tới trước 0 giờ ngày 1 của tháng kế tiếp, những dòng trên đầu của tôi sử dụng để lấy ra tháng hiện tại và tháng kế tiếp, đặc biệt với tháng 12 thì cần nhảy lên 1 năm.

Còn một điểm lưu ý nữa, nhưng trong tôi nghĩ sẽ chia sẻ cùng các bạn trong tuần tới, nhừng quên ghé tham blog của tôi hàng tuần để nhận được những thông tin  về cách tối ưu WordPress với lượng dữ liệu khổng lồ nhé.

 

Filed Under: Uncategorized

Điều chỉnh WordPress Ping

September 5, 2016 by dungnq Leave a Comment

Nếu bạn là một blogger sử dụng WordPress như một công cụ đề xuất bản những bài viết của mình, thì nội dung này sẽ không hề hợp với bạn. Ở đây tôi đóng vai trò là một người quản trị, sử dụng wordpress cho những hệ thống lớn, có nhiều người truy cập, cũng như số lượng bài viết mỗi ngày được phát hành là không hề nhỏ?

Vấn đề là gì, như những gì bạn có thể đã biết, WordPress cho  một cơ chế ping tới các search engine, nghĩa là sau khi bạn phát hành bài viết, bằng cách này hay cách khác, WordPress sẽ tự động đẩy những nội dung tới các cỗ máy tìm kiếm để thông báo bài viết của bạn tồn tại, hoặc đã được chỉnh sửa.

Thảm họa xảy ra là gì? Nếu 1 ngày bạn chỉ có từ 1 – 2 bài viết, thì không nói, nhưng với một hệ thống lớn, số lượng có thể lên đến 100, 200, thậm chí là 1000 bài viết cần xuất bản mỗi ngày. Tới đây chính là giới hạn của WordPress, hãy thử tưởng tượng, trong một lần xử lý, hệ thống sẽ ping tới Search Engine từ 100 đến 1000 lần, tất nhiên còn phụ thuộc vào tốc độ kết nối, khả năng xử lý của CPU… nhưng cái mà tôi đề cập tới chính là tài nguyên bị giữ lại cho việc xử lý này mới thực là vấn đề, PHP không phải là ngôn ngũ viết tối ưu cho bộ nhớ trong RAM, nên chạy càng lâu, vòng lặp càng lớn thì hệ thống bạn sớm bị cạn kiệt. Hệ quả là, server còi của bạn không còn đủ tài nguyên để phục vụ khách hàng truy cập nữa.

Điều bạn nên làm là gì, hay tìm  đoan code sau trong thư mục wp-include/comment.php, tìm kiếm hàm do_all_pings và thay đổi theo mẫu dưới đây của tôi gợi ý.

/**
 * Perform all pingbacks, enclosures, trackbacks, and send to pingback services.
 *
 * @since 2.1.0
 *
 * @global wpdb $wpdb WordPress database abstraction object.
 */
function do_all_pings() {
  global $wpdb;
  
    $limit = get_option('posts_per_page', 10); // @dungnq get limit of post per page
  // Do pingbacks
  $count=0; // @dungnq count
  while ($ping = $wpdb->get_row("SELECT ID, post_content, meta_id FROM {$wpdb->posts}, {$wpdb->postmeta} WHERE {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '_pingme' LIMIT 1")) {
    delete_metadata_by_mid( 'post', $ping->meta_id );
    pingback( $ping->post_content, $ping->ID );
    $count++; //@dungnq
    if ($count >= $limit) break; // @dungnq
  }

  // Do Enclosures
  $count=0; // @dungnq count
  while ($enclosure = $wpdb->get_row("SELECT ID, post_content, meta_id FROM {$wpdb->posts}, {$wpdb->postmeta} WHERE {$wpdb->posts}.ID = {$wpdb->postmeta}.post_id AND {$wpdb->postmeta}.meta_key = '_encloseme' LIMIT 1")) {
    delete_metadata_by_mid( 'post', $enclosure->meta_id );
    do_enclose( $enclosure->post_content, $enclosure->ID );
    $count++; //@dungnq
    if ($count >= $limit) break; // @dungnq
  }

  // Do Trackbacks
  //$trackbacks = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE to_ping  '' AND post_status = 'publish'");
  $trackbacks = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE to_ping  '' AND post_status = 'publish' LIMIT $limit");
  if ( is_array($trackbacks) )
    foreach ( $trackbacks as $trackback )
      do_trackbacks($trackback);

  //Do Update Services/Generic Pings
  generic_ping();
}

Thay vì sử dụng vòng lặp vô tận cho tới khi hết các post mới nhất cần ping, tôi chỉnh lại một chút thôi, lấy số giới hạn là số lượng post hiển thị trên trang chủ hoặc feed, sau đó sử dụng bộ đếm để thoát khỏi vòng lặp while.

Tôi đã hoàn toàn giữ lại code của WordPress để bạn tham khảo? Nếu bạn vẫn có suy nghĩ là WordPress chỉ là nền tảng của các blogger, hay tham khảo tờ The Sun nổi tiếng của UK, các kỹ sư đã biết wordpress trở thành một nền tảng cho báo chí vô cùng linh hoạt. Còn sức mạnh của nó đến đâu, tùy bạn kiểm chứng, tôi chỉ có thể chia sẻ rằng, nó nằm trong chính khối óc của bạn, hãy tận dụng thành quả 10+ năm tuyệt vời của những con người xây dựng nên WordPress, đừng biến mình trở thành những nhà khoa học đi phát minh lại những bánh xe.

Filed Under: Uncategorized

Google XML Sitemap

September 1, 2016 by dungnq Leave a Comment

Nếu bạn đã sử dụng wordpress vì bất kỳ một lý do nào đó, bạn đã vô tình sử dụng rất nhiều tiện ích kèm theo của CMS mã mở, mà đối với tôi là tốt nhất trên thế giới hiện nay.

Vơi hệ thống Backend rất thân thiện, tiêu chí đầu tiên của tôi so sánh khi lựa chọn mình nên theo con đường nào Joomla, Zend Framework, hay WordPress. Quả thật là tôi không hề sai lầm khi khám phá cả một cộng đồng lớn với yêu ý tưởng thú vị. Quan trọng hơn, tôi không cần phải mất 6 tháng 1 năm để thử một ý tưởng điên rồ của mình.

Nếu là tay ngang, bạn cũng được thừa hưởng rất nhiều nhưng tính năng ưu việt, mà không có CMS tự phát triển nào có được, khi bạn viết một bài trên hệ thống của mình, WordPress sẽ tự động thông báo với các Search Engine là nội dung của bạn đã tồn tại qua hệ thống ping do chính WordPress phát triển. Tất nhiên bạn sẽ may mắn hơn một cơ số những người ngồi ngoài kia, sử dụng những biện pháp thông thường.

Tuy nhiên, hôm nay tôi cũng muốn giới thiệu cho các bạn một plugin khá thu vị, bổ sung vào những gì chúng ta còn thiếu, đó là Google XML Sitemap, bạn có thể download trực tiếp ở địa chỉ sau

https://wordpress.org/plugins/google-sitemap-generator/

Ping tới Search Engine thôi chưa đủ, cách tốt nhất bạn cần đó là cho Search Engine biết tường tận ngóc ngách ngôi nhà trên internet của bạn, đây là plugin miễn phí mà tôi thấy đáng giá nhất. Những phiên bản trước đây của plugin vốn không hỗ trợ Multisite, tuy nhiên ở phiên bản mới nhất việc này đã được hỗ trợ tối đa.  Plugin này đã ra đời được 9 năm, và hiện nay có trong top những plugin được đánh giá cao nhất.

Tuy nhiên bạn đang ở blog của tôi, nơi bạn có thể tìm thấy các vấn đề khác ngoài việc giới thiệu các tính năng của plugin, tôi sẽ gửi tới các bạn một số vấn đề khác của plugin khi sử dụng với hệ thống có dữ liệu đồ sộ ở những bài sau nhé.

Còn bây giờ, nếu bạn chưa từng sử dụng plugin này, hay khám phá và giúp blog của mình tiến gần hơn với Search Engine nhé.

 

Filed Under: Uncategorized

Không nên sử dụng hàm get_page_by_title

August 31, 2016 by dungnq Leave a Comment

Nếu dữ liệu của bạn đủ lớn, khoảng tầm 500 ngàn đến 1 triệu bản ghi, bạn sẽ thấy hậu quả nhanh chóng từ việc sử dụng hàm này. Việc tiện dụng là không thể phủ nhận, nhưng khi sử dụng hàm trên, sẽ dẫn đến việc so sánh để tìm ra bài viết có post_title phù hợp.

Tuy nhiên, nếu bạn để ý, WordPress sử dụng post_title là text, việc truy vấn dữ liệu text, không hề được index là một thảm hoạ vô cùng lớn. Như trường hợp của tôi, cần so sánh post được gửi thông qua xmlrpc xem đã từng tồn tại trên hệ thống chưa. Rất may, lệnh truy vấn này không thực sự nhiều, và chưa quá ảnh hưởng nghiêm trọng tới hệ thống của tôi.

Tuy nhiên sau khi loại bỏ những dòng lệnh trên, hệ thống trở về điều kiện hoàn toàn bình thường, CPU giảm hẳn đi 1/2, I/O giảm rõ rệt. Vì một phút nhanh chóng làm cho xong plugin của mình theo guilde online, tôi đã phải trả giá cho hiệu năng hệ thống của mình.

 

Filed Under: Uncategorized

GitLab lỗi khi clone với https

October 29, 2015 by Leave a Comment

Tự dưng một buổi chiều đẹp trời, vớ phải cái lỗi ẩm ương, làm gián đoạn hết kế hoạch của mình, tìm hiểu một vòng trên mang… các phải pháp tự tựa như nhau, có vẻ cũng khá nhiều người gặp vấn đề này… nhưng chưa có dòng nào copy rồi run mà chạy cả.

DungNQs-MacBook-Pro:www dungnq$ git clone https://git.xxx.com.vn/root/xxx.git

Cloning into ‘xxx’…

fatal: unable to access ‘https://git.xxx.com.vn/root/it-app-fwb-microsite.git/’: SSL peer handshake failed, the server most likely requires a client certificate to connect

Làm việc vào cái lúc chiều, buồn ngủ, không khả dĩ đối với công việc nghiên cứu này lắm… bỏ đấy và đi tìm hiểu một số thứ xung quan vụ SSL. Thử kiểm tra một vài lệnh test với openssl thì thấy cấu hình mặc định của GitLab không chạy ổn

openssl s_client -connect xxx:443 -tls1

Thử vào cấu hình của GitLab

nginx[‘ssl_ciphers’] = “ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256”

…

ci_nginx[‘ssl_ciphers’] = “ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256”

Hoá ra với một số hệ điều hành như MaxOS mã hoá mặc định của GitLab không còn an toàn, nên bản thân hệ điều hành đã bỏ loại bỏ các giải pháp này. Tư duy một chút, đơn giản chỉ cần bổ sung các mã encrypt khác để giúp tương thích với mấy bạn tiên tiến kia.

nginx[‘ssl_ciphers’] = “EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4”

Cấu hình tương tự với ci_nginx, sau đó reconfigure và restart để sử dụng GitLab bình thường.

Một ngày may mắn và thú vị với mình đây 😀

Filed Under: Chưa phân loại

Khắc phục hiện tượng WP-CLI không chạy trong Crontab

April 29, 2015 by Leave a Comment

Biết tới WP-CLI khá lâu rồi, nhưng thời gian gần đây mới có thời gian để nghiên cứu sử dụng. Quả thật WordPress quả là một thế giới rộng lớn, một nền tảng có một cộng đồng luôn phát triển của những con người thật tài năng.

Nếu ai nói với bạn rằng… WordPress chỉ là cái blog… nó không phải là một sản phẩm cho doanh nghiệp. Xin nói với bạn rằng… những người đó chỉ vì không biết và không hiểu WordPress đã mang lại điều gì… mà cái gì đã là hời hợt thì xin đừng tin.

Hôm nay khi sử dụng WP-CLI, tự nhiên không hiểu vì sao gõ lệnh ở console thì chạy nhưng đưa vào Crontab thì “im re”… tìm hiểu một hồi, thì may qúa có một gợi ý nho nhỏ. Và đơn giản là thay vì chay lệnh với cấu trúc rút ngắn thì chạy với đường dẫn dầy đủ.

Thay vì

[code]wp export data.sql[/code]

Hãy dùng

[code]/usr/local/bin/wp export data.sql[/code]

Filed Under: Uncategorized

  • « Go to Previous Page
  • Go to page 1
  • Go to page 2
  • Go to page 3
  • Go to page 4
  • Go to Next Page »

Copyright © 2022 · Revolution Pro on Genesis Framework · WordPress · Log in