php多进程处理
php多进程处理
往往我们会碰到一个情况,需要写一个脚本,这个脚本要处理的数据量极大,单进程处理脚本非常慢,那么这个时候就会想到使用多进程或者多线程的方式了。
我习惯使用多进程的方式,php中使用多进程的时候需要使用pcntl,pcntl的使用可以看这个PHP的pcntl多进程
但是这里有一个问题,一个主进程把任务分成n个部分,然后把任务分配给多个子进程,但是任务可能是有返回值的,所有的子进程处理完返回值以后需要把返回值返回给主进程。
这个就涉及到了进程间通信了。进程间通信可以使用的方法当然很多了,比如用redis,用数据库,用文件等。
php中最简单的要算shmop相关函数了。
- shmop_open
- shmop_read
- shmop_write
- shmop_size
- shmop_delete
那怎么让一个类很容易有多进程处理的能力呢?可以使用php的trait,创建一个PcntlTrait,所有需要有多进程处理功能的类就use 这个trait就行。
PcntlTrait代码如下:
<?php namespace App\Console\Commands;
trait PcntlTrait
{
private $workers = 1;
public function worker($count)
{
$this->workers = $count;
}
public function pcntl_call($all, \Closure $callback)
{
$perNum = ceil(count($all) / $this->workers);
$pids = [];
for($i = 0; $i < $this->workers; $i++){
$pids[$i] = pcntl_fork();
switch ($pids[$i]) {
case -1:
echo "fork error : {$i} \r\n";
exit;
case 0:
$data = [];
try {
$data = $callback(array_slice($all, $i * $perNum, $perNum));
} catch(\Exception $e) {
echo ($e->getMessage());
}
$shm_key = ftok(__FILE__, 't') . getmypid();
$data = json_encode($data);
$shm_id = shmop_open($shm_key, "c", 0777, strlen($data) + 10);
shmop_write($shm_id, $data, 0);
shmop_close($shm_id);
exit;
default:
break;
}
}
// only master process will go into here
$ret = [];
foreach ($pids as $i => $pid) {
if($pid) {
pcntl_waitpid($pid, $status);
$shm_key = ftok(__FILE__, 't') . $pid;
$shm_id = shmop_open($shm_key, "w", 0, 0);
$data = trim(shmop_read($shm_id, 0, shmop_size($shm_id)));
$data = json_decode($data, true);
$ret = array_merge($ret, $data);
@shmop_close($shm_id);
@shmop_delete($shm_id);
}
}
return $ret;
}
}
它有两个参数,第一个参数为传入数组,第二个参数为数组处理函数。
它的具体使用通过下面这个测试用例可以看出:
<?php
use App\Console\Commands\PcntlTrait;
class PcntlImp
{
use PcntlTrait;
}
class TestPcntlTrait extends \TestCase
{
public function setup()
{
$this->createApplication();
}
public function testPcntlCall()
{
$arr = [1,2,3,4,5,6,7,8,9,10];
$imp = new \PcntlImp();
$imp->worker(2);
$data = $imp->pcntl_call($arr, function($info){
if (empty($info)){
return [];
}
$ret = [];
foreach ($info as $item) {
$ret[] = $item * $item;
}
return $ret;
});
$this->assertEquals(10, count($data));
$this->assertEquals(25, $data[4]);
}
}
非常方便~~
php多进程处理的更多相关文章
- Python中的多进程与多线程(一)
一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...
- 取代SharedPreferences的多进程解决方案
Android的SharedPreferences用来存储一些键值对, 但是却不支持跨进程使用. 跨进程来用的话, 当然是放在数据库更可靠啦, 本文主要是给作者的新库PreferencesProvid ...
- python 多进程使用总结
python中的多进程主要使用到 multiprocessing 这个库.这个库在使用 multiprocessing.Manager().Queue时会出问题,建议大家升级到高版本python,如2 ...
- Nginx深入详解之多进程网络模型
一.进程模型 Nginx之所以为广大码农喜爱,除了其高性能外,还有其优雅的系统架构.与Memcached的经典多线程模型相比,Nginx是经典的多进程模型.Nginx启动后以daemon ...
- Python的多线程(threading)与多进程(multiprocessing )
进程:程序的一次执行(程序载入内存,系统分配资源运行).每个进程有自己的内存空间,数据栈等,进程之间可以进行通讯,但是不能共享信息. 线程:所有的线程运行在同一个进程中,共享相同的运行环境.每个独立的 ...
- 进击的Python【第十章】:Python的socket高级应用(多进程,协程与异步)
Python的socket高级应用(多进程,协程与异步)
- PHP的pcntl多进程
PHP使用PCNTL系列的函数也能做到多进程处理一个事务.比如我需要从数据库中获取80w条的数据,再做一系列后续的处理,这个时候,用单进程?你可以等到明年今天了...所以应该使用pcntl函数了. 假 ...
- 初探PHP多进程
h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...
- gdb进程调试,多进程调试
1.单进程的调试 常规的通过gdb cmd这种方式开启调试,特别说明的是通过attach的方法附加到一个指定的进程上去进行调试,这种方法适合于调试一个已经运行的进程,具体用法: gdb -p [pi ...
- python高级之多进程
python高级之多进程 本节内容 多进程概念 Process类 进程间通讯 进程同步 进程池 1.多进程概念 multiprocessing is a package that supports s ...
随机推荐
- centos 后台执行C#控制台程序
1. nohup nohup 无疑是我们首先想到的办法.顾名思义,nohup 的用途就是让提交的命令忽略 hangup 信号.让我们先来看一下 nohup 的帮助信息: NOHUP() User Co ...
- await之后的线程问题
之前看了园子里的一篇文章「async & await的前世今生」,收益颇多.而其中有句话被博主特意用红色标注,所以留意多看了几眼,「await 之后不会开启新的线程(await 从来不会开启新 ...
- net与树莓派的情缘(一)
想做个NAS 由于手中经济有限又不想花太多钱,所以决定买个树莓派自己搭建. 板子:树莓派2代 elem14的 内存卡:闪迪 class10 16g 网线一根,电源线一个 系统:树莓派官方 Raspb ...
- mongodb(副本集)
副本集是mongo下的一种集群配置方式: 1.通过oplog的方式将主节点数据同步到副本节点,oplog不记录查询语句(因为不改变数据): 2.mongo的副本集可以有一个主节点,多个副本节点,主节点 ...
- DeviceOne接受了DevStore的专访
DevStore隶属深圳尺子科技有限公司,DevStore所有内容(资讯.数据.工具|服务.资源文章.问答……)都贯穿整个项目的生命周期,无论你是设计人员.开发人员.推广人员还是运营人员都可在此找到你 ...
- C#最良心脚本语言C#Light/Evil,Xamarin\WP8\Unity热更新最良心方案,再次进化.
C#Light的定位是嵌入式脚本语言,一段C#Light脚本是一个函数 C#Evil定位为书写项目的脚本语言,多脚本文件合作,可以完全用脚本承载项目. C#Light/Evil 使用完全C#一致性语法 ...
- C#Light Everywhere
C#语法嵌入式脚本,0.1Beta版本咯,可用于各种环境,欢迎测试. 可以解决各种热更新问题 比如Unity在AOT环境下,比如各种不能采用动态加载DLL的场合. 如果遇到bug,请给我留言,我会从速 ...
- multiOTP配置安装
https://code.google.com/p/google-authenticator/ 是google提供的OTP解决方案. http://www.multiotp.net/ 是一个开源otp ...
- 正式开始jQuery源码的学习
查了一些资料,2.0.3版本的jq源码分析的资料比较多,就以这个版本研究学习了. 今天正式开始.
- WebApi系列~dynamic让你的省了很多临时类
回到目录 dynamic这个动态类型早在.net3.5时就已经出现了,当时是伴随的Linq一起让我们认识的,但在使用时总觉得有点别扭,因为它是internal的,所以不能跨程序集使用,这对于分层开发的 ...