As in my installation of WordPress (on a Russian hosting server dobrohost.ru, where nginx is enabled by default), there appear some problems with wp-cron and nginx. In versions prior to 2.7, the tasks were spawned with this code:

function spawn_cron() {

//skipped some code

if ( $argyle )
fputs( $argyle,
“GET {$parts[‘path’]}?check=” . wp_hash(‘187425’) . ” HTTP/1.0\r\n”
. “Host: {$_SERVER[‘HTTP_HOST’]}\r\n\r\n”
);

}

The socket was closed immediately, and nginx, working as a frontend for Apache, considered this as an error (#499 – the socket was closed prior to reply of webserver), the GET request was not relayed further and the task planner did not work. The problem can be resolved by adding a usleep(100000); delay (or a bit bigger, depending on the load of the server).

In further versions, wp-cron was rewrited and the tasks were spawned by this code:

wp_remote_post($cron_url, array(‘timeout’ => 0.01, ‘blocking’ => false));

A 0.01 second delay is often too small, so this should be changed to

wp_remote_post($cron_url, array(‘timeout’ => 0.1, ‘blocking’ => false));

or something like this, for proper work of wp-cron and nginx.