amphp 是如何工作的

How does amphp work

他们网站上的文档 http://amphp.org/faq 我不是很清楚。事情让我感到困惑。它打算 运行 作为服务器吗??或 运行 作为 CLI?或 运行 在 Web 容器(apache、nginx fpm)中? php 本质上是同步的,如果没有某种扩展(如 pthread )的支持,它怎么可能是异步的。

编辑 ---

amp 的潜在应用:后台线程?在一个简单的用例中,比如用户提交订单,php 可能会花时间讨论处理订单。所以我们想在不让用户等待的情况下使用线程(比如 Java servlet 一直这样做)。我们知道它可以用 cron-job 或 additional-ajax 来完成,但它很难看,而且我们有很多这种异步要求

Amp使用非阻塞I/O实现并发。 PHP 通过 http://php.net/stream_set_blocking.

对其提供原生支持

Amp 可以在 CLI 应用程序中使用,但也可以在其他 SAPI 中使用,例如在 Apache 中对某些服务发出多个并发请求。如果您想将异步嵌入到其他同步应用程序中,您可以使用 Amp\Promise\wait

$uris = ["https://google.com/", "https://github.com/"];
$client = new Amp\Artax\BasicClient;

$promises = array_map(function ($uri) use ($client) {
    return $client->request($uri);
}, $uris)

$responses = Amp\Promise\wait(Amp\Promise\all($promises));

Amp 通常是单线程的。如果你使用像 amphp/parallel 这样的东西,它只是多线程的。 amphp/parallel 可以使用pthreads 或多个进程并行执行多个阻塞事物。

如果您有更具体的问题,只需编辑您的问题和评论,我会尽力回答。


关于后台处理,是的,amphp/parallel 可以做到这一点,但原始进程必须为此保持活动状态。您可能会在 amphp/process 中实现一个 disown 机制,以在父进程死亡时也保持进程 运行,那么它也可以在 Apache 或 PHP-FPM 中工作。

但我通常会为此类任务推荐一个队列,因为队列可以重新启动失败的任务(以防工作程序崩溃)并且如果有很多后台作业则不会导致极高的负载,因为并非所有这些都会立即启动,而是在工作人员有空时在后台处理。