用于高负载多站点网络的 WordPress Multisite Cron

news2024/11/24 16:31:50

在易服客建站平台创建免费网站

500M免费空间,可升级为10GB电子商务网站

创建免费网站

用于高负载多站点网络的 WordPress Multisite Cron

发布于 2023年3月18日

你也许知道WordPress 内置 CRON 的工作方式与传统 CRON 不同。

它不是在指定时间触发,而是仅在有人访问该网站时触发。因此,如果没有访问,则不会触发 wp-cron,因此不会执行任何任务。

反之亦然,如果您在您的网站上吸引了大量访问者,则每次有人查看任何页面并检查计划任务时,WordPress CRON 系统都会被触发。这样 WordPress CRON 会导致额外的服务器负载(CPU 使用率增加),这可能会严重损害网站性能。

当谈到 WordPress Multisite Cron时,您的问题会随着安装的网站数量而增加。

目录 隐藏

wp-cron 是如何工作的? 

如何为 WordPress Multisite 设置 CRON 作业并修复跨网络的延迟计划问题? 

一个明显的方法 

更好的方法 

我为高负载 WordPress 多站点网络设置 CRON 的方法 

wp-cron 是如何工作的?

Multisite 上的 WordPress CRON 在每个博客上独立工作。

比如说,您在网站 A 和 B 上安排了帖子。

当有人访问网站 A 时,博客 A 上的预定帖子虽然有延迟,但最终会发布。但是网站 B 上的帖子永远不会发布,除非有人也访问网站 B。

错过网络每个站点的计划问题可能是一件相当烦人的事情。当您在多站点安装中获得大量流量时,您可能会遇到另一个问题。

根据网络中网站的数量,CPU 使用率问题也会成倍增加。这就是为什么多站点使用内置 CRON根本不是一个好主意。相反,我们应该设置一个真正的 CRON 作业。

如何为 WordPress Multisite 设置 CRON 作业并修复跨网络的延迟计划问题?

一个明显的方法

为了降低 CPU 使用率并让任务执行,无论博客是否有点击,我们应该用真正的 CRON 替换 WordPress Multisite CRON。

在这里,我详细描述了如何为单个安装执行此操作。

Multisite 的步骤非常相似,除了我们需要在网络的每个站点上触发 CRON(因为它们是独立工作的)。

1. 在整个网络中禁用 WordPress CRON  wp-config.php

define('DISABLE_WP_CRON', true);

2. 我们将借助foreach循环触发每个站点的发布。

trigger.php在您拥有wp-config.php.
我有一个很棒的包装器,可以在 WordPress Multisite 中执行批量操作,这为我节省了大量时间。让它也为你工作:

if ( is_multisite()) {
$sites=get_sites();
foreach ($sitesas$site ) {
$blog_id=$site->blog_id;
//if ($blog_id < 6 ){ //if we need just certain blogs
switch_to_blog( $blog_id );
wp_suspend_cache_addition(true);
//here’s what we’re gonna do…
wp_suspend_cache_addition(false);
restore_current_blog();
//} //endif $blog_id
sleep(3); // this should be paused for 3 seconds before every other blog
}//endforeach
}//endif multisite

所以我们只需将这段代码放在该行之后//here's what we're gonna do...

$site_url = get_site_url($blog_id); $command = $site_url.'/wp-cron.php?doing_wp_cron'; wp_remote_get($command); 

它将自动触发我们网络的每个站点。

整个trigger.php看起来像这样:

if ( is_multisite()) {
$sites = get_sites();
foreach ($sites as $site ) {
$blog_id = $site->blog_id;
//if ($blog_id < 6 ){ //if we need just certain blogs
switch_to_blog( $blog_id );
wp_suspend_cache_addition(true);
//here’s what we’re gonna do…
$site_url = get_site_url($blog_id);
$command = $site_url.’/wp-cron.php?doing_wp_cron’;
wp_remote_get( $command );
wp_suspend_cache_addition(false);
restore_current_blog();
//} //endif $blog_id
sleep(3); // this should be paused for 3 seconds before every other blog
}//endforeach
}//endif multisite

3. 您现在所需要的只是在您的服务器上为您的主博客添加一个CRON 作业:

wget -O /dev/null https://network-main-blog.com/trigger.php

另外,我要设置一个合理的时间间隔。

