【WordPress】给你一万个不使用WP-Cron定时机制的理由

6 篇文章 0 订阅
6 篇文章 0 订阅

这篇文章也可以在我的博客中查看

定时任务

cron

Cron是Unix/Linux系统中的任务调度工具,允许用户在预定的时间和日期间隔自动运行命令或脚本
它通过Cron表达式定义任务执行的频率,该表达式包含分钟、小时、日期等信息

我们可以利用Cron来定期执行维护、备份、数据处理等编程任务,无需手动干预

wp-cron

wp-cron是WordPress用于装作cron的工具

这个打着cron名号的东西完全跟cron没有关系,而且不可靠

为什么需要wp-cron

不不不,你不会想要它的

以下为官方的狡辩:

  1. WordPress核心和许多插件需要调度系统来执行基于时间的任务
    然而,许多托管服务是共享的,并且不提供对系统调度程序的访问
  2. 使用WordPress API设置定时任务,比在WordPress之外使用系统调度程序更简单
  3. 使用系统调度程序时,如果时间流逝而任务未运行,将不会重新尝试运行任务
    而使用WP-Cron,所有预定的任务都被放入队列中,并将在下一个机会(即下一次页面加载)时运行
    因此,虽然您无法百分之百确定您的任务将在何时运行,但可以百分之百确定它最终会运行。

是啊,cron可能是有缺点,但wp-cron绝对没有任何优点

为什么不需要wp-cron

不是必须的

我的站点在不知情情况下,从来没成功启动过wp-cron
没有它倒也没出现任何问题😅

假调度

我们需要调度系统,但wp-cron根本不是调度系统

由于php脚本执行的特点,只有访问时才会执行一遍脚本
因此WordPress是没有守护进程的

所以你猜wp-cron怎么做到在任务时间到达时自己唤醒自己?
它做不到

它的执行逻辑是:

  1. 在页面访问时顺便检测是否有逾期任务
  2. 如有,fork一个后台进程处理任务

这会出现什么问题?

  • 如果网站访问量很大:每次访问都会加载执行wp-cron.php,这会增加服务器压力
  • 如果网站访问量很少:没有其它内置机制可以唤醒wp-cron.php,你的定时任务不会按时执行,直到有人访问

这是非常严重的问题,它本身并不是一个可靠的调度系统
绝对不能依赖它执行时间敏感任务

抽象复制进程

等等?你刚刚说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只有按这种方式才能正常从头启动吧……
但这就是最致命的问题

昂贵的http请求

相当于DDoS攻击自己!

首先http请求是非常昂贵的,你试试在for循环里面使用wp_remote_post
即使是访问本机,你的页面加载速度也会质的下降

虽然wp_cron只会发送1次wp_remote_post,但这做法还是太丑了

昂贵的互联网请求

你以为它只会访问环回地址吗?错啦!

域名解析请求

我们再来看看wp-cron激活自己时访问的地址:site_url('wp-cron.php')
理想情况下,它会:

  1. 根据站点site_url设置,域名解析
  2. 域名解析到本机IP地址
    • 缓存解析结果,避免短期重复解析
  3. 识别为本机地址,走环回

OK这种情况虽然偶尔访问了一次公网(域名解析),但还是可以接受的
但问题是,如果使用了CDN呢?

CDN请求

如果你使用了Cloudflare等CDN,代理你服务器的请求
那不好意思,每次请求都是一次完美的脱裤子放屁哦_

  1. 根据站点site_url设置,域名解析
  2. 域名解析到CDN地址
  3. CDN转发请求到你的服务器(本机)
  4. 最终交给WordPress,终于能够开始执行wp-cron任务……
  5. 执行完任务,它还得返回结果……
  6. 结果又经过CDN,返回到了你的服务器……

我受不了了,这得多浪费资源啊,简直是fork一下自己轰动全世界啊

有没有弥补的可能?能不能不访问公网?

我很努力地试了,但我失败了
稍微分享下吧

改host:在服务器中,将自己域名解析至127.0.0.1

理论上可行,但由于我服务器对Cloudflare开启了客户端SSL证书验证
因此我的访问被自己的服务器驳回了呢_
但我也不想不顾站点安全而关闭这个功能,所以,就此开摆吧……

或者有其他地址可以使wp_remote_post直接访问到本机的wp_cron.php文件
但我放弃了 毁灭吧世界

关闭wp-cron

所以,告诉我,wp-cron到底有什么留存的价值?毙了它吧

打开config.php,在 That’s all, stop editing! Happy blogging.之前加入:

define('DISABLE_WP_CRON', true);
 /* That’s all, stop editing! Happy blogging. */

把它送走

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要设置yum-cron定时更新时间,您需要编辑两个配置文件:/etc/yum/yum-cron.conf和/etc/yum/yum-cron-hourly.conf。\[2\]这两个配置文件用于配置每天和每小时需要执行的内容。在/etc/yum/yum-cron.conf中,您可以找到以下两个参数来设置定时更新时间: 1. update_cmd:这个参数定义了在定时更新时使用的命令。默认值是default,表示使用系统默认的更新命令。您可以根据需要将其更改为其他命令。 2. random_sleep:这个参数定义了在执行定时更新之前的随机延迟时间。默认值是360,表示延迟时间为0到360秒之间的随机数。您可以根据需要将其更改为其他值。 在/etc/yum/yum-cron-hourly.conf中,您可以找到以下参数来设置每小时执行的定时更新时间: 1. random_sleep:这个参数定义了在执行每小时定时更新之前的随机延迟时间。默认值是15,表示延迟时间为0到15分钟之间的随机数。您可以根据需要将其更改为其他值。 请注意,这些参数的具体值取决于您的需求和系统配置。您可以使用文本编辑器(如vi命令)打开这些文件,并根据需要进行修改。\[2\]完成配置后,您可以使用以下命令来让yum-cron按照您设置的定时更新时间执行: - 对于每小时定时更新:编辑/etc/cron.hourly/0yum-hourly.cron文件,将exec /usr/sbin/yum-cron /etc/yum/yum-cron-hourly.conf行中的/etc/yum/yum-cron-hourly.conf更改为您的配置文件路径。 - 对于每天定时更新:编辑/etc/cron.daily/0yum-daily.cron文件,将exec /usr/sbin/yum-cron行中的/usr/sbin/yum-cron更改为您的配置文件路径。 请确保在修改配置文件后保存并退出。然后,yum-cron将按照您设置的定时更新时间执行更新任务。\[3\] #### 引用[.reference_title] - *1* *2* *3* [通过yum-cron对linux进行安全更新](https://blog.csdn.net/wenwst/article/details/85062058)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值