今天被问到一个问题,php如何开启多进程才比较稳定。

php开启多进程执行一个操作有哪些方法:

首先想到的是使用pcntl的fork

具体可以参考之前的文章:PHP的pcntl多进程

其次想到的方法是使用linux的crontab

有个php程序,内部实现大概是

<?php
$startTime = time();
while(1) {
if (time() - $startTime > 600) {
break;
} // ... Do SomeThing
}

意思是这个程序会持续10分钟,10分钟循环做这同一个操作

然后开启一个cron:

*/2 * * * * /usr/local/bin/php XXX.php

这个cron每两分钟跑一个前面的php程序

这样就能保证同时会有5个程序在Do SomeThing。

还有想到的方法是使用php的exec函数

首先当然有个Do SomeThing的php程序:a.php

启动一个php父进程,在程序中使用exec:

<?php

for($i = 0; $i < $count; $i++){
exec("nohup /user/local/bin/php a.php >> /dev/null &");
}

这个方法当然也有很多变种,比如

1 第二个循环启动的程序使用shell来做

2 第一个Do SomeThing的函数使用上个方法的持续进程

有啥区别呢

第一种使用pcntl的方法,感觉起来子进程“是受控制”的

意思就是父进程可以获取处理子进程的输出信息,也可以等待子进程处理完以后做后续操作。

而后面两种子进程是“不受控制”的。

PS:要想让后面两种子进程受控制,或许可以使用一些第三方存储,比如日志,比如redis等。

 

第二种和第三种方法,cron+php的方法,有种好处是不会出现长时间贮存内存中的进程。

由于php的底层实现很有可能导致内存泄漏,所以一个“写的不够好”的PHP程序如果长时间一直运行,很有可能导致内存使用出现问题。所以不应该让一个php程序“长时间运行”。

第二三种方法,一个程序运行完成之后就会立即结束进程,即使有内存泄漏也不会导致任何问题。所以比较让人放心点。

PS:再说一下,方法一也不是必须要起常驻内存的进程,但往往我们做的时候会让父进程常驻着。

 

还有啥呢,往往多进程的话要注意并发,可能会用到锁之类的。因为一般要保证Do SomeThing的原子性才行。

方法二我们在线上大量使用了,并上redis的pop队列操作,使用情况真是嘎嘎好用。

2013/11/21工作随笔-PHP开启多进程的更多相关文章

  1. 2013/11/22工作随笔-缓存是放在Model层还是放在Controller层

    web网站的典型代码框架就是MVC架构,Model层负责数据获取,Controller层负责逻辑控制,View层则负责展示. 一般数据获取是去mysql中获取数据 但是这里有个问题,我们不会每次请求都 ...

  2. 打印出1,11,21,31,41。。。。。。的shell脚本

    打印出1,11,21,31,41......的shell脚本 方法一:#!/bin/bash ;i<;i=i+));do echo $i #cat -n /etc/services | sed ...

  3. 第二章IPC——IPC与开启多进程

    问题 一.IPC ①.什么是IPC  ②.为什么要有IPC 二.多进程 ①.如何开启多进程  ②.系统如何创建多进程 三.多进程引发的问题 问:私有进程(利用":+进程名")能否共 ...

  4. win10 Internet Explorer 11 停止工作处理

    win10 Internet Explorer 11 停止工作处理:

  5. Android IPC机制(一)开启多进程

    1. 为何要开启多进程 为何开启android应用要开启多进程,主要有以下几点: 单进程所分配的内存不够,需要更多的内存.在早期android系统只为一个单进程的应用分配了16M的可用内存,随着手机的 ...

  6. China Intelligent Office Summit(2018.11.21)

    时间:2018.11.21地点:中关村软件园国际会议中心

  7. 第33次Scrum会议(11/21)【欢迎来怼】

    一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/21 11:35~11:57,总计22min.地点:东北 ...

  8. 2017/11/21 Leetcode 日记

    2017/11/21 Leetcode 日记 496. Next Greater Element I You are given two arrays (without duplicates) num ...

  9. 第十五章、python中的进程操作-开启多进程

    目录 第十五章.python中的进程操作-开启多进程 一.multprocess模块 二.multprocess.process模块 三.Process()对象方法介绍 四.Process()对象属性 ...

随机推荐

  1. JS 清除字符串数组中,重复元素

    <script language="JavaScript"> <!-- var arrData=new Array(); for(var i=0; i<10 ...

  2. (转)create table #temptable 临时表 和 declare @bianliang table ()表变量

    在开发过程中,经常会遇到使用表变量和本地临时表的情况.下面是对二者的一个介绍: 1. 为什么要使用表变量 表变量是从2000开始引入的,微软认为与本地临时表相比,表变量具有如下优点:  a.与其他变量 ...

  3. OpenCV仿射变换+投射变换+单应性矩阵

    本来想用单应性求解小规模运动的物体的位移,但是后来发现即使是很微小的位移也会带来超级大的误差甚至错误求解,看起来这个方法各种行不通,还是要匹配知道深度了以后才能从三维仿射变换来入手了,纠结~ esti ...

  4. Scala 深入浅出实战经典 第43讲:主要介绍类型变量bound

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-64讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  5. javascript一种新的对象创建方式-Object.create()

    1.Object.create() 是什么? Object.create(proto [, propertiesObject ]) 是E5中提出的一种新的对象创建方式,第一个参数是要继承的原型,如果不 ...

  6. python查找算法的实现-二分法

    1.算法:(设查找的数组期间为array[low, high]) (1)确定该期间的中间位置K(2)将查找的值T与array[k]比较.若相等,查找成功返回此位置:否则确定新的查找区域,继续二分查找. ...

  7. React直出实现与原理

    前一篇文章我们介绍了虚拟DOM的实现与原理,这篇文章我们来讲讲React的直出. 比起MVVM,React比较容易实现直出,那么React的直出是如何实现,有什么值得我们学习的呢? 为什么MVVM不能 ...

  8. c# 小数取整

    向上取整 math.ceiling() = math.ceiling( math.ceiling( 向下取整 math.) = math. math. C#取整函数实例应用详解 C#取整函数的相关使用 ...

  9. javascript - encodeURI和encodeURIComponent的区别

    这两个函数功能上面比较接近,但是有一些区别. encodeURI:不会进行编码的字符有82个 :!,#,$,&,',(,),*,+,,,-,.,/,:,;,=,?,@,_,~,0-9,a-z, ...

  10. Porter/Duff,图片加遮罩setColorFilter

    同步发表于http://avenwu.net/2015/02/03/porterduff Fork on github https://github.com/avenwu/support 经常会遇到给 ...