根据指定的周期(例如每天一次),Unix CRON 将命中trigger.php -> 将命中wp-cron.php网络中的每个博客 -> 将检查是否有任何计划的任务,并执行它们。

这是在 WordPress 多站点安装上设置计划任务的充分且清晰的方法。

但是,如果您拥有相当大的网络并且服务器资源紧张,您会怎么做?

更好的方法

WordPress 中的所有计划任务都存储在wp_options表中。

当您安排一个任务每天发布 50 个草稿时,50 个任务将保存在您的 wp_options 表中。此表的大部分(包括 CRON 作业)在每次页面加载时加载。这对于单个安装来说没问题,但它会显着降低您在 WordPress 多站点网络上的站点速度。

比如说,您有一个由 100 个站点组成的中型网络,这导致我们在wp_options表中增加了 50*100=5000 行(请注意,这是同一个数据库!)。此外,您的网络访问次数越多,服务器资源消耗就越多。

为了晚上安然入睡而不用担心您的 MySQL 服务器随时崩溃,我们希望跳过 WordPress cron。 我们将设置一个 CRON 作业来直接发布帖子,而不是用于发布计划帖子的 CRON 作业。

此外,我将提供有关如何安排的详细说明,但在您继续之前,请记住这种方法可能并不适合每个项目。例如,如果特定的发布时间对您来说非常重要,那么这不是您想要做的。

但是如果你有高负载网络并且你需要每天发布草稿,节省服务器资源并且不介意发布时间是 +- 几个小时,你绝对应该尝试一下。

1. 首先,我们需要能够实际发布 50 份草稿的函数。

在WordPress根目录下创建publishing.php内容如下:

if (!defined(‘ABSPATH’)) {require_once(dirname( __FILE__ ) . ‘/wp-load.php’);}
global $wpdb;
$blog_id = get_current_blog_id();
$args = array(‘post_type’ => ‘post’, ‘post_status’ => ‘draft’ , ‘numberposts’ => 50, ‘fields’ => ‘ids’);
$future_posts = get_posts( $args );
foreach ($future_posts as $future_post) {
$my_post = array(‘ID’ => $future_post, ‘post_status’ => ‘publish’);
$upd = wp_update_post( $my_post, true );
}

这段简单的代码将直接发布草稿,无需计划。

2. 现在我们需要触发它publishing.php以在整个网络中执行。我们正在用服务器 CRON 替换 WP CRON,就像我们在上一个选项中所做的一样。

只是注意的地方是 publishing.php ,而不是wp-cron.php?doing_wp_cron

$command = $site_url.'/publishing.php';

瞧!我们通过在网络上用真正的 CRON 作业替换 WP Multisite CRON 并完全跳过了调度计划,设法减少了 CPU 和内存使用。很酷,是吗?

但…

正如我已经说过的,对于小型网络,这种方法非常好,但如果您有 100 多个博客,这意味着发布功能将一次执行 50*100 = 5000 次。这将减慢网站速度,对吧?

我为高负载 WordPress 多站点网络设置 CRON 的方法

如何在 100 多个博客上每天发布 50 篇文章而不至使您的服务器崩溃?

概述:由 100 多个博客组成的 WordPress 多站点网络。每个博客每天应该发布 50 篇文章。它导致我们每天应该由 CRON 发布 50*100=5000 个帖子。

目标:应该以最小的服务器负载执行,因为网络在发布过程中是分开加载的。

在这里,我使用另一种可以显着降低 CPU 使用率的方法。这样我们就有了:

  • 没有 CRON 事件来计划发布帖子
  • 没有发布 50 个帖子的 CRON 事件
  • CRON 在网络的每个网站上每天触发一次 (!)
  • 批量发布不会超载,一次仅发布 50 个帖子

这种方法对于开发人员来说可能有些棘手,但这是我们使用尽可能少的服务器资源的方式。

我们将为网络中的每个网站添加一个单独的 CRON 作业,并为其提供直接执行的命令  publishing.php 。

我们已经准备好这个文件,现在我们需要为网络中的每个站点添加一个单独的 CRON 作业。

每个 cronjob 应该以 1 分钟的间隔安排。想象一下,您的网络中有 3 个站点,因此 CRON 作业应该像这样执行:

站点 A — 00:01

站点 B — 00:02

站点 C — 00:03

每个人每天在准确的时间执行一次。

这样一分钟内只有一个站点被触发,没有超载,没有问题。

