Chạy WordPress trên dòng lệnh - Tắt đầu ra bị trễ?


8

Tôi đang tạo một công việc định kỳ chạy bên ngoài WordPress. Từ góc độ phát triển, điều này giúp dễ dàng gỡ lỗi và tạo các tập lệnh dọn dẹp hoặc các công việc cron, chỉ bằng cách chạy một lệnh như sau trên dòng lệnh:

php myfile.php

Vấn đề của tôi là WordPress bằng cách nào đó trì hoãn tất cả đầu ra ... thông thường khi bạn chạy các tệp php như thế này thì đầu ra được tạo trên màn hình của bạn trong thời gian thực.

Có ai biết làm thế nào để ngăn chặn WP trì hoãn tất cả đầu ra cho đến khi kết thúc công việc không? Đây có thể là một số tham số đơn giản mà tôi thiếu khi chạy tệp PHP hoặc một hằng số nào đó, nhưng tôi không chắc chắn.

Trong đoạn mã sau, bạn sẽ có độ trễ 1 giây giữa mỗi đầu ra, thay vào đó, tôi hiện nhận được tất cả thông tin được in ở cuối, cùng một lúc:

set_time_limit( 0 );
ini_set( "memory_limit", "64M" );

ob_start();
require_once( dirname( __FILE__ ) . '/wp-load.php' ); // you need to adjust this to your path
ob_end_clean();

global $wpdb;
$q = $wpdb->prepare ("SELECT * FROM wp_posts LIMIT 5");
$results = $wpdb->get_results ($q);
echo "found " . count ($results) . "\n";

foreach ($results as $post)
{
    echo $post->post_title . "\n";
    sleep(1);
}

echo "\n\ndone";

Tôi tin rằng nó phải làm với các cài đặt trên máy chủ chứ không phải wordpress. Đã kiểm tra mã của bạn và nó hoạt động như dự định trên máy chủ của tôi khi chạy từ dòng lệnh. Bạn có bất kỳ plugin mà bộ nhớ cache có thể?
Kokarn

@Kokarn bạn đúng rồi. Tôi nên đã thử nghiệm điều này trong một cài đặt WP khác. Có vẻ như là vì tôi đang sử dụng W3 Total Cache. Sẽ đăng giải pháp cuối cùng trở lại đây (thay vì chỉ tắt plugin).
Alex Cook

Câu trả lời:


10

Sau một số thử nghiệm thực sự, cả WP Super Cache và W3 Total Cache đều không giải phóng bộ đệm (hoặc ngăn bộ đệm được phát hành).

Tắt "độ trễ đầu ra" là đơn giản và phụ thuộc vào plugin lưu trữ liên quan.

Bộ nhớ cache siêu tốc WP :

wp_cache_disable();
ob_end_flush(); // or ob_end_clean();

Điều này nên được thêm vào sau khi bao gồm wp-load.php, điều này ngăn chặn bất kỳ bộ nhớ đệm chết trong các rãnh của nó và xóa bộ đệm.

Tổng bộ nhớ cache W3 :

ob_end_clean(); // or ob_end_flush();

Tương tự như trên, gọi sau khi bao gồm wp-load.php, tương tự như những gì bạn có ở đó; chỉ hoạt động với việc xả, W3 Total Cache sẽ khởi động bộ đệm, tuy nhiên nó không xuất hiện để ngăn chặn việc xả của nó. Đánh giá theo cách mà đầu ra của bạn vẫn được lưu trong bộ nhớ cache và việc xóa không hoạt động, tôi nói rằng bạn có WP Super Cache, mạnh hơn.

Đảm bảo rằng bạn không bắt đầu bộ đệm mới trước khi bao gồm wp-load.php, nếu không, bạn sẽ có bộ đệm trong bộ đệm (bộ đệm?) Và sẽ phải xóa hai lần trở lên.


Cảm ơn - câu trả lời này đặc biệt hữu ích với mẫu mã. Chưa có thời gian để kiểm tra nhưng sẽ kiểm tra ngay bây giờ.
Alex Cook

Tôi đang sử dụng W3 Total Cache. Có vẻ như "wp_cache_disable" không phải là một chức năng hợp lệ - đó có phải là đặc trưng cho Super Cache không?
Alex Cook

Vâng, wp_cache_disable()đặc biệt đối với WP Super Cache. Tôi sẽ xem xét W3 Total Cache để xem làm thế nào nó có thể bị vô hiệu hóa theo cách tương tự, sử dụng ob_end_flushlàm việc cho tôi. Phiên bản và cài đặt W3 Total Cache của bạn là gì?
soulseekah

Tôi đã chỉnh sửa câu trả lời của mình.
soulseekah

Đảm bảo rằng bạn không khởi động bộ đệm mới trước khi bao gồm wp-load.php, nếu không bạn sẽ có bộ đệm trong bộ đệm.
soulseekah

4

Vô hiệu hóa bất kỳ plugin nào bạn có thể có bộ nhớ đệm toàn trang. WP-Super-Cache, W3 Total Cache, v.v.

WordPress không "trì hoãn đầu ra". Nhưng các plugin bộ nhớ đệm toàn bộ trang thường làm. Điều này là do họ đang cố gắng để có được đầu ra đó và lưu nó ở đâu đó, để sử dụng sau này trong việc phục vụ trang. Do đó, đầu ra trang bị trì hoãn cho đến khi kết thúc, nơi plugin có thể lưu trữ nó.


Ahhh, bắt tốt. Nên nghĩ về điều đó! Tôi sẽ kiểm tra và lấy lại cho bạn. Cảm ơn.
Alex Cook
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.