【发布时间】:2014-04-19 08:33:46
【问题描述】:
场景:
我想在 PHP 上运行非阻塞/异步代码,用户发出请求并接收202 Accepted 代码并继续执行其他任务——但 PHP 继续执行。我见过一些使用ob_flush 和Connection: 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