Skip to content
This repository was archived by the owner on Mar 29, 2024. It is now read-only.
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 26 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ PHP extension for V8 JavaScript engine

This extension is for PHP 7 only.

**This extension is still under heavy development and it public API may change without any warning. Use at your own risk.**
**This extension is still under heavy development and its public API may change without any warning. Use at your own risk.**


## About
Expand All @@ -18,24 +18,24 @@ provides an accurate native V8 C++ API implementation available from PHP.
- provides up-to-date JavaScript engine with recent [ECMA](http://kangax.github.io/compat-table) features supported;
- accurate native V8 C++ API implementation available from PHP;
- solid experience between native V8 C++ API and V8 API in PHP;
- no magic; no assumption;
- does what it asked to do;
- hides complexity with isolates and contexts scope management under the hood;
- no magic; no assumptions;
- does what it is asked to do;
- hides complexity by isolation and contexts scope management under the hood;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are v8::Isolate and v8::Context concepts in v8 engine. Isolate could be accessed by only one thread at a time and multiple Contexts could reside in it at the same time. To perform some operations in v8 in C++ you need to enter Isolate, enter Context, do you job and then leave it (it's not pretty accurate explanation, but for simplicity let it be this way at this time).

So I tried to say that this entering/leaving is hidden under the hood and done automatically when needed transparently to the user.

- provides a both-way interaction with PHP and V8 objects, arrays and functions;
- execution time and memory limits;
- multiple isolates and contexts at the same time;
- it works;

With this extension almost all that native V8 C++ API provides can be used. It provides a way to pass php scalars,
objects and function to V8 runtime and specify interaction with passed values (objects and functions only, as scalars
become js scalars too). While specific functionality will be done in PHP userland rather then in C/C++ this extension,
With this extension almost everything that the native V8 C++ API provides can be used. It provides a way to pass PHP scalars,
objects and functions to the V8 runtime and specify interactions with passed values (objects and functions only, as scalars
become js scalars too). While specific functionality will be done in PHP userland rather than in this C/C++ extension,
it lets you get into V8 hacking faster, reduces time costs and gives you a more maintainable solution. And it doesn't
make any assumptions for you, so you stay in control, it does exactly what you ask it to do.

With php-v8 you can even implement nodejs in PHP. Not sure whether anyone should/will do this anyway, but it's doable.

*NOTE: Most, if not all, methods are named like in V8 API - starting from capital letter. This PSR violation done
intentionally with the purpose to provide more solid experience between native V8 C++ API and V8 PHP API.*
*NOTE: Most, if not all, methods are named like in the V8 API - starting from capital letter. This PSR violation is done
intentionally with the purpose to provide a more solid experience between the native V8 C++ API and the V8 PHP API.*


## Demo
Expand All @@ -55,47 +55,46 @@ $result = $script->Run($context);
echo $result->ToString($context)->Value(), PHP_EOL;
```

which will output `Hello, World!`. See how it's shorter and readable from [that C++ version]([v8-hello-world])?
which will output `Hello, World!`. See how it's shorter and more readable than [that C++ version]([v8-hello-world])?
And it also doesn't limit you from V8 API utilizing to implement more amazing stuff.


## Installation

### Requirements

#### V8
You will need some fresh v8 Google JavaScript enging version installed. At this time extension tested on 5.4.420.
You will need a recent v8 Google JavaScript engine version installed. At this time the extension is tested on 5.4.420.

- For Ubuntu there are [pinepain/libv8-5.4](https://launchpad.net/~pinepain/+archive/ubuntu/libv8-5.4) PPA.
To install fresh libv8 do:
- For Ubuntu there is the [pinepain/libv8-5.4](https://launchpad.net/~pinepain/+archive/ubuntu/libv8-5.4) PPA.
To install libv8:

```
$ sudo add-apt-repository -y ppa:pinepain/libv8-5.4
$ sudo apt-get update -y
$ sudo apt-get install -y libv8-5.4-dev
```
- For OS X there are [v8.rb](https://github.com/pinepain/php-v8/blob/master/scripts/homebrew/v8.rb) homebrew formula.
To install fresh libv8 do:
- For OS X there is the [v8.rb](https://github.com/pinepain/php-v8/blob/master/scripts/homebrew/v8.rb) homebrew formula.
To install libv8:

```
$ brew install https://raw.githubusercontent.com/pinepain/php-v8/master/scripts/homebrew/v8.rb
```

#### PHP 7

- For Ubuntu there are [ondrej/php](https://launchpad.net/~ondrej/+archive/ubuntu/php) PPA by [Ondřej Surý](https://deb.sury.org).
- For Ubuntu there is the [ondrej/php](https://launchpad.net/~ondrej/+archive/ubuntu/php) PPA by [Ondřej Surý](https://deb.sury.org).

To install fresh `php7.0` do:
To install `php7.0`:

```
$ sudo add-apt-repository -y ppa:ondrej/php
$ sudo apt-get update -y
$ sudo apt-get install -y php7.0
```
- For OS X there are [homebrew/homebrew-php](https://github.com/Homebrew/homebrew-php) tap with php70, php71 and large
- For OS X there is the [homebrew/homebrew-php](https://github.com/Homebrew/homebrew-php) tap with php70, php71 and a large
variety extensions for them.

To install fresh `php70` do:
To install `php70`:

```
$ brew tap homebrew/homebrew-php
Expand All @@ -105,18 +104,18 @@ You will need some fresh v8 Google JavaScript enging version installed. At this

### Installing php-v8 from packages

- For Ubuntu there are [pinepain/php-v8](https://launchpad.net/~pinepain/+archive/ubuntu/php-v8) PPA.
- For Ubuntu there is the [pinepain/php-v8](https://launchpad.net/~pinepain/+archive/ubuntu/php-v8) PPA.

To install fresh `php-v8`:
To install `php-v8`:

```
$ sudo add-apt-repository -y ppa:pinepain/php-v8
$ sudo apt-get update -y
$ sudo apt-get install -y php-v8
```
- For OS X there are [php70-v8.rb][php70-v8.rb] and [php71-v8.rb][php71-v8.rb] homebrew formulas.
- For OS X there are the [php70-v8.rb][php70-v8.rb] and [php71-v8.rb][php71-v8.rb] homebrew formulas.

To install fresh `php70-v8` do:
To install `php70-v8` do:

```
$ brew install https://raw.githubusercontent.com/pinepain/php-v8/master/scripts/homebrew/php70-v8.rb
Expand All @@ -139,10 +138,10 @@ $ sudo make install

## Developers note
- to be able to customize some tests make sure you have `variables_order = "EGPCS"` in your php.ini
- `export DEV_TESTS=1` allows to run tests that made for development reason (e.g. test some weird behavior or for debugging)
- To prevent asking test suite to send results to PHP QA team do `export NO_INTERACTION=1`
- `export DEV_TESTS=1` allows to run tests that are made for development reasons (e.g. test some weird behavior or for debugging)
- To prevent the test suite from asking you to send results to the PHP QA team do `export NO_INTERACTION=1`

- To track memory usage you may want to use `smem`, `pmem` and even `lsof` to see what shared object are loaded
- To track memory usage you may want to use `smem`, `pmem` or even `lsof` to see what shared object are loaded
and `free` to display free and used memory in the system.

## License
Expand Down