Blog

  • 用 WordPress 多站点构建博客平台:架构笔记

    用 WordPress 多站点构建博客平台:架构笔记

    做「博客服务」而不是「第二个 WordPress」:平台层只做编排,内容能力全部复用核心。这是这套平台最关键的边界。

    为什么选多站点

    一个网络、无数博客。用户注册即建站,数据同库但逻辑隔离,备份与升级都只有一份代码要管。

    配置状态机

    每个博客的创建是一条可恢复的流水线:REQUESTED → SITE_CREATED → TEMPLATE_APPLIED → READY。每一步幂等,失败可重试:

    // 每一步幂等,可安全重试
    foreach ( $steps as $step ) {
        $result = $this->{$step}( $ctx );
        if ( is_wp_error( $result ) ) {
            $ctx->fail( $step, $result );
            return; // 下次从断点继续
        }
    }

    slug 竞态

    缓存的 domain_exists 可能过期,两个并发注册可能同时通过检查。解法是在 MySQL GET_LOCK 锁内直查 wp_blogs 表:

    SELECT GET_LOCK( 'bsp_slug_<md5>', 5 );
    SELECT blog_id FROM wp_blogs WHERE domain = %s AND path = '/';

    压测结果

    三路并发创建同名 slug,收敛为恰好一个站点、一个失败提示。

  • 部署 PHP 后必须重启 FPM:opcache 的一个教训

    部署 PHP 后必须重启 FPM:opcache 的一个教训

    改了代码、刷新了页面、什么都没变——十有八九是 opcache 还在跑旧字节码。validate_timestamps 在高并发下并不即时。

    # 部署脚本最后一行
    systemctl restart php8.3-fpm

    把重启写进部署管线,而不是你的记忆里。

  • 给多站点网络装上 Redis 对象缓存

    PhpRedis + 成熟的 drop-in,加统一前缀隔离命名空间。QPS 上去之后,慢查询日志安静得让人感动。

    wp redis status   # Connected / PhpRedis / drop-in valid

    注意:Redis 只放对象缓存,不放会话——单机文件会话 + 远程库的组合才睡得着觉。