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
,但原始进程必须为此保持活力。如果父进程死了,你可能会实现一种disown
机制amphp/process
来保持进程也运行,那么它也可以在 Apache 或 PHP-FPM 中运行。
但是我通常会为此类任务推荐一个队列,因为队列可以重新启动失败的任务(以防工作人员崩溃),并且如果有很多后台作业,也不会导致极高的负载,因为不是所有的将立即启动,而是在工作人员有时间时在后台处理。