目次
PHP并发多进程处理利器Gearman使用介绍,利器gearman
ホームページ php教程 php手册 PHP并发多进程处理利器Gearman使用介绍,利器gearman

PHP并发多进程处理利器Gearman使用介绍,利器gearman

Jun 13, 2016 am 08:39 AM
gearman PHPの同時実行性 マルチプログレス

PHP并发多进程处理利器Gearman使用介绍,利器gearman

工作中我们有时候会遇到比如需要同时发布数据到多个个服务器上,或者同时处理多个任务。可以使用PHP的curl_multi的方式并发处理请求,但是由于网络和数据以及各个服务器等等的一些情况导致这种并发处理的响应时间很慢,因为在并发请求的过程中还包括记录日志,处理数据等逻辑,等待处理结果并返回,所以也不能友好的满足后台操作的体验。

现在有另外一种方案,利Gearman来实现并发的需求。通过Client将请求发送到Gearman的Jobs,在每个Work中来再来进行curl_multi和数据处理和日志等一些操作,同时用supervisor 来监控Gearman以及Works的进程,这样可以实现一个并行的多进程和负载均衡的方案。

Gearman可以做什么:

异步处理:图片处理,订单处理,批量邮件/通知之类的
要求高CPU或内存的处理:大容量的数据处理,MapReduce运算,日志聚集,视频编码
分布式和并行的处理
定时处理:增量更新,数据复制
限制速率的FIFO处理
分布式的系统监控任务

Gearman工作原理:
使用Gearman的应用通常有三部分组成:一个Client、一个Worker、一个 任务服务器。 Client的作用是提出一个 Job 任务 交给 Job Server 任务服务器。Job Server 会去寻找一个 合适的 Worker 来完成这项任务。Worker 执行由 Client 发送过来的 Job,并且将结果通过 Job Server 返回给 Client。Gearman 提供了 Client 和 Worker 的 API,利用这些API 应用可以同 Gearman Job Server来进行通信。Gearman 内部 Client 和 Worker 之间的通信都是通过 TCP 连接来进行的。

Gearman可以将工作的负载分担到不同的机器中。

安装:

复制代码 代码如下:
rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/x86_64/epel-release-6-5.noarch.rpm
yum install -y gearmand

启动:
gearmand -d

安装PHP Gearman扩展
我都是用pcel来安装的,你也可以下载源码包来编译安装,但是记得要先安装libgearman和re2c,不然扩展编译安装会出错。

pecl install gearman #不成功并提示版本问题可以试试 pecl install gearman-1.0.3,默认好像是1.1.2
编译安装也很简单
复制代码 代码如下:
wget -c http://pecl.php.net/get/gearman-1.1.1.tgz
tar zxvf gearman-1.1.1.tgz
phpize
./configure
make && make install
echo "extension=gearman.so" >> /etc/php.ini

PHP接口函数
Gearman提供很多完善的扩展函数,包括GearmanClient,GearmanJob,GearmanTask,GearmanWorker,具体可以查看PHP官方手册.
这是官方提供的Example其中的一个,相当与一个并发的分发任务处理的例子

<&#63;php

$client = new GearmanClient();
$client->addServer();

// initialize the results of our 3 "query results" here
$userInfo = $friends = $posts = null;

// This sets up what gearman will callback to as tasks are returned to us.
// The $context helps us know which function is being returned so we can
// handle it correctly.
$client->setCompleteCallback(function(GearmanTask $task, $context) use (&$userInfo, &$friends, &$posts) {
switch ($context)
{
case 'lookup_user':
$userInfo = $task->data();
break;
case 'baconate':
$friends = $task->data();
break;
case 'get_latest_posts_by':
$posts = $task->data();
break;
}
});

// Here we queue up multiple tasks to be execute in *as much* parallelism as gearmand can give us
$client->addTask('lookup_user', 'joe@joe.com', 'lookup_user');
$client->addTask('baconate', 'joe@joe.com', 'baconate');
$client->addTask('get_latest_posts_by', 'joe@joe.com', 'get_latest_posts_by');

