Tôi có nên tắt WP_CRON và thay vào đó kích hoạt wp-cron.php từ máy chủ cứ sau vài phút không?


12

Có vẻ như WordPress không cần thiết kích hoạt WP CRON trên mỗi lần tải trang. Tôi đang nghĩ, thay vì để nó chạy trong mỗi lần truy cập, tại sao không lên lịch để nó chạy cứ sau 5 phút qua máy chủ? Tôi chỉ có thể kích hoạt wp-cron.php cứ sau năm phút và đạt được kết quả mong muốn?

Có bất kỳ nhược điểm này?

Câu trả lời:


15

Không có nhược điểm nào khi chạy WP CRON bằng các công việc định kỳ của máy chủ. Trong thực tế đây là thực hành được đề nghị.

Theo Tài liệu phát triển Plugin WordPress chính thức :

WP-Cron không chạy liên tục, đây có thể là một vấn đề nếu có các nhiệm vụ quan trọng phải chạy đúng giờ. Có một giải pháp dễ dàng cho việc này. Chỉ cần thiết lập lịch trình tác vụ của hệ thống để chạy theo các khoảng thời gian bạn mong muốn (hoặc tại thời điểm cụ thể cần thiết).

Để thực hiện việc này, trước tiên bạn cần tắt hành vi cron mặc định trong wp-config.php:

define('DISABLE_WP_CRON', true);

Sau đó, lên lịch wp-cron.phptừ máy chủ của bạn. Đối với Linux, điều đó có nghĩa là:

crontab -e

Tuy nhiên, thay vì chạy nó trong Dòng lệnh (CLI), hãy chạy nó dưới dạng yêu cầu HTTP. Cho rằng bạn có thể sử dụng wget:

*/5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cron

WordPress tải tất cả các tệp lõi cần thiết, Plugin, v.v. wp-cron.phpvới MÃ sau:

if ( !defined('ABSPATH') ) {
    /** Set up WordPress environment */
    require_once( dirname( __FILE__ ) . '/wp-load.php' );
}

Vì vậy, đừng lo lắng về việc WordPress không tải các tính năng quan trọng.


1
Tài liệu WordPress.org bạn liên kết với đề cập wget http://YOUR_SITE_URL/wp-cron.phpmà không cần thêm ?doing_wp_cron Vì vậy, cái này tốt hơn cái kia? Việc bổ sung ?doing_wp_cronlàm gì mà phiên bản không có?
Garconis

Có lẽ chỉ để nhật ký của bạn sẽ hiển thị chuỗi truy vấn để bạn biết cách gọi nó một cách chắc chắn.
Slbox

1
Tôi không đồng ý với điều này cả. Trước hết, nó không đúng là "khuyến nghị". Thứ hai, phương pháp này sẽ làm tê liệt bất kỳ plugin nào sử dụng phương pháp lên lịch sự kiện được đề xuất thực tế. Tôi nghĩ rằng đây là lời khuyên thực sự xấu. Hầu như không ai nên tắt cron trừ khi bạn có một lý do RẤT cụ thể để làm như vậy. Lý do duy nhất tôi có thể nghĩ đến là nếu bạn phá vỡ WordPress để lấy CDN hay thứ gì đó. Đây không phải là thực hành bình thường.
John Dee

1
@JohnDee: phương pháp này không thực sự vô hiệu hóa cron, nó vô hiệu hóa phương thức WP Cron để kiểm tra và cố gắng chạy các công việc cron trên mỗi lần tải trang. define('DISABLE_WP_CRON', true);chỉ vô hiệu hóa một phần của quy trình cron và sau đó gọi tập lệnh cron với mã như: */5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_crontrên máy chủ đảm bảo các công việc cron được thực thi. Bất kỳ Plugin lập lịch nào thậm chí sẽ không biết sự khác biệt.
Fayaz

1
Liên kết tài liệu WordPress.org về chủ đề này đã thay đổi thành developer.wordpress.org/plugins/cron/
mẹo

2

Có một vài nhược điểm: Thứ nhất, khi sử dụng wp-cron.php như một thứ cli, chẳng hạn như các biến $ _SERVER không được đặt. Thay vào đó, mọi người khắc phục giới hạn này bằng cách sử dụng yêu cầu curl cho wp-cron.php.

Thứ hai, vì bản thân WP không được tải với wp-cron.php; nếu bạn sử dụng plugin mail mail SMTP thì nó sẽ không được tải khi gọi wp-cron. Một lần nữa, sử dụng một cuộc gọi curl ghi đè vấn đề này. Curl dường như là phương pháp được sử dụng thường xuyên nhất.

Tuy nhiên; Tôi thích sử dụng wp-cli sau khi cài đặt cài đặt thư trong postfix và (cho nginx) cấu hình php-fpm chính xác và đặt crontab như

*/5    *   *   *   *  wp cron event list --skip-plugins --skip-themes --path="/var/www/vhosts/example.com/httpdocs/wp" --fields=hook,next_run_relative --format=csv | awk -F, '$2=="now" {print $1}' | xargs -r wp --path="/var/www/vhosts/example.com/httpdocs/wp" cron event run $1

(Liệt kê tất cả các crons với các trường cụ thể ở định dạng csv - hook là tên của cron, họ hàng tiếp theo là thời gian. Loại bỏ những cái hiển thị 'now' là lần chạy tiếp theo (những thứ hiện tại) bằng AWK, chuyển danh sách đó sang xargs gọi wp cron event run $HOOKtrên mỗi cron.) Sử dụng wp-cli tải WordPress một cách chính xác (Tôi chọn bỏ qua các plugin khi liệt kê các crons, vì các mã xóa và cảnh báo php sẽ làm hỏng đầu ra theo kịch bản; nhưng không bỏ qua chúng khi chạy cron với xargs, như cron có thể cần các plugin đang được tải)

