ホームページ > バックエンド開発 > PHPチュートリアル > 异步请求 - php多进程发HTTP请求,如何保证一秒内不超过5个请求

异步请求 - php多进程发HTTP请求,如何保证一秒内不超过5个请求

WBOY
リリース: 2016-06-06 20:30:15
オリジナル
1990 人が閲覧しました

最近需要使用一个外部接口,开始没有想到用curl_multi_init,就用了多进程,尝试了pcntl和swoole_process,效果都很好。但是外部接口有一个限制,一秒内不能超过5个请求,这种情况在多进程下要怎么控制呢?需要考虑curl会有较大延迟(接口的服务在国外)。考虑到一个进程请求完在延迟的过程中,别的请求不能等待,需要异步进行,保证最大效率。同时还要控制一秒内的请求次数。

第一感觉是,在父进程中管理一个容器,容量为5,每1秒清空一次,子进程开始发送请求的时候把自身pid加入到这个容器,加入前判断容器是否满5。但是这样有个问题,父进程每一秒清空容器的动作是个死循环,这样父进程貌似就不能回收子进程了。是否不应该放在父进程中解决这个问题,应该再多开一个进程?

还是我的思路不对,应该用别的方法解决?求教各位大神。

回复内容:

最近需要使用一个外部接口,开始没有想到用curl_multi_init,就用了多进程,尝试了pcntl和swoole_process,效果都很好。但是外部接口有一个限制,一秒内不能超过5个请求,这种情况在多进程下要怎么控制呢?需要考虑curl会有较大延迟(接口的服务在国外)。考虑到一个进程请求完在延迟的过程中,别的请求不能等待,需要异步进行,保证最大效率。同时还要控制一秒内的请求次数。

第一感觉是,在父进程中管理一个容器,容量为5,每1秒清空一次,子进程开始发送请求的时候把自身pid加入到这个容器,加入前判断容器是否满5。但是这样有个问题,父进程每一秒清空容器的动作是个死循环,这样父进程貌似就不能回收子进程了。是否不应该放在父进程中解决这个问题,应该再多开一个进程?

还是我的思路不对,应该用别的方法解决?求教各位大神。

建立一个发送队列,使用发送队列进行控制。否则PHP自身很难对自身进程数进行控制。pcntl 只能 fork 子进程进行处理,并可以控制所有子进程的状态。

每次只开5个进程就好

<code>ps aux | grep "xxx.php" | grep -v "grep" | wc -l
</code>
ログイン後にコピー

在父进程中添加一个计数器,每秒清零。在容器中存放子进程pid以及start_time,定时回收即可。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート