如何使php脚本只使用wp-cron运行

时间:2013-07-17 作者:Mr.M

我有一个php脚本,它执行一个函数并创建一个包含结果的xml文件。我希望这个脚本每天只运行一次,我正在使用wordpress cron来实现这一点。问题是这个脚本总是在所有页面加载时运行,这很糟糕,因为它需要超过30秒才能完成。如何停止它始终运行并使其仅与wp cron一起工作?我读过关于cronjob的文章,但我的主机没有这个功能。这是我在php文件顶部使用的代码:

 add_action( \'my_cron_hook\', \'myfunction\' );

if( !wp_next_scheduled( \'my_cron_hook\' ) ) {
 wp_schedule_event( time(), \'daily\', \'my_cron_hook\' );
}

register_deactivation_hook( __FILE__, \'my_deactivate\' );

function my_deactivate() {
 $timestamp = wp_next_scheduled( \'my_cron_hook\' );
 wp_unschedule_event($timestamp, \'my_cron_hook\' );
}
我希望脚本每天运行并始终在后台运行,它不应该影响用户导航。谢谢

编辑

以下是所有代码脚本:

 add_action( \'cO_cron_hook\', \'remoteHeader\' );

 if( !wp_next_scheduled( \'cO_cron_hook\' ) ) {
 wp_schedule_event( time() + 24 * 60 * 60, \'daily\', \'cO_cron_hook\' );
 }

 register_deactivation_hook( __FILE__, \'bl_deactivate\' );

function bl_deactivate() {
$timestamp = wp_next_scheduled( \'cO_cron_hook\' );
wp_unschedule_event($timestamp, \'cO_cron_hook\' );
}

set_time_limit(300);

function remoteHeader($url){
$online = \'online\';
$offline = \'offline\';
$agent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)";
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL,$url );
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch,CURLOPT_VERBOSE,false);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch,CURLOPT_SSLVERSION,3);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST, FALSE);
curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if($httpcode >= 200 && $httpcode < 400) return $online;
else return $httpcode;
}

/* create a dom document with encoding utf8 */
$domtree = new DOMDocument(\'1.0\', \'UTF-8\');

/* create the root element of the xml tree */
$xmlRoot = $domtree->createElement("xml");
/* append it to the document created */
$xmlRoot = $domtree->appendChild($xmlRoot);

$currentSite = $domtree->createElement("site");
$currentSite = $xmlRoot->appendChild($currentSite);

/* you should enclose the following two lines in a cicle */
$site = remoteHeader("http://google.com/");
$currentTrack->appendChild($domtree->createElement(\'google\',$site));

$site2 = remoteHeader("http://wordpress.com/");
$currentTrack->appendChild($domtree->createElement(\'wordpress\',$site2));

...

header("Content-Type: text/plain");
/* get the xml printed */
echo $domtree->save(\'mytest.xml\')

2 个回复
SO网友:EAMann

WP\\u Cron不是真正的Cron调度器。

它所做的是安排事件,标记应该何时运行,并等待页面流量。加载站点时,它会检查这些任务中是否有任何任务需要运行(即计划的时间已过),然后运行这些任务。所以您可以看到,WordPress的cron系统完全依赖于您的站点接收流量。

但是,它不会在同一进程中运行计划的代码。WordPress发回自身(即加载WordPress的另一个副本以用于单独的请求),并在那里运行代码。如果您看到由于这个脚本运行而导致页面加载延迟,那么这意味着您还有其他事情要做。

还有,您的呼叫wp_schedule_event 是错误的。第一个参数应该是您希望任务运行的时间。。。如果你只想每天运行一次,就不要“现在”。将此重写为:

wp_schedule_event( time() + 24 * 60 * 60, \'daily\', \'my_cron_hook\' );
最后,如果这个PHP脚本可以在WordPress之外运行,那么您就更适合在系统的crontab中安排常规事件。您的系统管理员或主机可以直接提供帮助。

SO网友:cogdog

如果您的web主机不允许您访问cron作业,您可以尝试一个免费的外部cron作业服务(我使用了其中一个,但现在忘记了使用哪一个)

https://www.google.com/search?q=web+cron+free

... 如果脚本具有公共URL。我在脚本中添加了一个哈希代码,以确保没有人可以直接调用不带键的脚本。

结束

相关推荐

无法加载wp-admin/admin-ajax.php

我遇到了一个奇怪的问题。昨天一切都很顺利。现在突然,我的ajax请求都不起作用了。问题是(我在firebug控制台中发现):无法加载资源:/wp管理/管理ajax。php所以admin-ajax.php 文件未成功。我已经仔细核对了以下内容:指向的urladmin-ajax.php 是正确的,没有问题不只是“我自己的脚本”不起作用,我已经安装了buddypress,来自buddypress的所有ajax请求也会出现同样的错误我直接键入的urladmin-ajax.php 进入浏览器后,google chr