php之amphp是如何工作的

rubylouvre 阅读:28 2024-02-27 23:08:18 评论:0

他们网站上的文档 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 对此提供了 native 支持.

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 中运行。

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


标签:PHP
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号