V8 Javascript Engine for PHP — This PHP extension embeds the Google V8 Javascript Engine
fork from : https://github.com/phpv8/v8js.git

Simon Best 91b1a2fbd2 Added a test for CommonJS modules. %!s(int64=12) %!d(string=hai) anos
js 30e1d22863 Initial import %!s(int64=13) %!d(string=hai) anos
samples 7e90439cdf Make sure all tests and samples use the new exception class name V8JsScriptException. %!s(int64=12) %!d(string=hai) anos
tests 91b1a2fbd2 Added a test for CommonJS modules. %!s(int64=12) %!d(string=hai) anos
CREDITS 80a56e551a Added my name to the credits :-) %!s(int64=12) %!d(string=hai) anos
Makefile.frag 30e1d22863 Initial import %!s(int64=13) %!d(string=hai) anos
README.md 9c9500dbc5 More updates to GitHub README. %!s(int64=12) %!d(string=hai) anos
TODO 30e1d22863 Initial import %!s(int64=13) %!d(string=hai) anos
config.m4 8ae7606338 Refactor CommonJS modules functionality to store state in the extension globals and context as appropriate. %!s(int64=12) %!d(string=hai) anos
package.xml 8fcbf0a9e7 Fixed build in 5.4+ %!s(int64=13) %!d(string=hai) anos
php_v8js.h 7593cbcc59 Update copyright information %!s(int64=13) %!d(string=hai) anos
php_v8js_macros.h 8d8c671aa0 V8 isolates need to be passed into all variable accessor and conversion functions. %!s(int64=12) %!d(string=hai) anos
test.php 7e90439cdf Make sure all tests and samples use the new exception class name V8JsScriptException. %!s(int64=12) %!d(string=hai) anos
v8js.cc ef8620f0c2 Fix to start timer thread when there is a memory limit but no time limit. %!s(int64=12) %!d(string=hai) anos
v8js_commonjs.cc 8ae7606338 Refactor CommonJS modules functionality to store state in the extension globals and context as appropriate. %!s(int64=12) %!d(string=hai) anos
v8js_convert.cc 8d8c671aa0 V8 isolates need to be passed into all variable accessor and conversion functions. %!s(int64=12) %!d(string=hai) anos
v8js_methods.cc 8ae7606338 Refactor CommonJS modules functionality to store state in the extension globals and context as appropriate. %!s(int64=12) %!d(string=hai) anos
v8js_variables.cc 8d8c671aa0 V8 isolates need to be passed into all variable accessor and conversion functions. %!s(int64=12) %!d(string=hai) anos

README.md

V8Js

V8Js is a PHP extension for Google's V8 Javascript engine.

The extension allows you to execute Javascript code in a secure sandbox from PHP. The executed code can be restricted using a time limit and/or memory limit. This provides the possibility to execute untrusted code with confidence.

Minimum requirements

  • V8 Javascript Engine library (libv8) version 3.2.4 or above http://code.google.com/p/v8/ (trunk)

    V8 is Google's open source Javascript engine. V8 is written in C++ and is used in Google Chrome, the open source browser from Google. V8 implements ECMAScript as specified in ECMA-262, 5th edition. This extension makes use of V8 isolates to ensure separation between multiple V8Js instances, hence the need for 3.2.4 or above.

  • PHP 5.3.3+

This embedded implementation of the V8 engine uses thread locking so it should work with ZTS enabled. However, this has not been tested yet.

PHP API

class V8Js
{
    /* Constants */

    const string V8_VERSION;
    const int FLAG_NONE;
    const int FLAG_FORCE_ARRAY;

    /* Methods */

    // Initializes and starts V8 engine and Returns new V8Js object with it's own V8 context.
    public __construct ( [ string $object_name = "PHP" [, array $variables = NULL [, array $extensions = NULL [, bool $report_uncaught_exceptions = TRUE ] ] ] )

    // Provide a function or method to be used to load required modules. This can be any valid PHP callable.
    // The loader function will receive the normalised module path and should return Javascript code to be executed.
    public setModuleLoader ( callable $loader )

    // Compiles and executes script in object's context with optional identifier string.
    // A time limit (milliseconds) and/or memory limit (bytes) can be provided to restrict execution. These options will throw a V8JsTimeLimitException or V8JsMemoryLimitException.
    public mixed V8Js::executeString( string $script [, string $identifier [, int $flags = V8Js::FLAG_NONE [, int $time_limit = 0 [, int $memory_limit = 0]]]])

    // Returns uncaught pending exception or null if there is no pending exception.
    public V8JsScriptException V8Js::getPendingException( )

    /** Static methods **/

    // Registers persistent context independent global Javascript extension.
    // NOTE! These extensions exist until PHP is shutdown and they need to be registered before V8 is initialized. 
    // For best performance V8 is initialized only once per process thus this call has to be done before any V8Js objects are created!
    public static bool V8Js::registerExtension( string $extension_name, string $code [, array $dependenciess [, bool $auto_enable = FALSE ] ] )

    // Returns extensions successfully registered with V8Js::registerExtension().
    public static array V8Js::getExtensions( )
}

final class V8JsScriptException extends Exception
{
    /* Properties */
    protected string JsFileName = NULL;
    protected int JsLineNumber = NULL;
    protected string JsSourceLine = NULL;
    protected string JsTrace = NULL;

    /* Methods */
    final public string getJsFileName( )
    final public int getJsLineNumber( )
    final public string getJsSourceLine( )
    final public string getJsTrace( )
}

final class V8JsTimeLimitException extends Exception
{
}

final class V8JsMemoryLimitException extends Exception
{
}

Javascript API

// Print a string.
print(string);

// Dump the contents of a variable.
var_dump(value);

// Terminate Javascript execution immediately.
exit();

// CommonJS Module support to require external code.
// This makes use of the PHP module loader provided via V8Js::setModuleLoader (see PHP API above).
require("path/to/module");