因此,您需要将 3 个命令添加到您的 crontab:

wget -O /dev/null http://siteA.com/publishing.php
wget -O /dev/null http://siteB.com/publishing.php
wget -O /dev/null http://siteC.com/publishing.php

在网络中有 100 多个站点! 你要我手动添加 100 多个 cronjobs 吗?

当然,不是!你可以用Linux 中的 Cron 作业批量调度实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472400.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

辨析 变更请求、批准的变更请求、实施批准的变更请求

变更请求、批准的变更请求、实施批准的变更请求辨析 辨析各种变更请求&#xff0c;不服来辨。 变更请求 定义&#xff1a;对正规受控的文件或计划(范围、进度、成本、政策、过程、计划或程序)等的变更&#xff0c;以反映修改或增加的意见或内容 根据变更请求的工作内容可将变…

python-使用Qchart总结3-绘制曲线图

1.将画好的图表关联 解释说明图 2.新建一个文件画曲线图&#xff0c;并关联到UI的py文件上&#xff0c;上代码 import sys from PyQt5.Qt import * from PyQt5.QtChart import QChartView, QChart, QValueAxis, QSplineSeries from PyQt5.QtGui import QPainter, QColor, QFon…

PHP实现使用foreach、for等语句实现数组遍历的功能举例

目录 前言 一、什么是数组 二、遍历数组for语句案例 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 三、输出数组的键名和值,foreach语句案例 1.1运行流程&#xff08;思想&#xff09; 1.2代码段 1.3运行截图 前言 1.若有选择&#xff0c;可实现…

二十三种设计模式第二篇--工厂模式

上篇我们了解了6条设计模式的准则&#xff0c;我相信如果你想了解设计模式&#xff0c;那么你迈出的第一步&#xff0c;我会将上一篇文档里边的6大准则进行一篇有关的代码展示&#xff0c;当然这是题外话了&#xff0c;本篇我们将重点围绕工厂模式进行讲解&#xff0c;天哪&…

Shell+VCS学习1

Shell脚本常见问题 mkdir rmdir rm mkdir 创建文件夹 mkdir -p filename-p 确保目录名称存在&#xff0c;不存在的就建一个。 mkdir -p runoob2/test若 runoob2 目录原本不存在&#xff0c;则建立一个。&#xff08;注&#xff1a;本例若不加 -p 参数&#xff0c;且原本 ru…

【C++】反向迭代器的实现

文章目录 1.迭代器的分类2.反向迭代器的使用3.反向迭代器的模拟实现4.list类的反向迭代器实现 1.迭代器的分类 我们随便打开一个容器&#xff0c;看迭代器相关的接口&#xff0c;都可以发现&#xff0c;支持迭代器的容器&#xff0c;其迭代器有以下几类 正向迭代器const正向迭…

软件测试必备的Linux知识(一)

1. Linux 概述 1.1 测试人员为什么学习linux 对于软件测试人员来说&#xff0c;我们测试的任何产品都是基于操作系统。比如我们每天都在使用的QQ软件&#xff0c;它有windows、ios、Android、Mac OS等版本&#xff0c;需要把QQ安装在各个平台上&#xff0c;才能进行相应的测试…

03 KVM虚拟机镜像制作

文章目录 03 KVM虚拟机镜像制作3.1 概述3.2 制作镜像3.2.1 使用root用户安装qemu-img软件包3.2.2 使用qemu-img工具的创建镜像文件 3.3 修改镜像磁盘空间大小3.3.1 查询当前虚拟机镜像磁盘空间大小3.3.2 修改镜像磁盘空间大小3.3.3 查询修改后的镜像磁盘空间大小 03 KVM虚拟机镜…

WPS作图常见问题+LATLEX

【LaTex】LaTex的下载与安装&#xff08;超详细、超简洁&#xff09; 表格 1、打开WPS表格&#xff0c;切换至“开始”选项卡&#xff0c;单击“绘图边框”按钮&#xff0c;如下图。 2、鼠标变成如下图一样的笔后&#xff0c;按照斜线表头的方向拉动鼠标&#xff0c;然后就给…

【2023程序员必看】前端行业分析

“前端已死&#xff1f;”|“情绪焦虑&#xff1f;” 最近经常在知乎、脉脉等平台上看到有人在渲染前端就业危机&#xff0c;甚至使用“前端已死”的字眼&#xff0c;颇有“语不惊人死不休”的意味。 “前端已死”更多的是一种焦虑情绪的表达。现阶段的市场行情确实不太好&am…

