Jump to content

Extension:Scribunto

本頁使用了標題或全文手工轉換
From mediawiki.org
This page is a translated version of the page Extension:Scribunto and the translation is 97% complete.
Outdated translations are marked like this.
本扩展是在可执行程序上运行。 为了让该扩展能正常運作,你在你的主机上必须是擁有运行可执行文件的权限。


MediaWiki扩展手册
Scribunto
发行状态: 稳定版
实现 解析器扩展
描述 提供在 MediaWiki 页面裏嵌入脚本语言的一個框架
作者
  • Victor Vasiliev
  • Tim Starling
和​其他人
最新版本 持续更新
兼容性政策 快照跟随MediaWiki发布。 master分支不向后兼容。
PHP 5.5+
Module (ns:828), Talk_Module (ns:829)
  • $wgScribuntoDefaultEngine
  • $wgScribuntoSlowFunctionThreshold
  • $wgScribuntoLuaExtraTitleAttributes
  • $wgScribuntoGatherFunctionStats
  • $wgScribuntoUseCodeMirror
  • $wgScribuntoUseGeSHi
  • $wgScribuntoUseCodeEditor
  • $wgScribuntoEngineConf
许可协议 GPL-2.0-or-later AND MIT
下載
前往translatewiki.net翻譯Scribunto扩展
Vagrant角色 scribunto
問題 开启的任务 · 报告错误

Scribunto拉丁语: “他们应當写下”)扩展提供框架,並可將腳本語言嵌入MediaWiki頁面。

Although theoretically any scripting language can be supported, since its release in 2012 Scribunto has only supported one language, Lua.

Scribunto Lua脚本在一个名为Module的命名空间中。 模块使用 #invoke 解析器函数 在普通的wiki页面上运行,每个模块都有一个函数的集合,可以使用wiki文本语法调用,例如:

{{#invoke: Module_name | function_name | arg1 | arg2 | arg3 ... }}

安装

此扩展随附于MediaWiki 1.34及更新版本,因此您無需下載它。 但其余的配置的指示仍须依循執行。
  • 下载文件,并解压Scribunto文件夹到extensions/目录中。
    开发者和代码贡献人员应改从Git安装此扩展,输入:
    cd extensions/
    git clone https://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应该在以下情况下为您提供开箱即用的服务:

  1. 您的web服务器在上述平台之一上运行。
  2. PHP的proc_open函数不受限制。[1]
  3. 在PHP中,proc_terminateshell_exec 並未停用。
  4. 你的Web服务器已被配置为允许MediaWiki树中的二进制文件的执行。
注意 注意: 可能需要设置执行权限,例如,在Linux使用:
chmod 755 /path/to/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua
如果你在你的服务器上使用处于“Enforcing”模式的SELinux,你可能需要为此二进制文件设置合适的安全上下文(context)。 例如,在RHEL/CentOS 7中使用:
chcon -t httpd_sys_script_exec_t /path/to/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/lua5_1_5_linux_64_generic/lua
注:检查你的扩展的版本,看一下引擎文件夹的名称是首字母大写还是全小写。[2]

额外的二进制文件

如果您的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 is a PHP extension created by the Scribunto developers in 2018. It allows PHP to directly run Lua code, which makes the Lua code run faster than it does with Scribunto's standalone binary. 详细信息和安装指引,参见$1。

To have Scribunto use LuaSandbox after you install it, just change the $wgScribuntoDefaultEngine setting in LocalSettings.php to the following:

$wgScribuntoDefaultEngine = 'luasandbox';

(This setting is actually optional, because without it Scribunto will automatically detect whether LuaSandbox is installed and use or not use it accordingly, but adding this setting removes the need for Scribunto to check every time.)

配置

有以下几个用于配置的变量:

$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版本相关:

参考手册也比较有用:

Lua 环境

在Lua中,所有全局变量和函数的集合称为环境(environment)。

每个{{#invoke:}}调用会在一个单独的环境中运行。 一个{{#invoke:}}中定义的变量不会在另一个中有效。 这种限制是必要的,以维持维基文本解析器实现的灵活性。

脚本运行的环境与标准Lua中的环境不太一样。 这种差别会在扩展:Scribunto/Lua参考手册中指出。

调试控制台

调试控制台的使用例子
参阅: Extension:Scribunto/Debug console

编辑Lua模块时,编辑框底部会有一个“调试控制台”。 在这个调试控制台内,不需要保存或者甚至实际上创建一个Lua模块,就可以执行Lua代码。

故障排除

使用可点击的“Script error”链接排除故障。

注意,红色的脚本错误消息是可点击的,且会提供详细信息。

无法执行extensions/Scribunto/includes/Engines/LuaStandalone/binaries

设置与此扩展捆绑的Lua二进制文件的执行权限:[2]

chmod a+x /path/to/extensions/Scribunto/includes/Engines/LuaStandalone/binaries/$YOUR_OS/lua

如果强制执行SELinux,请将type设置为httpd_sys_script_exec_t[2]

chcon -t httpd_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)的代码。

设计文档

其他页面

參見

一般
  • 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扩展(例如,用于国际化的本地支持和数据库查询)
扩展

外部链接

注释

  1. 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. 2.0 2.1 2.2 引擎文件夹名在2022年由小写改成了首字母大写