【问题标题】:Is it possible to create non-blocking javascript code on PHP V8js?是否可以在 PHP V8js 上创建非阻塞 javascript 代码?
【发布时间】:2014-04-19 08:33:46
【问题描述】:

场景:

我想在 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);
}

?>

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

第二个问题:PHP+V8的lib和Nodejs安装在同一台机器上可以不冲突吗?

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

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

不过,我仍在为 PHP 寻找好的异步解决方案。我将针对此问题发布一个单独的定向问题。

【问题讨论】:

    标签: php node.js asynchronous v8 nonblocking


    【解决方案1】:

    首先,ReferenceError 是因为setInterval 实际上是window.setInterval,是浏览器DOM 中的一个方法。

    V8 没有拥有也不公开 DOM。没有 DOM,没有 window 对象,因此没有 window.setInterval() 方法。

    对于 V8Js,V8Js 扩展会一直等到脚本执行完成或超时。最新版本的扩展程序已损坏(现在可能已修复),现在当脚本超出其限制时会抛出 V8JsTimeLimitException。还有一个V8JsMemoryLimitException

    Pritam 提到了ReactPHP。那个,或者Ratchet,对于你想做的事情也是不错的选择。

    我还发现这个discussion 很有趣。这是在上述超时释放之前。还是不错的读物。

    【讨论】:

      【解决方案2】:

      不了解 V8js,但如果你想做 Async prog。在 PHP 中,看看 ReactPHP

      添加为答案,因为我还不能评论。

      【讨论】:

      • 听起来很有趣。我会检查的。在结束这个问题之前,我会等待一段时间。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      • 2014-12-24
      相关资源
      最近更新 更多