2016-12-31 45 views
0

我在PHP 7.1中使用了Lua Extension。不幸的是,我沒有找到真正的文檔。只有this。我已經知道我可以使用lua沙箱來限制對lua函數的訪問。如何在Lua Extension for PHP中處理無限循環?

但我如何限制lua持續時間?我想在x秒後或x計算週期或x行代碼後中止lua解析。

如果我分析是這樣的(無限循環):

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

php腳本將永遠運行下去。

+0

不會有確切的時間附加到它,但你可以在循環外創建一個變量,比如'count = 0'或什麼的,然後在每個循環中增加它。如果它超過了某個值,那麼就打破循環。你也可以考慮使用庫(如[this](https://github.com/APItools/sandbox.lua)),或者至少看看它是如何實現的 – DavisDude

+0

謝謝你的回答。 lua代碼將由用戶編寫腳本。我不能直接處理它。 php lua擴展不支持協程。但是您的sandbox.lua解決方案使用了協程。它也沒有工作。我想我必須看看擴展代碼本身。 – Giraffe

回答

0

不可能像您想要的那樣覆蓋while循環,但您可以創建自己的函數(例如,While),該函數使用函數並使用count方法。類似於

local limit = 500 

function While(condition, dofunc) 
    local count = 0 
    repeat 
     count = count + 1 
     if count > limit then 
      print('Aborting loop: limit (' .. limit .. ') reached.') 
      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) 
-- Prints 'a', 's', 'd', 'f' 

While(function() return true end, function() print('test') end) 
-- Prints 'test' 500 times, then quits 
+0

感謝您的回答。我不知道用戶會上傳和執行哪種lua代碼。所以,也許下面的代碼是可能的:「雖然(函數()返回true結束,功能()而真正打印('無盡循環')結束)」我不能解決它在lua沒有協程。我認爲它可以在php fork擴展或aperator php進程和服務器端超時的ajax調用下工作,但未經測試,感覺非常髒。 – Giraffe