这篇文章也可以在我的博客中查看
Cron是Unix/Linux系统中的任务调度工具,允许用户在预定的时间和日期间隔自动运行命令或脚本
它通过Cron表达式定义任务执行的频率,该表达式包含分钟、小时、日期等信息
我们可以利用Cron来定期执行维护、备份、数据处理等编程任务,无需手动干预
wp-cron是WordPress用于装作cron的工具
这个打着cron名号的东西完全跟cron没有关系,而且不可靠
不不不,你不会想要它的
以下为官方的狡辩:
是啊,cron可能是有缺点,但wp-cron绝对没有任何优点
我的站点在不知情情况下,从来没成功启动过wp-cron
没有它倒也没出现任何问题
我们需要调度系统,但wp-cron根本不是调度系统
由于php脚本执行的特点,只有访问时才会执行一遍脚本
因此WordPress是没有守护进程的
所以你猜wp-cron怎么做到在任务时间到达时自己唤醒自己?
它做不到
它的执行逻辑是:
这会出现什么问题?
这是非常严重的问题,它本身并不是一个可靠的调度系统
绝对不能依赖它执行时间敏感任务
等等?你刚刚说fork一个后台进程?是怎么做的?
在WordPress中并不是通过克隆进程执行的,为了执行所有hook,它需要重新启动一次php处理函数
所以wordpress的做法是……自己给自己发送一个http请求
不是开玩笑,这坨代码切实出现在了WordPress的源码中:
$cron_request = apply_filters(
'cron_request',
array(
'url' => add_query_arg( 'doing_wp_cron', $doing_wp_cron, site_url( 'wp-cron.php' ) ),
'key' => $doing_wp_cron,
'args' => array(
'timeout' => 0.01,
'blocking' => false,
/** This filter is documented in wp-includes/class-wp-http-streams.php */
'sslverify' => apply_filters( 'https_local_ssl_verify', false ),
),
),
$doing_wp_cron
);
$result = wp_remote_post( $cron_request['url'], $cron_request['args'] );
我不知道它为什么非得用这种做法,可能是WordPress只有按这种方式才能正常从头启动吧……
但这就是最致命的问题
相当于DDoS攻击自己!
首先http请求是非常昂贵的,你试试在for循环里面使用wp_remote_post
即使是访问本机,你的页面加载速度也会质的下降
虽然wp_cron只会发送1次
wp_remote_post
,但这做法还是太丑了
你以为它只会访问环回地址吗?错啦!
我们再来看看wp-cron
激活自己时访问的地址:site_url('wp-cron.php')
理想情况下,它会:
OK这种情况虽然偶尔访问了一次公网(域名解析),但还是可以接受的
但问题是,如果使用了CDN呢?
如果你使用了Cloudflare等CDN,代理你服务器的请求
那不好意思,每次请求都是一次完美的脱裤子放屁哦_:
我受不了了,这得多浪费资源啊,简直是fork一下自己轰动全世界啊
有没有弥补的可能?能不能不访问公网?
我很努力地试了,但我失败了
稍微分享下吧
改host:在服务器中,将自己域名解析至127.0.0.1
理论上可行,但由于我服务器对Cloudflare开启了客户端SSL证书验证
因此我的访问被自己的服务器驳回了呢_
但我也不想不顾站点安全而关闭这个功能,所以,就此开摆吧……
或者有其他地址可以使wp_remote_post
直接访问到本机的wp_cron.php
文件
但我放弃了 毁灭吧世界
所以,告诉我,wp-cron到底有什么留存的价值?毙了它吧
打开config.php,在 That’s all, stop editing! Happy blogging.
之前加入:
define('DISABLE_WP_CRON', true);
/* That’s all, stop editing! Happy blogging. */
把它送走