trc / phpexecjs
从 PHP 运行 JavaScript 代码
Requires
- symfony/process: ~2.3|~3.0|^4.0|^5.0
Requires (Dev)
- phpunit/phpunit: ^8.3
This package is not auto-updated.
Last update: 2024-09-25 04:30:21 UTC
README
PhpExecJS 允许您从 PHP 运行 JavaScript 代码。
简例
print_r($phpexecjs->evalJs("'red yellow blue'.split(' ')"));
将打印
Array
(
[0] => red
[1] => yellow
[2] => blue
)
安装
composer require nacmartin/phpexecjs
示例程序
用法
<?php require __DIR__ . '/../vendor/autoload.php'; use Nacmartin\PhpExecJs\PhpExecJs; $phpexecjs = new PhpExecJs(); print_r($phpexecjs->evalJs("'red yellow blue'.split(' ')"));
将打印
Array
(
[0] => red
[1] => yellow
[2] => blue
)
使用上下文
您可以设置一个上下文,例如库和其他内容,您希望在使用 eval'd 代码时使用。例如,ReactBundle 使用它来在服务器端渲染 React。
例如,我们可以使用此功能编译 CoffeeScript
$phpexecjs->createContextFromFile("https://coffeescript.node.org.cn/extras/coffee-script.js"); print_r($phpexecjs->call("CoffeeScript.compile", ["square = (x) -> x * x", ['bare' => true]])); That will print: var square; square = function(x) { return x * x; };
您可以将此示例扩展以进行类似使用此函数作为上下文等操作
$square = $phpexecjs->call("CoffeeScript.compile", ["square = (x) -> x * x", ['bare' => true]]); $phpexecjs->createContext($square); print_r($phpexecjs->evalJs('square(3)'));
这将打印 9
。
例如,这可以用于使用 CoffeeScript 或在 JavaScript 模板语言中编译模板。
它是如何工作的
当您运行 evalJs
时,代码将被插入一个小包装器中,用于运行 JavaScript 的 eval()
并检查状态以处理错误。
如果您设置了一个上下文,代码将被插入到 JavaScript 中对 eval()
的调用之前,如果您安装了 V8Js 扩展,它将预编译它。
支持的运行时
默认情况下,PhPExecjs 将自动检测最佳可用运行时。目前支持的运行时包括
- V8Js (PHP 扩展)
- node.js
建议安装 V8Js,但您可能希望在产品中安装它,同时在开发过程中仍然能够使用 PhpExecJs 以子进程的方式调用 node,这样您就不需要安装扩展。
添加外部运行时
如果您有一个外部运行器(例如 Spidermonkey),并且您想使用它,只需将其传递给构造函数即可
$myRuntime = new ExternalRuntime('My runtime name', 'my_command'); $phpExecJs = new PhpExecJs($myRuntime);
使用运行时进行贡献
我们希望支持更多的运行时(例如 Duktape)。如果您想为运行时做出贡献,这很简单。您只需实现 src/Runtimes/RuntimeInterface
。检查 src/Runtimes
目录以获取示例。
为什么我不能使用像 setTimeout
这样的函数?
PhpExecJs 为 JavaScript 运行时提供了一个通用接口,因此它只能运行对解释器不可知的代码。因此,一些功能被禁用。值得注意的是,计时器功能被禁用,因为并非所有运行时都保证完整的 JavaScript 事件循环。如果您想使用这些功能之一,请直接使用 node.js 而不是这个高级库
global
、module
、exports
、require
、console
、setTimeout
、setInterval
、clearTimeout
、clearInterval
、setImmediate
、clearImmediate
致谢
这个库受到了 ExecJs 的启发,这是一个 Ruby 库。
用于管理进程和临时文件代码已从 KNP Labs 的 Snappy 库中改编。