WordPress生态更丰富,有点什么问题搜索就能解决。国内的所谓开源免费几乎都是养猪待宰,谨慎商用。 说wp卡顿的是没有优化好,wepublish的WP-China-Plus 就是解决引用国外Google字体和js、官方市场被qiang造成的卡顿问题。 wp的主要瓶颈在mysql上,特别是wp-post数据表,如果能用云数据库MySQL 更好。 至于运行效率,用opcache缓存PHP脚本,加上Redis或者Memcached缓存数据库查询,可大幅提高速度。 如果有点技术,可以用WordPress自带的rest-api,做headless读写分离,再加上Elasticsearch搜索,都是很成熟的解决方案。 无交互的小网站就用WP-Super-Cache或或SIMPLY STATIC生成全站静态,套个CDN,利用不间断服务,缓存时间久一点。
江湖之上, WordPress 生态犹如繁花似锦,诸多问题皆有解决方案,只需轻轻一搜,便能破解疑难。然而,国内诸多开源免费之系统,却似那养猪待宰,商用之际,不得不防。言及 WP 卡顿,皆因未得优化之功,Wepublish 之 WP-China-Plus,犹如神兵利器,专治 Google 字体、JS 与官方市场之卡顿病症。
WP 之瓶颈,在于 MySQL,尤其是 WP-Post 数据表,如能启用云数据库 MySQL,则更胜一筹。论及运行效率,opcache 犹如神秘高手,悄然现身,缓存 PHP 脚本,再加上 Redis 或 Memcached 助力,数据库查询速度大幅提升。若有技术傍身,还可运用 WordPress 自带之 rest-api,实现 headless 读写分离,再加上 Elasticsearch 搜索,犹如神助,攻城略地。
而对于无交互之小网站,WP-Super-Cache 或 SIMPLY STATIC 犹如神秘宝物,全站静态生成,叠加 CDN 庇护,不间断服务,缓存时间更长。此等良策,犹如江湖奇遇,令众多侠客受益匪浅。
然则,世间繁华,难免纷扰,网站运营,安全为首。若想防患于未然,何不内外兼修,以 WordPress 为核心,搭配 Wp-China-Plus、opcache、Redis、Memcached、rest-api、Elasticsearch 诸多神功,加固防护,再借助 WP-Super-Cache 或 SIMPLY STATIC,生成静态,加速访问,防御与攻击并重,岂不妙哉?
悠悠江湖路,繁华似锦,WordPress 生态犹如一部百科全书,藏有无尽奥秘。诸君只需用心探索,细心领悟,必能融会贯通,成为一代宗师。卡顿之患,亦可化为乌有,谈笑间,轻松解决。借此良机,让我们一起踏上 WordPress 之征途,开创新的篇章,共赏这绚丽多彩的江湖世界。
WordPress官方出品的HyperDB 是一个非常高级的数据库类,它取代了一些 WordPress 内置的数据库功能。主要区别是:
* HyperDB 可以连接到任意数量的数据库服务器,
* HyperDB 检查每个查询以确定合适的数据库。
它支持:
读写服务器(复制)
可配置的读写优先级
本地和远程数据中心
私人和公共网络
不同数据库/主机上的不同表
智能后写主读
故障主机的故障转移
用于分析的高级统计信息
WordPress 多站点
数据库一主多备实现的数据库主从集群,修改db-config.php内的数据库读写分离:
$wpdb->add_database(array(
'host' => 'mysql57001_master', // 主要数据库地址
'user' => 'wordpress0_3c9db',
'password' => 'V4ex41r^pGU2E^7TP7l;cUaqcHLxaGa7nQvzz6CPA',
'name' => 'wordpress0_3c9db',
'write' => 1, // 给主要数据可写入
'read' => !defined('DB_HOST_RPL1') ? 1 : 0, // 当从数据库不可用时主要数据库才可读取,如果从数据库可用则从从数据库读取。
));
if(defined('DB_HOST_RPL1')):
$wpdb->add_database(array(
'host' => 'mysql57001_slave', // 从数据库地址
'user' => 'wordpress0_3c9db',
'password' => 'V4ex41r^pGU2E^7TP7l;cUaqcHLxaGa7nQvzz6CPA',
'name' => 'wordpress0_3c9db',
'write' => 0, // 从数据库不可写入
'read' => 1, // 从数据库可读取
));
endif;
WordPress 祖传使用SQL_CALC_FOUND_ROWS进行数量统计并计算分页,但是这个查询语句在大数据量 (W+) 的情况下是很慢的,一个比较好的解决方法是将其替换成更为现代的COUNT语句。
<?PHP
/**
* Plugin Name: Fix WordPress Slow Queries
* Description: Fix WordPress Slow Queries
* Author: Mahdi Akrami
* Version: 1.0.0
*/
class FIX_WP_SLOW_QUERY {
public static function init () {
/**
* WP_Query
*/
add_filter ( 'found_posts_query', [ __CLASS__, 'add_found_rows_query' ], 999, 2 );
add_filter ( 'posts_request_ids', [ __CLASS__, 'remove_found_rows_query' ], 999 );
add_filter ( 'posts_pre_query', function ( $posts, \WP_Query $query ) {
$query->request = self::remove_found_rows_query ( $query->request );
return $posts;
}, 999, 2 );
add_filter ( 'posts_clauses', function ( $clauses, \WP_Query $wp_query ) {
$wp_query->fw_clauses = $clauses;
return $clauses;
}, 999, 2 );
}
public static function remove_found_rows_query ( $sql ) {
return str_replace ( ' SQL_CALC_FOUND_ROWS ', '', $sql );
}
public static function add_found_rows_query ( $sql, WP_Query $query ) {
global $wpdb;
$distinct = $query->fw_clauses['distinct'] ?? '';
$join = $query->fw_clauses['join'] ?? '';
$where = $query->fw_clauses['where'] ?? '';
$groupby = $query->fw_clauses['groupby'] ?? '';
$count = 'COUNT (*)';
if ( ! empty ( $groupby ) ) {
$count = "COUNT ( distinct $groupby )";
}
return "
SELECT $distinct $count
FROM {$wpdb->posts} $join
WHERE 1=1 $where
";
}
}
FIX_WP_SLOW_QUERY::init ();
WordPress 祖传使用SQL_CALC_FOUND_ROWS进行数量统计并计算分页,但是这个查询语句在大数据量 (W+) 的情况下是很慢的,一个比较好的解决方法是将其替换成更为现代的COUNT语句。
<?PHP
/**
* Plugin Name: Fix WordPress Slow Queries
* Description: Fix WordPress Slow Queries
* Author: Mahdi Akrami
* Version: 1.0.0
*/
class FIX_WP_SLOW_QUERY {
public static function init () {
/**
* WP_Query
*/
add_filter ( 'found_posts_query', [ __CLASS__, 'add_found_rows_query' ], 999, 2 );
add_filter ( 'posts_request_ids', [ __CLASS__, 'remove_found_rows_query' ], 999 );
add_filter ( 'posts_pre_query', function ( $posts, \WP_Query $query ) {
$query->request = self::remove_found_rows_query ( $query->request );
return $posts;
}, 999, 2 );
add_filter ( 'posts_clauses', function ( $clauses, \WP_Query $wp_query ) {
$wp_query->fw_clauses = $clauses;
return $clauses;
}, 999, 2 );
}
public static function remove_found_rows_query ( $sql ) {
return str_replace ( ' SQL_CALC_FOUND_ROWS ', '', $sql );
}
public static function add_found_rows_query ( $sql, WP_Query $query ) {
global $wpdb;
$distinct = $query->fw_clauses['distinct'] ?? '';
$join = $query->fw_clauses['join'] ?? '';
$where = $query->fw_clauses['where'] ?? '';
$groupby = $query->fw_clauses['groupby'] ?? '';
$count = 'COUNT (*)';
if ( ! empty ( $groupby ) ) {
$count = "COUNT ( distinct $groupby )";
}
return "
SELECT $distinct $count
FROM {$wpdb->posts} $join
WHERE 1=1 $where
";
}
}
FIX_WP_SLOW_QUERY::init ();