扩展:Scribunto
发行状态: 稳定版 |
|
|---|---|
| 实现 | 解析器扩展 |
| 描述 | 提供在 MediaWiki 页面里嵌入脚本语言的一个框架 |
| 作者 |
|
| 最新版本 | 持续更新 |
| 兼容性政策 | 快照跟随MediaWiki发布。 master分支不向后兼容。 |
| PHP | 5.5+ |
|
Module (ns:828), Talk_Module (ns:829) |
|
|
|
|
|
| 下载 | |
| 前往translatewiki.net翻译Scribunto扩展 | |
| Vagrant角色 | scribunto |
| 问题 | 开启的任务 · 报告错误 |
Scribunto(拉丁语: "他们应当写下 ")扩展提供框架,并可将脚本语言嵌入MediaWiki页面。
尽管理论上可以支持任何脚本语言,自从2012发行以来Scribunto只支持过一种语言——Lua。
Scribunto Lua脚本在一个名为模块的命名空间中。 模块使用 #invoke 解析器函数 在普通的wiki页面上运行,每个模块都有一个函数的集合,可以使用wiki文本语法调用,例如:
{{#invoke: Module_name | function_name | arg1 | arg2 | arg3 ... }}
安装
- 下载文件,并解压
Scribunto文件夹到extensions/目录中。
开发者和代码贡献人员应改从Git安装此扩展,输入:cdextensions/ gitclonehttps://gerrit.wikimedia.org/r/mediawiki/extensions/Scribunto - 请新增下列代码到您的LocalSettings.php 文件的底部:
wfLoadExtension( 'Scribunto' ); $wgScribuntoDefaultEngine = 'luastandalone';
- Yes 完成 – 请导航至您的wiki上的
Special:Version,以验证此扩展已成功安装。
使用Vagrant安装:
- 如果你有使用Vagrant ,请通过
vagrant roles enable scribunto --provision安装
需求
PCRE版本的兼容性
需安装PCRE 8.33以上的版本。 你可以查看PHP所使用的PCRE的版本:查看phpinfo()网页页面、或在命令行中使用以下命令:
php-r'echo "pcre: " . ( extension_loaded( "pcre" ) ? PCRE_VERSION : "no" ) . "\n";'
PHP mbstring 扩展
PHP需要启用 mbstring 扩展。
您可以通过查看phpinfo()网页或使用以下命令从命令行检查是否启用了mbstring支持:
php-r'echo "mbstring: " . ( extension_loaded( "mbstring" ) ? "yes" : "no" ) . "\n";'
Lua 二进制文件
捆绑的二进制文件
对于Linux(x86和x86-64)、Mac OS X Lion和Windows(32位和64位),Scribunto与Lua的二进制发行版捆绑在一起。
Scribunto应该在以下情况下为您提供开箱即用的服务:
- 您的web服务器在上述平台之一上运行。
- PHP的
proc_open函数不受限制。[1] - 在PHP中,
proc_terminate和shell_exec并未停用。 - 你的Web服务器已被配置为允许MediaWiki树中的二进制文件的执行。
- 注意 注意: 可能需要设置执行权限,例如,在Linux使用:
- 如果你在你的服务器上使用处于"Enforcing"模式的SELinux,你可能需要为此二进制文件设置合适的安全上下文(context)。 例如,在RHEL/CentOS 7中使用:
chmod755/path/to/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua
chcon-thttpd_sys_script_exec_t/path/to/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua
额外的二进制文件
如果您的Web服务器的操作系统不在上面的列表中,则可能需要额外的Lua二进制发行版,可以从 http://luabinaries.sourceforge.net/ 或从你的Linux发行中获得。
只支持Lua 5.1.x的二进制文件。
在你的Web服务器中安装了适当的二进制文件后,使用如下代码配置文件的地址:
# 其中,Lua是二进制文件的名称。 # 例如,SourceForge LuaBinaries 5.1.5 - Release 2 name the binary file lua5.1 $wgScribuntoEngineConf['luastandalone']['luaPath'] = '/path/to/binaries/lua5.1';
注意你不应该添加上面的行,除非你确认Scribunto的内置二进制对你来说不起作用。
LuaJIT,尽管理论上兼容,但并不受支持。 不再支持是因为幽灵漏洞和比特腐烂的问题(phab:T184156)。
可选安装
集成扩展
为能使用有语法高亮和自动缩进的代码编辑器,提供更舒适的用户界面,请安装下列扩展:
额外配置选项请参见各扩展的文档。
Lua沙盒扩展
LuaSandbox 是由Scribunto开发者们于2018年创建的一个PHP扩展。 它允许PHP直接运行Lua代码,能让Lua代码运行得比用Scribunto独立二进制更快。 请参阅Lua沙盒页面以获取更多详细信息及安装说明。
若要在安装LuaSandbox之后让Scribunto使用它,只需将LocalSettings.php里的$wgScribuntoDefaultEngine设置改成如下:
$wgScribuntoDefaultEngine = 'luasandbox';
(此设置实际上可选,因为没有它的时候Scribunto会自动检测LuaSandbox是否已安装,并决定是否使用它,不过添加此设置可以让Scribunto不用每次运行都检查。)
配置
有以下几个用于配置的变量:
- $wgScribuntoDefaultEngine
- 选择默认引擎。 有效值为
$wgScribuntoEngineConf中的键,默认为'luasandbox'或'luastandalone'。 - $wgScribuntoEngineConf
- 引擎配置的关联数组。 键时
$wgScribuntoDefaultEngine的有效值,值是配置数据的关联数组。 每个配置数组都必须包含一个'class'键,命名要使用的ScribuntoEngineBase子类。
luastandalone
$wgScribuntoEngineConf中使用以下键用于Scribunto_LuaStandaloneEngine。
通常你会将其设为类似于以下内容
$wgScribuntoEngineConf['luastandalone']['键'] = '值';
| 键 | 值 | 说明 |
|---|---|---|
| luaPath | null
|
到Lua解释器的路径。 |
| errorFile | null
|
到某一个文件的路径,此文件可由Web服务器用户写入,其中将记录来自独立运作的解释器的错误和调试输出。
默认情况下不记录独立解释器产生的错误输出。 配置输出: $wgScribuntoEngineConf['luastandalone']['errorFile'] = '/path/to/file.log'; |
| memoryLimit | 52,428,800 (50MB) | 内存限制,以字节为单位(使用ulimit强制执行)。 |
| cpuLimit | 7 | 指定CPU时间限制,以秒为单位(使用ulimit强制执行)。 |
| allowEnvFuncs | false
|
设为true以允许在模块内使用setfenv和getfenv。
|
luasandbox
针对Scribunto_LuaSandboxEngine,在$wgScribuntoEngineConf中使用以下键。
通常你会将其设为类似于以下内容
$wgScribuntoEngineConf['luasandbox']['鍵'] = '值';
| 键 | 值 | 说明 |
|---|---|---|
| memoryLimit | 52,428,800 (50MB) | 内存限制,以字节为单位。 |
| cpuLimit | 7 | CPU时间限制,以秒为单位。 |
| profilerPeriod | 0.02 | 轮询之间的时间,针对Lua分析器。 |
| allowEnvFuncs | false
|
设为true以允许在模块内使用setfenv和getfenv。
|
用法
脚本在称为模块 的命名空间中。 每个模块都有一系列函数,可以在像这样的维基文本语法中调用:
{{#invoke: Module_name | function_name | arg1 | arg2 | arg3 ... }}
Lua
学习 Lua
Lua是一种简单的编程语言,用于让初学者可以使用。 Lua的快速速成课程,可以尝试Learn Lua in 15 Minutes。
Lua语言的最全面的介绍是书籍《Programming in Lua》。 第一版(适用于Lua 5.0)可在线获得,主要与Scribunto使用的Lua 5.1版本相关:
- Programming in Lua(滑到书本广告底下以查找文本)
参考手册也比较有用:
Lua 环境
在Lua中,所有全局变量和函数的集合称为环境(environment)。
每个{{#invoke:}}调用会在一个单独的环境中运行。
一个{{#invoke:}}中定义的变量不会在另一个中有效。
这种限制是必要的,以维持维基文本解析器实现的灵活性。
调试控制台
编辑Lua模块时,编辑框底部会有一个"调试控制台"。 在这个调试控制台内,不需要保存或者甚至实际上创建一个Lua模块,就可以执行Lua代码。
故障排除
注意,红色的脚本错误消息是可点击的,且会提供详细信息。
无法执行extensions/Scribunto/includes/Engines/LuaStandalone/binaries
设置与此扩展捆绑的Lua二进制文件的执行权限:[2]
chmoda+x/path/to/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/$YOUR_OS/lua
如果强制执行SELinux,请将type设置为httpd_sys_script_exec_t:[2]
chcon-thttpd_sys_script_exec_t/path/to/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/yourOS/lua
Lua错误:内部错误:解释器以状态1退出。
使用LuaStandalone引擎时(这是默认情况),如果独立Lua解释器无法执行或遭遇各种运行时错误,可能会产生带有"Lua错误:内部错误:解释器以状态1退出。"消息的错误。
欲获取更多信息,需要将$wgScribuntoEngineConf['luastandalone']['errorFile']赋值为一个文件路径。
解释器的错误输出会记录到指定文件,这对追踪问题会有所帮助。
调试日志中的信息包含调试信息,内容可能十分庞大。
你可以忽略任何以"TX"或"RX"开头的行。
如果你在使用IIS/Windows安装Scribunto,这个问题似乎可以靠注释掉$wiki/extensions/Scribunto/includes/engines/LuaStandalone/LuaStandaloneInterpreter.php中的第132行解决。
换句话说,就是把$cmd = '"' . $cmd . '"';改成// $cmd = '"' . $cmd . '"';。
Lua错误:内部错误:解释器以状态2退出。
使用LuaStandalone引擎时(这是默认情况),状态2表明内存分配错误,可能原因是设置没有分配足够内存给PHP或Lua,或两者皆有。
将$wgScribuntoEngineConf['luastandalone']['errorFile']赋值为一个文件路径并检查此处输出有利于诊断内存分配错误。
增大PHP内存分配要在PHP配置里加一行memory_limit = 200M。
200MB这么大的分配往往足矣(自MediaWiki 1.24起),不过也可以按需加大。
设置Scribunto的内存分配要在LocalSettings.php里加上这么一行:
$wgScribuntoEngineConf['luastandalone']['memoryLimit'] = 209715200; # 字节数
最后,取决于服务器设置,在LocalSettings.php里再加如下一行可能有助于某些安装:
$wgMaxShellMemory = 204800; # 单位kB
注意所有三个内存限制的单位均不相同。
ARM架构上的Lua内部错误2
如果你在使用树莓派这样的ARM架构处理器,你会由于错误二进制格式的Lua解释器遇到Lua错误:内部错误:解释器以状态2退出。错误。
检查你以下这个路径中的Lua解释器:
/path/to/webdir/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_32_generic
用以下命令检查解释器:
file lua
结果应该看起来像:
lua: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0
安装的默认Lua解释器会显示:
lua: ELF 32-bit LSB pie executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.9,
注意看"Intel 80386"这一块,肯定不对。
在/usr/bin里检查你系统上安装的是哪个版本的Lua。 如果安装的是lua5.1,你可以把这个解释器复制到你的lua5_1_5_linux_32_generic目录,或者在你的LocalSettings.php里写上:
$wgScribuntoEngineConf['luastandalone']['luaPath'] = '/usr/bin/lua5.1';
当前不要把wgScribuntoEngineConf设置成/usr/bin/lua5.3,这会导致"内部错误1"。
Lua错误:内部错误:解释器以状态24退出。
使用LuaStandalone引擎时(这是默认情况),状态24表明CPU超时错误,尽管这种错误会改为产生"脚本运行超时。"消息。 在Phabricator 提交一个任务并参与确定为何XCPU信号未被捕获会很有用。
Lua错误:内部错误:解释器以状态126退出。
使用LuaStandalone引擎时(这是默认情况),如果独立Lua解释器无法执行,可能会产生带有"Lua错误:内部错误:解释器以状态126退出。"消息的错误。
这一般是由于以下两个原因之一:
- Lua可执行文件的权限不包括"执行"。 请按#安装一节所述设置权限。
- 服务器不允许从可执行文件安装位置执行文件,例如文件系统挂载了
'noexec'旗标。 这通常发生于共享的托管服务器。 处理方法包括将$wgScribuntoEngineConf['luastandalone']['luaPath']指向一个可执行路径中安装的Lua 5.1二进制文件,或让共享托管方调整阻止文件执行的设置。 - 在基于ARM的处理器上,你可能需要安装适用ARM的Lua 5.1(若在Debian或Ubuntu上,运行
sudo apt install lua5.1即可)并将$wgScribuntoEngineConf['luastandalone']['luaPath'] = '/usr/bin/lua5.1';加入LocalSettings.php文件。
错误条件如:类型MWException的致命异常
检查MediaWiki、PHP或服务器的日志以收集异常的更多细节,或暂时将$wgShowExceptionDetails 设置为true。
版本'GLIBC_2.11'未找到
如果你得到了例如"版本'GLIBC_2.11'未找到"的错误,那么意味着你系统上的标准C库版本太旧,无法供Scribunto提供的二进制文件使用。 你应该升级你的C库,或使用由你安装的C库编译出来的Lua 5.1版本。 欲升级你的C库,你的最佳选择通常是遵循发行版的包升级指引(或,若可以的话,升级至一个新发布的发行版)。
如果你不能或不想升级你的C库,从Scributo主分支(或从gerrit:77905)复制Lua二进制文件也该足矣。 分发的二进制文件最近用了一个更旧版本的glibc重新编译了一遍,所以现在的最低版本是2.3而不是2.11了。
Scribunto文件中的Lua错误
这里的错误包括:
- attempt to index field 'text' (a nil value)(尝试访问'text'字段,其值为nil)
- 位于mw.html.lua的253行的Lua错误:提供了无效类:
如果你在尝试使用从WMF wiki导入的模块时遇到此类错误,则很可能你的Scribunto版本已过期。
如有可能,请升级,对于高级用户,你可能需要找到需要的新提交,然后将其优选到你的本地安装中。
preg_replace_callback():编译失败:\P或\p后的未知属性名,于第7个字符
preg_replace_callback():编译失败:\P或\p后的未知属性名,于第7个字符
- 这通常表明使用了不兼容版本的PCRE,你需要升级到>= 8.10。
- @todo:链接至如何升级的指引
Lua错误
如果你从维基百科复制模板,然后在Scribunto调用(例如,使用了{{#invoke:}}的模板)的位置收到大量红色"Lua错误:x"的消息,这可能意味着你没有导入所需的所有内容。
确保在zh:Special:Export导出时勾选"包括模板"。
从另一个wiki导入页面时,导入数据中的模板或模块也可能覆盖具有相同标题的现有模板或模块,这可能会破坏依赖于覆盖版本的现有页面、模板和模块。
空白屏幕
确保你的扩展版本可以适用于你的MediaWiki版本。
许可协议
该扩展包含使用GNU通用公共许可证v2.0或更高版本(GPL-2.0+)的代码以及使用MIT许可证(MIT)的代码。
设计文档
Extension:Scribunto/Parser interface designTim Starling在2014年linux.conf.au的演讲,讨论了部署Scribunto和Lua的动机、实现困难和成果。 - Extension:Scribunto/Victor's API proposal
- Extension:Scribunto/Documentation specification
- Extension:Scribunto/Tim's draft roadmap
其他页面
- Extension:Scribunto/Deployment priorities
- Extension:Scribunto/Brainstorming
- Lua scripting - 描述维基媒体站点部署计划的维基媒体活动页面。
- 扩展:Scribunto/Lua参考手册 - Lua语言的参考,以及维基媒体站点支持的标准库和常见Scribunto模块。
- Extension:Scribunto/Lua 5.2 changes - Lua 5.2中可能导致用5.1编写的代码意外运行的已知更改列表。
- Extension:Scribunto/Example modules
- Extension:Scribunto/Example extension - 扩展Scribunto库的示例扩展代码。
- Extension:Scribunto/We use Lua
参见
- 一般
- Lua Wikibase client - Scribunto扩展的功能。
- Commons:Lua - 在Wikimedia Commons上可能有使用Lua模块的具体说明,包括安装的额外Lua扩展(例如,用于国际化的本地支持以及解析或播放媒体)。 一些通用模块可以在其他wiki中以各种语言重新使用(除了针对具有专用名称的方针、命名空间或项目/维护页面的特定调整)。 如果可能,应该在Wikimedia Commons上测试和国际化可以在wiki中广泛重新使用的模块。
- w:Help:Lua - 维基百科可能有使用Lua模块的具体说明,包括安装的附加Lua扩展(包括用于集成维基数据和维基共享资源内容、生成复杂的信息框和导航框,或根据适用方针促进wiki内容的一般管理/维护)。 其他一些本地化的维基百科版本(或其他项目,如维基词典、维基共享资源或维基新闻)也可能有自己的需求和Lua模块。
- d:Help:Lua - 可能会有关于在维基数据上使用Lua模块的具体说明,包括安装的额外Lua扩展(例如,用于国际化的本地支持和数据库查询)
- 扩展
- Capiunto - 提供基本的信息框功能以用于Scribunto扩展。
- Semantic Scribunto - 为Scribunto扩展使用Semantic MediaWiki(语义 MediaWiki) 提供原生支持
- VariablesLua - 为Variables扩展提供Scribunto Lua接口
- Wikibase Client(Wikibase客户端) - 提供Wikibase (维基数据项目的一部分)
注释
- ↑
i.e. 如果服务器"php.ini"文件中的
disable_functions数组中列出了proc_open,Scribunto将不起作用。 如果是,你可能收到像proc_open(): open_basedir restriction in effect. File(/dev/null) is not within the allowed path(s):这样的错误消息 如果你正在使用Plesk且拥有了足够的权限,你也许能够在PHP设置中为你的域名或者子域名设置open_basedir。 尝试将{WEBSPACEROOT}{/}{:}{TMP}{/}更换成{WEBSPACEROOT}{/}{:}{TMP}{/}{:}/dev/null{:}/bin/bash。 - ↑ 2.0 2.1 2.2 引擎文件夹名在2022年由小写改成了首字母大写。
外部链接
- Pages using deprecated NoteTA template
- Stable extensions/zh
- Parser extensions/zh
- ArticleViewHeader extensions/zh
- CodeEditorGetPageLanguage extensions/zh
- CodeMirrorGetMode extensions/zh
- ContentHandlerDefaultModelFor extensions/zh
- EditFilterMergedContent extensions/zh
- EditPage::showReadOnlyForm:initial extensions/zh
- EditPage::showStandardInputs:options extensions/zh
- EditPageBeforeEditButtons extensions/zh
- ParserClearState extensions/zh
- ParserFirstCallInit extensions/zh
- ParserLimitReportFormat extensions/zh
- ParserLimitReportPrepare extensions/zh
- ProduntoPlatformVersions extensions/zh
- SoftwareInfo extensions/zh
- GPL licensed extensions/zh
- MIT licensed extensions/zh
- Extensions in Wikimedia version control/zh
- All extensions/zh
- Extensions bundled with MediaWiki 1.34/zh
- Extensions used on Wikimedia/zh
- Extensions included in BlueSpice/zh
- Extensions included in Canasta/zh
- Extensions available as Debian packages/zh
- Extensions included in Fandom/zh
- Extensions included in Miraheze/zh
- Extensions included in MyWikis/zh
- Extensions included in ProWiki/zh
- Extensions included in ShoutWiki/zh
- Extensions included in Telepedia/zh
- Extensions included in Weird Gloop/zh
- Extensions included in wiki.gg/zh
- Scribunto extensions/zh
- ContentHandler extensions/zh