mirror of
https://github.com/phpv8/v8js.git
synced 2024-12-22 15:11:53 +00:00
provide inspector usage example in README
This commit is contained in:
parent
f4ae91b3ba
commit
d6c1569b0a
84
README.md
84
README.md
@ -160,6 +160,13 @@ class V8Js
|
|||||||
public function setAverageObjectSize($average_object_size)
|
public function setAverageObjectSize($average_object_size)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Install a V8 inspector (client) on this V8Js object.
|
||||||
|
* This is an experimental feature.
|
||||||
|
* @return V8Inspector
|
||||||
|
*/
|
||||||
|
public function connectInspector();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns uncaught pending exception or null if there is no pending exception.
|
* Returns uncaught pending exception or null if there is no pending exception.
|
||||||
* @return V8JsScriptException|null
|
* @return V8JsScriptException|null
|
||||||
@ -206,6 +213,30 @@ class V8Js
|
|||||||
{}
|
{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final class V8Inspector
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Send a message to V8's inspector backend.
|
||||||
|
* @param string $message
|
||||||
|
*/
|
||||||
|
public function send($message)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a callback handler for responses from V8's inspector backend.
|
||||||
|
* @param callable $handler
|
||||||
|
*/
|
||||||
|
public function setResponseHandler($handler)
|
||||||
|
{}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a callback handler for notifications from V8's inspector backend.
|
||||||
|
* @param callable $handler
|
||||||
|
*/
|
||||||
|
public function setNotificationHandler($handler)
|
||||||
|
{}
|
||||||
|
}
|
||||||
|
|
||||||
final class V8JsScriptException extends Exception
|
final class V8JsScriptException extends Exception
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
@ -401,3 +432,56 @@ objects obeying the above rules and re-thrown in JavaScript context. If they
|
|||||||
are not caught by JavaScript code the execution stops and a
|
are not caught by JavaScript code the execution stops and a
|
||||||
`V8JsScriptException` is thrown, which has the original PHP exception accessible
|
`V8JsScriptException` is thrown, which has the original PHP exception accessible
|
||||||
via `getPrevious` method.
|
via `getPrevious` method.
|
||||||
|
|
||||||
|
Inspector Client
|
||||||
|
================
|
||||||
|
|
||||||
|
Keep in mind that this is an experimental feature of php-v8js.
|
||||||
|
|
||||||
|
The inspector client API, i.e. calling `V8Js::connectInspector()`, provides
|
||||||
|
low-level access to [V8's Inspector Protocol](https://v8.dev/docs/inspector).
|
||||||
|
This may be used to access V8's profiler.
|
||||||
|
|
||||||
|
Theoretically this also provides access to V8's debugger. Yet keep in mind
|
||||||
|
that setting a breakpoint in the JavaScript code will also block PHP code
|
||||||
|
execution (due to php-v8js' call model).
|
||||||
|
|
||||||
|
See [Chrome DevTool Protocol API documentation](https://chromedevtools.github.io/devtools-protocol/1-3/Profiler/)
|
||||||
|
for details on how to use the profiler.
|
||||||
|
|
||||||
|
Usage example to collect call count information on function level:
|
||||||
|
|
||||||
|
```php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$v8 = new V8Js;
|
||||||
|
$i = $v8->connectInspector();
|
||||||
|
|
||||||
|
$i->setResponseHandler(function($res) {
|
||||||
|
$res = \json_decode($res);
|
||||||
|
|
||||||
|
if ($res->id === 3) {
|
||||||
|
foreach($res->result->result[0]->functions as $info) {
|
||||||
|
printf("function '%s' was called %d times.\n", $info->functionName ?: '<root scope>', $info->ranges[0]->count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
$i->send(json_encode([ 'id' => 1, 'method' => "Profiler.enable" ]));
|
||||||
|
$i->send(json_encode([ 'id' => 2, 'method' => "Profiler.startPreciseCoverage", 'params' => [ 'callCount' => true ] ]));
|
||||||
|
|
||||||
|
$fn = $v8->executeString('(function foo() { const blarg = 42; })', 'multi-call-lambda');
|
||||||
|
|
||||||
|
$fn();
|
||||||
|
$fn();
|
||||||
|
$fn();
|
||||||
|
|
||||||
|
$i->send(json_encode([ 'id' => 3, 'method' => "Profiler.takePreciseCoverage" ]));
|
||||||
|
```
|
||||||
|
|
||||||
|
yields
|
||||||
|
|
||||||
|
```
|
||||||
|
function '<root scope>' was called 1 times.
|
||||||
|
function 'foo' was called 3 times.
|
||||||
|
```
|
||||||
|
Loading…
Reference in New Issue
Block a user