2013/11/21工作随笔-PHP开启多进程
今天被问到一个问题,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开启多进程的更多相关文章
- 2013/11/22工作随笔-缓存是放在Model层还是放在Controller层
web网站的典型代码框架就是MVC架构,Model层负责数据获取,Controller层负责逻辑控制,View层则负责展示. 一般数据获取是去mysql中获取数据 但是这里有个问题,我们不会每次请求都 ...
- 打印出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 ...
- 第二章IPC——IPC与开启多进程
问题 一.IPC ①.什么是IPC ②.为什么要有IPC 二.多进程 ①.如何开启多进程 ②.系统如何创建多进程 三.多进程引发的问题 问:私有进程(利用":+进程名")能否共 ...
- win10 Internet Explorer 11 停止工作处理
win10 Internet Explorer 11 停止工作处理:
- Android IPC机制(一)开启多进程
1. 为何要开启多进程 为何开启android应用要开启多进程,主要有以下几点: 单进程所分配的内存不够,需要更多的内存.在早期android系统只为一个单进程的应用分配了16M的可用内存,随着手机的 ...
- China Intelligent Office Summit(2018.11.21)
时间:2018.11.21地点:中关村软件园国际会议中心
- 第33次Scrum会议(11/21)【欢迎来怼】
一.小组信息 队名:欢迎来怼小组成员队长:田继平成员:李圆圆,葛美义,王伟东,姜珊,邵朔,阚博文 小组照片 二.开会信息 时间:2017/11/21 11:35~11:57,总计22min.地点:东北 ...
- 2017/11/21 Leetcode 日记
2017/11/21 Leetcode 日记 496. Next Greater Element I You are given two arrays (without duplicates) num ...
- 第十五章、python中的进程操作-开启多进程
目录 第十五章.python中的进程操作-开启多进程 一.multprocess模块 二.multprocess.process模块 三.Process()对象方法介绍 四.Process()对象属性 ...
随机推荐
- Java的自动装箱和拆箱的简单讲解
装箱就是把基础类型封装成一个类.比如把int封装成Integer,这时你就不能把他当成一个数了,而是一个类了,对他的操作就需要用它的方法了. 拆箱就是把类转换成基础类型.比如你算个加法什么的是不能用 ...
- js遍历jsonTree
var json = [{tcName:"11", children:[{tcName:"22", children:[{tcName:"33&quo ...
- Lotus开发性能优化
之前也总结过一篇关于性能的文章,地址在http://www.cnblogs.com/carysun/archive/2008/08/09/BasicPerformance.html,今天又看到DW上又 ...
- Android系列--DOM、SAX、Pull解析XML
您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...
- MySQL的慢查询分析
慢查询分析日最初是用来捕获比较“慢”的查询,在mysql5.1 + 版本中,慢查询的功能被加强,可以通过设置long_query_time为0来捕获所有的查询,而且查询的响应时间已经可以做到微妙级别. ...
- 新建一个Activity
如果只是新建一个class,还得自己添加XML,好不麻烦: eclipse里可以直接new other Andriod activity,ADT还是很强发滴.哈哈.
- 【Vegas原创】RHEL6多界面切换方法
CTRL+ALT+Fn(n=1-6) F1,是图形化界面 F2-F6,是字符型界面. 每个界面可以干不同的事情,很牛叉.
- java.lang.OutOfMemoryError: PermGen space PermGen space & java.lang.OutOfMemoryError: Java heap space Heap siz
java.lang.OutOfMemoryError: PermGen space PermGen space 由-XX:PermSize -XX:MaxPermSize 引起 java.lang. ...
- 一个类有两个方法,其中一个是同步的,另一个是非同步的; 现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法?
一个类有两个方法,其中一个是同步的,另一个是非同步的:现在又两个线程A和B,请问:当线程A访问此类的同步方法时,线程B是否能访问此类的非同步方法? 答案:可以 验证 package com.my.te ...
- Turn off swi-prolog protocol output of ANSI terminal control sequences
To save a record of program execution in prolog, we use the special predicates: protocol and noproto ...