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.
Leave a Comment