echo "Fetching...\n";
$start = microtime(true);
$client->runTasks();
$totaltime = number_format(microtime(true) - $start, 2);

echo "Got user info in: $totaltime seconds:\n";
var_dump($userInfo, $friends, $posts);
ログイン後にコピー

gearman_work.php

<&#63;php

$worker = new GearmanWorker();
$worker->addServer();

$worker->addFunction('lookup_user', function(GearmanJob $job) {
// normally you'd so some very safe type checking and query binding to a database here.
// ...and we're gonna fake that.
sleep(3);
return 'The user requested (' . $job->workload() . ') is 7 feet tall and awesome';
});

$worker->addFunction('baconate', function(GearmanJob $job) {
sleep(3);
return 'The user (' . $job->workload() . ') is 1 degree away from Kevin Bacon';
});

$worker->addFunction('get_latest_posts_by', function(GearmanJob $job) {
sleep(3);
return 'The user (' . $job->workload() . ') has no posts, sorry!';
});

while ($worker->work());
ログイン後にコピー

我在3个终端中都执行了gearman_work.php

ryan@ryan-lamp:~$ ps aux | grep gearman* | grep -v grep
gearman 1504 0.0 0.1 60536 1264 &#63; Ssl 11:06 0:00 /usr/sbin/gearmand --pid-file=/var/run/gearman/gearmand.pid --user=gearman --daemon --log-file=/var/log/gearman-job-server/gearman.log --listen=127.0.0.1
ryan 2992 0.0 0.8 43340 9036 pts/0 S+ 14:05 0:00 php /var/www/gearmand_work.php
ryan 3713 0.0 0.8 43340 9036 pts/1 S+ 14:05 0:00 php /var/www/gearmand_work.php
ryan 3715 0.0 0.8 43340 9036 pts/2 S+ 14:05 0:00 php /var/www/gearmand_work.php
ログイン後にコピー

来查看下执行gearman_work.php的结果shell

复制代码 代码如下:
Fetching...
Got user info in: 3.03 seconds:
string(59) "The user requested (joe@joe.com) is 7 feet tall and awesome"
string(56) "The user (joe@joe.com) is 1 degree away from Kevin Bacon"
string(43) "The user (joe@joe.com) has no posts, sorry!"

看到上面的3.03 seconds,说明client请求过去的任务被并行分发执行了。
在实际的生产环境中,为了监测gearmand和work的进程没有被意外退出,我们可以借助Supervisor这个工具.

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golang関数における複数プロセス間の共有メモリの適用方法 Golang関数における複数プロセス間の共有メモリの適用方法 May 17, 2023 pm 12:52 PM

同時実行性の高いプログラミング言語である Golang の組み込みコルーチン メカニズムとマルチスレッド操作により、軽量のマルチタスクが可能になります。ただし、マルチプロセス処理シナリオでは、異なるプロセス間の通信と共有メモリがプログラム開発の重要な問題になります。この記事では、Golangで複数プロセス間で共有メモリを実現する応用方法を紹介します。 1. Golang でマルチプロセスを実装する方法 Golang では、fork、os.Process、

Node.js のマルチプロセスとマルチスレッドについて話しましょう Node.js のマルチプロセスとマルチスレッドについて話しましょう Jul 25, 2022 pm 07:45 PM

Node.js がシングルスレッドであることは誰もが知っていますが、特別なタスクの処理を高速化するマルチスレッド モジュールも提供していることは知りません。この記事は、Node のマルチスレッドを理解するのに役立ちます。 js さん、もっと詳しく知りたいと思っています。みんな助けてください!

golangはマルチプロセスですか? golangはマルチプロセスですか? Jul 07, 2023 am 10:18 AM

Golang はマルチプロセスであり、そのスレッドモデルは MPG モデルですが、全体として Go プロセスとカーネルスレッドは多対多に対応するため、まずマルチスレッド化する必要があります。 Golang には、いわゆる M 比 N モデルがあります。N 個の go ルーチンは、M スレッドで作成できます。一般に、N は M よりもはるかに大きくなります。本質的にはマルチスレッド モデルです。ただし、コルーチンのスケジューリングは、開発者はコルーチン間の同期にチャネルを使用する必要があることが強調されています。

