ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Π²Ρ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π»ΠΈ PHP Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ LuaSandbox, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΡΠ°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ LuaSandbox Π΄Π»Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΌ ΠΊΠΎΠ΄Π° Lua.
ΠΡΠΈΠΌΠ΅Ρ #1 ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΠΊΠΎΠ΄ Lua
<?php
$sandbox = new LuaSandbox;
$sandbox->setMemoryLimit( 50 * 1024 * 1024 );
$sandbox->setCPULimit( 10 );
// ΠΠ°ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΠΉΡΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΡΡΠ΅Π΄Π΅ Lua
function frobnosticate( $v ) {
return [ $v + 42 ];
}
$sandbox->registerLibrary( 'php', [
'frobnosticate' => 'frobnosticate',
'output' => function ( $string ) {
echo "$string\n";
},
'error' => function () {
throw new LuaSandboxRuntimeError( "Π§ΡΠΎ-ΡΠΎ ΠΏΠΎΡΠ»ΠΎ Π½Π΅ ΡΠ°ΠΊ" );
}
] );
// ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠΎΠ΄ Lua, Π²ΠΊΠ»ΡΡΠ°Ρ callback-ΡΡΠ½ΠΊΡΠΈΠΈ PHP ΠΈ Lua.
$luaCode = <<<EOF
php.output( "ΠΡΠΈΠ²Π΅Ρ, ΠΌΠΈΡ" );
return "ΠΡΠΈΠ²Π΅Ρ", function ( v )
return php.frobnosticate( v + 200 )
end
EOF;
list( $hi, $frob ) = $sandbox->loadString( $luaCode )->call();
assert( $frob->call( 4000 ) === [ 4242 ] );
// ΠΡΠ·ΡΠ²Π°Π΅ΠΌΡΠ΅ PHP ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ LuaSandboxRuntimeError ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΠΏΠΎΠΉΠΌΠ°Π½Ρ Π²Π½ΡΡΡΠΈ Lua
list( $ok, $message ) = $sandbox->loadString( 'return pcall( php.error )' )->call();
assert( !$ok );
assert( $message === 'Π§ΡΠΎ-ΡΠΎ ΠΏΠΎΡΠ»ΠΎ Π½Π΅ ΡΠ°ΠΊ' );
?>