Hy vọng điều này cung cấp cho bạn một số gợi ý trong những gì cần chú ý.


2
Cách thiết lập: / 15 * * * wget -q -O - yourdomain.com/wp-cron.php?doing_wp_cron theo đề xuất của TomMcFarlin - tommcfarlin.com/wordpress-cron-jobs . Có vẻ để làm công việc tốt. Sẽ đánh giá cao bình luận của bạn.
TheBigK

Vâng, như tôi đã đề cập, mọi người chọn sử dụng curl (wget hoặc bất kỳ cuộc gọi http nào khác) để kích hoạt các crons, và không có gì sai với phương pháp đó. Tôi chỉ tư vấn các vấn đề khi gọi trực tiếp tệp php wp-cron, không bao gồm các tệp cần thiết và tư vấn một phương pháp thay thế khác nếu bạn muốn thêm gia vị một chút.
TechnicalChaos

0

Có nhiều lý do để không vô hiệu hóa wp-cron. Trên thực tế, gần như không thể tìm thấy trường hợp sử dụng để làm điều này. Nó không làm chậm trang web của bạn và nó được sử dụng cho những điều bạn có thể không biết.

Nhiều plugin sử dụng WP-Cron để lên lịch mọi thứ. Họ có thể trở nên bối rối nếu bạn tắt lịch trình.

Có rất nhiều hướng dẫn về chủ đề này vì nó gây nhầm lẫn và bởi vì nó không ảnh hưởng nhiều đến trang web của bạn khi bạn vô hiệu hóa nó. Những gì nó sẽ làm, là một vấn đề đau đầu cho các nhà phát triển phải khắc phục vấn đề bí ẩn mà nó tạo ra trong sáu tháng.

Ngoài ra, WP Heartbeat kích hoạt cứ sau 15 giây trong khu vực quản trị, giải quyết vấn đề này cho 99% những người nghĩ rằng họ có nó.


2
Đây là một phản ứng khủng khiếp - họ đang vô hiệu hóa WP Cron. Họ chỉ đơn thuần là vô hiệu hóa việc gọi WP Cron khi tải trang và thay vào đó giảm tải cho trình nền cron hệ thống. Sheesh.
Barry Chapman

Dù sao, lý do chính để để nó một mình là nhiều plugin hiện đang sử dụng cron để chạy tác vụ nền mở rộng. Bạn có thể làm hỏng một cái gì đó mà người TIẾP THEO đang làm, bởi vì họ mong muốn hệ thống hoạt động theo cách tiêu chuẩn. Chúc may mắn!
John Dee

nếu một plugin được mã hóa theo cách hoàn toàn phá vỡ nếu wp cron bị vô hiệu hóa, thì điều đó có nghĩa là nó đã được lập trình bởi một kẻ bất tài, và tốt hơn hết là gỡ cài đặt ngay lập tức.
Từ tính

Vâng, hai ý kiến ​​ở đây chứng minh quan điểm của tôi. Bạn có một nhà phát triển nói rằng "điều này không vô hiệu hóa cron, nó thực sự xáo trộn nó thành cron OS" - đó là một sự phá vỡ trong WordPress, đó là hệ điều hành trung lập. Sau đó, một nhà phát triển khác nói "này, trách nhiệm của nhà phát triển plugin là lên kế hoạch cho việc tiêu diệt wp cron." Ờ được. Vì vậy, nếu bạn muốn chức năng cron, bạn nên KẾ HOẠCH để loại bỏ hệ thống cron? Để làm gì? Hệ thống cron dự phòng? Nhận xét đó không có ý nghĩa [rõ ràng].
John Dee

Dù sao, trạng thái hiện tại là "TỔNG HỢP". Đó là tình trạng hiện tại. Giải pháp duy nhất, từ một POV framwork, là nói với mọi người: ĐÂY LÀ LÝ DO LÝ THUYẾT HỆ THỐNG WP-CRON. ĐỪNG BỎ L IT NÓ. Tùy chọn khác là 10.000 ý kiến ​​khác nhau. Đó là những gì chúng ta có bây giờ.
John Dee

0

Tôi vẫn chưa tìm thấy một nhược điểm thực sự trong việc giảm tải wp-cron cho dịch vụ bên ngoài. Đang làm điều này trong nhiều năm nay.

Đặc biệt là trong thế giới ngày nay, nơi bạn có thể chạy các ứng dụng như microservice.

Tôi sử dụng các thùng chứa Docker riêng cho từng thành phần WordPress - php, web, db, crontab, redis, v.v.). Có crontab là bộ chứa riêng biệt, gọi wp-cron qua http bằng mạng cục bộ, chỉ chạy khi tôi cần.

Điều này làm giảm căng thẳng trên các nút phụ trợ và cải thiện bảo mật bằng cách có bề mặt tấn công nhỏ hơn.

Nếu nhà phát triển không thể tìm ra cách thực hiện công cụ mà không phải gọi wp-cron trên mỗi lần tải trang, thì quái, điều này chỉ nói lên sự thiếu kinh nghiệm thay cho anh ta. "Để nó một mình", bởi vì bạn không hiểu làm thế nào mọi thứ hoạt động không phải là một lý do tốt để giữ nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.