
mediawiki 官方文档中所谓“php module”并非可直接 import 的独立模块,而是其内部数据库操作层的旧版说明;实际开发应通过编写扩展或直连数据库执行 sql,而非尝试导入不存在的库。
mediawiki 官方文档中所谓“php module”并非可直接 import 的独立模块,而是其内部数据库操作层的旧版说明;实际开发应通过编写扩展或直连数据库执行 sql,而非尝试导入不存在的库。
MediaWiki 是一个高度集成的 PHP 应用,其核心代码(如数据库抽象层 Wikimedia\Rdbms、查询构建器 IDatabase、以及实体访问类如 Title、WikiPage、RevisionStore)不以 Composer 包或独立模块形式发布,也不支持像 import mediawiki-core 这样的语言级导入语法。你所查阅的 Database 文档 实际是 MediaWiki 源码中 includes/ 目录下数据库相关类的 Doxygen 生成说明,面向的是MediaWiki 自身开发者,而非外部调用者——它描述的是框架内部如何封装 MySQL/PostgreSQL 查询,并非对外暴露的 SDK。
✅ 正确的两种实践路径
1. 推荐方式:开发 MediaWiki 扩展(安全、稳定、可维护)
将你的编辑/创建逻辑封装为一个自定义扩展,即可天然获得完整的 MediaWiki 服务容器、数据库连接、权限校验与事务支持:
// extensions/MyDevTool/MyDevTool.php
<?php
use MediaWiki\MediaWikiServices;
use MediaWiki\Title\Title;
use MediaWiki\WikiPage\WikiPage;
$wgExtensionCredits['other'][] = [
'name' => 'MyDevTool',
'author' => 'You',
'description' => 'Local dev utilities for page creation & revision',
];
$wgExtensionFunctions[] = function () {
// 在 MediaWiki 初始化完成后注册 CLI 命令(需配合 Maintenance 脚本)
$GLOBALS['wgAutoloadClasses']['MyDevToolCreatePage'] =
__DIR__ . '/maintenance/CreatePage.php';
};// extensions/MyDevTool/maintenance/CreatePage.php
<?php
use Maintenance;
use MediaWiki\Title\Title;
use MediaWiki\WikiPage\WikiPage;
use MediaWiki\Revision\RevisionRecord;
use MediaWiki\Revision\MutableRevisionRecord;
class MyDevToolCreatePage extends Maintenance {
public function __construct() {
parent::__construct();
$this->addDescription( 'Create a test page via DB layer' );
$this->addArg( 'title', 'Page title (e.g. "Test/Example")', true );
$this->addArg( 'text', 'Wikitext content', true );
}
public function execute() {
$title = Title::newFromText( $this->getArg(0) );
if ( !$title || $title->isExternal() ) {
$this->fatalError( "Invalid title" );
}
$content = ContentHandler::makeContent(
$this->getArg(1),
$title,
NS_MAIN,
CONTENT_MODEL_WIKITEXT
);
$wikiPage = WikiPage::factory( $title );
$wikiPage->doEditContent( $content, 'CLI init', [
'bot' => true,
'minor' => true,
] );
$this->output( "✅ Created {$title->getFullText()}\n" );
}
}运行方式(确保 MW_INSTALL_PATH 已设置):
php maintenance/run.php MyDevToolCreatePage "Hello/World" "== Hi ==\nThis is a test."
✅ 优势:自动复用 $wgDBname、连接池、读写分离、钩子机制、CSRF/权限检查绕过(仅限本地可信环境)、未来可无缝升级。
2. 快速调试方式:直连数据库执行原生 SQL(仅限开发/测试)
若仅需临时脚本快速读写(例如初始化数据、批量修复),可绕过 MediaWiki 框架,使用 PDO 或 mysqli 直连:
<?php
// db-cli.php —— 独立于 MediaWiki 运行的调试脚本
$host = 'localhost';
$dbname = 'wikidb';
$user = 'wikiuser';
$pass = 'wikipass';
try {
$pdo = new PDO( "mysql:host=$host;dbname=$dbname;charset=utf8mb4", $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
// 示例:插入新页面(简化版,忽略 revision、text 表等完整流程)
$pdo->beginTransaction();
$pdo->exec("INSERT INTO page (page_namespace, page_title, page_is_redirect, page_len, page_content_model)
VALUES (0, 'DirectInsertTest', 0, 24, 'wikitext')");
$pageId = $pdo->lastInsertId();
$pdo->exec("INSERT INTO revision (rev_page, rev_text_id, rev_comment_id, rev_user, rev_timestamp, rev_minor_edit)
VALUES ($pageId, 1, 1, 1, NOW(), 0)");
$revId = $pdo->lastInsertId();
$pdo->exec("INSERT INTO text (old_id, old_text, old_flags) VALUES ($revId, 'Direct SQL insert', 'utf-8')");
$pdo->commit();
echo "✅ Inserted page ID $pageId, revision $revId\n";
} catch (Exception $e) {
$pdo->rollback();
die("❌ DB error: " . $e->getMessage());
}⚠️ 注意事项:
- 绝不用于生产环境:跳过 MediaWiki 的内容校验、防XSS过滤、修订链完整性检查;
- 表前缀需手动处理(如 $wgDBprefix = 'mw_' → 表名变为 mw_page);
- text 表存储压缩内容(old_flags 含 gzip),简单插入纯文本可能导致解析失败;
- 强烈建议先阅读 MediaWiki 数据库结构手册 理解 page/revision/content/slot/text 等核心表关系。
总结
MediaWiki 没有“可 import 的 php module”,它的数据库交互能力深度耦合于应用生命周期。对开发而言,唯一受支持、可长期维护的方式是编写扩展;而直连数据库仅适用于一次性调试任务。无论哪种方式,请始终以 Manual:Database_layout 和当前版本源码(如 includes/Revision/RevisionStore.php)为权威参考,避免依赖过时文档(如 15 年前的 md_docs_database.html)。

















