PHP并发多进程处理利器Gearman使用介绍,利器gearman
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其中的一个,相当与一个并发的分发任务处理的例子
<?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
<?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 ? 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这个工具.

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds





En tant que langage de programmation hautement concurrent, le mécanisme de coroutine intégré et les opérations multithread de Golang permettent un multitâche léger. Cependant, dans un scénario de traitement multi-processus, la communication et la mémoire partagée entre différents processus sont devenues des enjeux clés dans le développement de programmes. Cet article présentera la méthode d'application permettant de réaliser une mémoire partagée entre plusieurs processus dans Golang. 1. Comment implémenter plusieurs processus dans Golang Dans Golang, le traitement simultané multi-processus peut être implémenté de différentes manières, notamment fork, os.Process,

Tout le monde sait que Node.js est monothread, mais ils ne savent pas qu'il fournit également un module multi-thread pour accélérer le traitement de certaines tâches spéciales. Cet article vous amènera à comprendre le multi-threading de Node. js, en espérant en savoir plus. Tout le monde aide !

Golang est un multi-processus, et son modèle de thread est le modèle MPG. Dans l'ensemble, les processus Go et les threads du noyau correspondent à plusieurs à plusieurs, donc tout d'abord, ils doivent être multi-thread. Golang a un modèle dit M ratio N. N go routines peuvent être créées sous M threads. De manière générale, N est beaucoup plus grand que M. Il s'agit essentiellement d'un modèle multithread. Cependant, la planification des coroutines est déterminée par Go. runtime. Il est souligné que les développeurs doivent utiliser des canaux pour la synchronisation entre les coroutines.

Verrous et synchronisation dans la programmation simultanée Dans la programmation simultanée, plusieurs processus ou threads s'exécutent simultanément, ce qui peut entraîner des conflits de ressources et des problèmes d'incohérence. Pour résoudre ces problèmes, des verrous et des mécanismes de synchronisation sont nécessaires pour coordonner l'accès aux ressources partagées. Concept de verrouillage Un verrou est un mécanisme qui permet à un seul thread ou processus d'accéder à une ressource partagée à la fois. Lorsqu'un thread ou un processus acquiert un verrou, les autres threads ou processus ne peuvent pas accéder à la ressource jusqu'à ce que le verrou soit libéré. Types de verrous Il existe plusieurs types de verrous en python : Verrou Mutex (Mutex) : garantit qu'un seul thread ou processus peut accéder aux ressources à la fois. Variable de condition : permet à un thread ou à un processus d'attendre une certaine condition, puis d'acquérir le verrou. Verrouillage en lecture-écriture : permet à plusieurs threads de lire des ressources en même temps, mais n'autorise qu'un seul thread à écrire des ressources

Compétences en développement PHP : Comment utiliser les tâches planifiées Gearman pour traiter la base de données MySQL Introduction : Gearman est un système de planification de tâches distribué open source qui peut être utilisé pour exécuter des tâches en parallèle et améliorer les capacités de traitement du système. Dans le développement PHP, nous utilisons souvent Gearman pour gérer certaines tâches chronophages ou asynchrones. Cet article explique comment utiliser Gearman pour implémenter des tâches planifiées afin de gérer les opérations de base de données MySQL. 1. Installez Gearman sur le système Linux, vous pouvez

Comment implémenter le multi-processus dans node ? Comment déployer un projet de nœud ? L'article suivant vous aidera à maîtriser les connaissances pertinentes du modèle multi-processus Node.js et du déploiement de projets. J'espère qu'il vous sera utile !

Cet article vous apporte des connaissances pertinentes sur PHP. Il présente principalement les problèmes liés au développement multi-processus PHP pour vous, avec des réponses. J'espère que ce sera le cas. être utile à tout le monde.

Conseils de programmation simultanée Golang : analyse approfondie du modèle multi-processus Dans le domaine de la programmation simultanée, Golang, en tant que langage de programmation puissant, est favorisé par les développeurs pour sa syntaxe concise et sa prise en charge intégrée de la concurrence. Dans Golang, la programmation simultanée peut être facilement mise en œuvre à l'aide de goroutine et de canal, améliorant ainsi les performances et l'efficacité du programme. Cependant, dans certains scénarios spécifiques, l’utilisation du modèle multi-processus constitue également une méthode de programmation simultanée efficace. Cet article fournira une analyse approfondie de la façon d'utiliser Golang
