Opened 12 years ago
Closed 20 months ago
#25072 closed defect (bug) (duplicate)
Send no-cache response header from wp-cron.php requests
Reported by: |
|
Owned by: | |
---|---|---|---|
Milestone: | Priority: | normal | |
Severity: | normal | Version: | 2.1 |
Component: | Cron API | Keywords: | has-patch dev-feedback needs-refresh |
Focuses: | Cc: |
Description
In high-scale WordPress installs, it is common to enable DISABLE_WP_CRON
and then have a system cron ping wp-cron.php?doing_wp_cron
every minute. When working on a site with DISABLE_WP_CRON
, we recently ran into a situation where future-published posts were consistently missing their schedule for several minutes. It turns out that the network architecture routed requests through Pound and then Varnish before hitting the web server, including requests originating on the server itself.
Because of the default proxy cache configuration, the requests to wp-cron.php
were getting served from the cache without hitting WordPress, so the scheduled tasks were not getting executed. A workaround was put in place to add a timestamp cache-buster (i.e. wp-cron.php?doing_wp_cron&1283712312
), and then we worked out a more elegant solution with a mu-plugin which did nocache_headers()
if DOING_CRON
. It seems the best solution is to just always send no-cache headers from wp-cron.php
itself, as I can't imagine a situation where responses should be cached (except maybe with a max-age=60
).
In addition to the default no-cache headers that WordPress sends, we also included a Surrogate-Control: no-cache
header for caching proxies to specifically target.
So to summarize: I propose that wp-cron.php
send no-cache response headers.
Attachments (2)
Change History (13)
#1
@
12 years ago
Come to think of it, the DISABLE_WP_CRON
may be inconsequential here: the normal asynchronous wp-cron.php
loopback requests would also likely be subject to the proxy caching.
#8
in reply to:
↑ 6
@
9 years ago
Replying to nacin:
What if you just used a POST request instead?
Note we can't just send an arbitrary POST request: it would have to explicitly be a POST request without any post data because wp-cron.php
short-circuits if $_POST
is not empty:
if ( !empty($_POST) || defined('DOING_AJAX') || defined('DOING_CRON') ) die();
#9
@
9 years ago
@westonruter's suggestion & patch make sense to me. What needs to be done to move this forward ?
Patch to wp-cron.php to do nocache_headers()