【LLM】离线部署ChatGLM-6B模型

目录 前言 准备环境 打包环境 下载/上传模型 部署模型 前言 甲方出手&#xff0c;天下我有&#x1f929;。圆梦了圆梦了~一直想整一台GPU服务器尝尝鲜&#xff0c;奈何钱包空空&#xff0c;虽然有可以在CPU上部署的方案&#xff0c;但效果却不是让人那么满意&#xff0c…

杭州一公司开出20万月薪/320万年薪抢人!ChatGPT掀起AI热潮,AIGC人才被爆抢

5年工作经历&#xff0c;博士学位&#xff0c;最高月薪20万。 最近&#xff0c;位于杭州未来科技城一家公司&#xff0c;开出了最高320万年薪&#xff0c;招聘AIGC方向算法工程师一名。 ChatGPT在全球掀起了AI热潮&#xff0c;国内互联网大厂纷纷加入战局打造国内版ChatGPT。…

Analysis For Office的一些使用技巧

目录 1. 自由特性下钻停止刷新 2. 直接双击过滤内容 3.重复层级值 4. 从过滤值选参数 5.从Excel复制参数 6. 保存参数值 7.计划值回退到上一步 8. 保存当前导航步骤 1. 自由特性下钻停止刷新 一般我们每次拖一个自由特性到workbook里&#xff0c;报表都会自动刷新。如…

电商败给了直播带货,实体店能靠直播提升销量吗?

根据官方发布的最新数据&#xff0c;直播带货的市场规模将达到4.7万亿元&#xff0c;不少品牌借助直播间触达了上亿的用户&#xff0c;完成了千万级别的销售订单。 目前直播带货已经成为“红海”市场&#xff0c;未来仍然有巨大的发展空间。 一、直播带货打败传统电商 自从电商…

vue3+ts数组去重方法-reactive/ref响应式显示

vue3ts数组去重方法-reactive/ref响应式显示 本文目录 vue3ts数组去重方法-reactive/ref响应式显示简单数组使用 Set 和 扩展运算符&#xff08;...&#xff09;将集合转换回数组使用 Set 和 Array.from() 方法将集合转换回数组使用 filter 和 indexOf 进行判断使用 splice 和 …

函函函函函函函函函函函数——two

&#x1f929;本文作者&#xff1a;大家好&#xff0c;我是paperjie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 &#x1f970;内容专栏&#xff1a;这里是《C知识系统分享》专栏&#xff0c;笔者用重金(时间和精力)打造&#xff0c;基础知识一网打尽&#xff0c;…

【DevOps视频】笔记】1. DevOps的诞生

视频官网 目录 一、DevOps介绍 定义&#xff1a; 作用&#xff1a; 核心&#xff1a; 二、软件开发流程 三、流程图 一、DevOps介绍 定义&#xff1a; Development & Operations的缩写&#xff0c;也就是开发&运维DevOps 是一个不断提高效率并且持续不断工作…

(八)Geoprocessing地理处理框架——基本介绍

&#xff08;八&#xff09;Geoprocessing地理处理框架——基本介绍 目录 &#xff08;八&#xff09;Geoprocessing地理处理框架——基本介绍 1.基本概念2.集成ArcToolbox3.多种使用方式3.1对话框3.2Python窗口3.3模型构建器3.4脚本 4.应用基础4.1启动ArcToolbox4.2激活扩展工…

PostgreSQL中创建索引的消极影响

相信大家在使用数据库中&#xff0c;提高SQL查询速度最简单的办法就是添加相关索引&#xff0c;但是其实我们创建的索引并不一定能用上&#xff0c;有时候顺序扫描也并不见的就比离散的索引扫描差&#xff0c;任何事物我们要辩证的看待&#xff0c;今天我们说明一下创建索引的一…

AQS 抽象同步队列的简单理解

前置知识&#xff1a; 可重入锁又叫递归锁&#xff0c;同一个线程在外层方法获取锁的时候&#xff0c;在进入该线程内层方法会自动获取锁&#xff0c;不会因为之前已经获取过还没释放就阻塞 同一个线程可以多次获得同一把锁 每个锁对象都有一个锁计数器和一个指向持有该锁的…