如何在 Lua 扩展中处理无限循环?

我使用 [Lua 扩展](http://php.net/manual/en/book.lua.php)与 PHP 7.1。不幸的是,我没有找到真正的文档。只有 [这个](http://www.laruence.com/lua/)。我已经知道可以使用 lua 沙箱来限制访问 lua 函数。

但我如何限制 lua 持续时间?我想在 x 秒后或 x 计算周期后或 x 行代码后中止 lua 解析。

如果我解析类似这样的内容(无限循环):

<?php
try {
    $lua = new Lua();
    $lua->eval("
        while 1 do
            -- something
        end
    ");
} catch (Exception $e) {
    $e->getMessage();
}?>

php 脚本将永远运行。

点赞
用户2238176
用户2238176

无法像您想的那样覆盖 while 循环,但可以编写自己的函数(比如 While),使用 count 方法。像这样:

local limit = 500

function While( condition, dofunc )
    local count = 0
    repeat
        count = count + 1
        if count > limit then
            print( '中止循环:达到限制(' .. limit .. ')' )
            break
        end
        dofunc()
        var = condition()
    until not var
end

下面是一些使用示例。

local i = 1
local tab = { 'a', 's', 'd', 'f' }
While( function() return tab[i] end, function()
    print( tab[i] )
    i = i + 1
end )
-- 输出 'a'、's'、'd'、'f'

While( function() return true end, function() print( 'test' ) end )
-- 输出 'test' 500 次,然后退出
2017-01-01 20:25:54
用户15539524
用户15539524

我知道这是一个旧问题,但我没有看到正确的答案在这里。

正确的答案是使用 setCPULimit Lua 沙盒函数 -

public LuaSandbox::setCPULimit(float|bool $limit): void

https://www.php.net/manual/en/luasandbox.setcpulimit.php

2022-10-12 14:40:51