是否可以在PHP V8js上创建非阻塞的javascript代码?

时间:2014-03-14 07:13:42

标签: php node.js asynchronous v8 nonblocking

情景:

我想在PHP上运行非阻塞/异步代码,用户发出请求并收到202 Accepted代码并继续执行其他任务 - 但PHP继续执行。我使用ob_flushConnection: close看到了一些解决方案/黑客攻击,但似乎较新的浏览器不允许这样做,只显示最终结果。此外,它似乎不是一个合适的解决方案。

我知道PHP在设计上是一种单线程语言,我不想说多线程PHP ,但我相信有解决方案可以完成这项工作。我目前正在考虑使用AMQP或STOMP(RabittMQ)来将长时间运行的执行力抵消给其他工作人员,虽然我觉得PHP仍然会等待工作人员的响应(我还在研究它,而且似乎有一种单向的方法消息;原谅我此时没有适当的知识)

然而......这是我的实际问题:

我很想尝试PHP V8js,但在我进入很多配置步骤之前,我有三个问题:

以非阻塞方式编写的Javascript函数是否会产生非阻塞的PHP脚本?

例如:

<?php

$v8 = new V8Js();

/* basic.js */
$JS = <<< EOT

setInterval(function(){print("Hello")},3000); 

EOT;

try {
  var_dump($v8->executeString($JS, 'basic.js'));
  echo "World";
  exit();
} catch (V8JsException $e) {
  var_dump($e);
}

?>

在上面的代码中,&#34;你好&#34;设置为3秒后显示:PHP是否等待JS代码的完整执行,然后回应&#34; World&#34;?或者它回应&#34;世界&#34;并终止脚本 - 但让JS运行?另一个例子可能是JS代码上的异步ajax调用:PHP会等待完整操作然后继续,还是会继续,终止脚本(给用户)但是继续在后台处理JS代码(当然,没有能够向用户输出任何内容)?

第二个问题:在同一台机器上安装PHP + V8 lib和Nodej是否可以,没有冲突?

第三:如果PHP + V8js解决方案阻塞/同步,你会推荐什么作为PHP的非阻塞/异步解决方案(如果有的话)?

修改 我已经用V8js进行了快速测试,我可以说上面的代码根本不起作用。您收到ReferenceError: setInterval is not defined错误。似乎有必要注册扩展(http://ca3.php.net/manual/en/v8js.registerextension.php),但由于可用的文档很差,而且Nodejs在包方面要先进得多,我不确定我会继续尝试使用V8js。

仍然,我正在寻找PHP的良好异步解决方案。我将就这个问题发布一个单独的,有针对性的问题。

2 个答案:

答案 0 :(得分:1)

不知道V8js,但是如果你想做Async prog。在PHP中,看看ReactPHP

添加为答案,因为我无法发表评论。

答案 1 :(得分:1)

首先,ReferenceError是因为setInterval确实是window.setInterval,这是浏览器DOM中的一种方法。

V8 拥有或暴露DOM。没有DOM,没有window个对象,因此没有window.setInterval()方法。

对于V8J,V8Js扩展等待脚本执行完成或超时。最新版本的扩展已被破坏(现在可能已修复),当脚本超出其限制时,现在会抛出V8JsTimeLimitException。还有V8JsMemoryLimitException

Pritam提到ReactPHP。那个,或Ratchet,也是你尝试做的好选择。

我也发现这个discussion很有意思。这是在上述超时发布之前。还是读得不错。