Python 同時プログラミングにおけるロックと同期: コードの安全性と信頼性の維持 Python 同時プログラミングにおけるロックと同期: コードの安全性と信頼性の維持 Feb 19, 2024 pm 02:30 PM

並行プログラミングにおけるロックと同期 並行プログラミングでは、複数のプロセスまたはスレッドが同時に実行されるため、リソースの競合や不整合の問題が発生する可能性があります。これらの問題を解決するには、共有リソースへのアクセスを調整するためのロックと同期メカニズムが必要です。ロックの概念 ロックは、一度に 1 つのスレッドまたはプロセスのみが共有リソースにアクセスできるようにするメカニズムです。 1 つのスレッドまたはプロセスがロックを取得すると、ロックが解放されるまで、他のスレッドまたはプロセスはリソースへのアクセスをブロックされます。ロックの種類 Python にはいくつかの種類のロックがあります。 ミューテックス ロック (Mutex): 一度に 1 つのスレッドまたはプロセスのみがリソースにアクセスできるようにします。条件変数: スレッドまたはプロセスが特定の条件を待ってからロックを取得できるようにします。読み取り/書き込みロック: 複数のスレッドが同時にリソースを読み取ることができますが、1 つのスレッドのみがリソースに書き込むことができます。

PHP 開発のヒント: Gearman スケジュールされたタスクを使用して MySQL データベースを処理する方法 PHP 開発のヒント: Gearman スケジュールされたタスクを使用して MySQL データベースを処理する方法 Jul 01, 2023 pm 05:30 PM

PHP 開発スキル: Gearman スケジュールされたタスクを使用して MySQL データベースを処理する方法 はじめに: Gearman は、タスクを並行して実行し、システムの処理能力を向上させるために使用できるオープンソースの分散タスク スケジューリング システムです。 PHP 開発では、時間のかかるタスクや非同期タスクを処理するために Gearman を使用することがよくあります。この記事では、Gearman を使用して、MySQL データベース操作を処理するスケジュールされたタスクを実装する方法を紹介します。 1. Linux システムに Gearman をインストールします。

ノードがマルチプロセスを実装する方法の詳細な説明?ノードプロジェクトをデプロイするにはどうすればよいですか? ノードがマルチプロセスを実装する方法の詳細な説明?ノードプロジェクトをデプロイするにはどうすればよいですか? Aug 03, 2022 pm 08:23 PM

ノードにマルチプロセスを実装するにはどうすればよいですか?ノードプロジェクトをデプロイするにはどうすればよいですか?次の記事は、Node.js マルチプロセス モデルとプロジェクトのデプロイメントに関する関連知識を習得するのに役立ちます。

PHPマルチプロセス開発面接に関するよくある質問のまとめ(回答付き) PHPマルチプロセス開発面接に関するよくある質問のまとめ(回答付き) Dec 21, 2022 pm 05:30 PM

この記事では、PHP に関する関連知識を提供します。主に PHP マルチプロセス開発に関連する問題を紹介します。ここでは、マルチプロセス開発の問題の概要と回答を示します。一緒に見てみましょう。みんなの役に立ちます。

Golang 同時プログラミング スキル: マルチプロセス モデルの詳細な分析 Golang 同時プログラミング スキル: マルチプロセス モデルの詳細な分析 Feb 29, 2024 am 10:36 AM

Golang 同時プログラミング スキル: マルチプロセス モデルの詳細な分析 同時プログラミングの分野では、Golang は強力なプログラミング言語として、その簡潔な構文と組み込みの同時実行サポートにより開発者に好まれています。 Golang では、ゴルーチンとチャネルを使用して同時プログラミングを簡単に実装でき、プログラムのパフォーマンスと効率が向上します。ただし、一部の特定のシナリオでは、マルチプロセス モデルの使用も効果的な同時プログラミング方法です。この記事では、Golang の使用方法を詳細に分析します。

See all articles