• UID25
  • 登录2016-05-02
  • 粉丝8
  • 关注2
  • 发帖80
  • 主页
  • 金币1443枚
社区居民
原创写手
billy 发布于2015-12-07 18:43
0/411

linux下php多线程的妙用

楼层直达
linux下php多线程的妙用

开始用php写后台服务一段时间了.也是在这样的驱动下,不断的学习php语法,体验这一原来一直以为神秘且敬而远之的神奇语言的魅力.最初看php多线程的资料是为了提高程序的处理能力,充分发挥linux多任务的优势.不曾想多线程没用成反到是带来了一系列的意外收获.让之后的许多问题迎刃而解,不敢独享特一一道来.
     

本文所讲的东西是源自php的pcntl_fork函数.因为这个函数依赖操作系统fork的实现,所以本文所讲的东西只适用于linux/unix.ok,那么先看看这个函数的用法吧. php手册上是这么说的:

 

<?php
$pid = pcntl_fork();
if ($pid == -1) {
         die('could not fork');
} else if ($pid) {
         // we are the parent
         pcntl_wait($status); //Protect against Zombie children
} else {
         // we are the child
}
?>

     

通过pcntl_fork创建一个子进程,如果返回值是-1的话,那么说明子进程创建失败.创建成功的进程id会返回给父进程,0返回给子进程.不好理解吧,费了很常时间明白以后,笔者习惯这样写:

 

 

<?php
$pid = pcntl_fork();
if($pid == -1){
         //创建失败咱就退出呗,没啥好说的
         die('could not fork');
}
else{
        if($pid){
                //从这里开始写的代码是父进程的,因为写的是系统程序,记得退出的时候给个返回值
                exit(0);
        }
        else{
                //从这里开始写的代码都是在新的进程里执行的,同样正常退出的话,最好也给一个返回值
                exit(0);
        }
}
?>

     

这样一改好理解多了,如果你父进程希望知道子进程正常退出的话,可以加上前面的pcntl_wait.
     

函数的用法是整明白了,在实际的工作中有什么用处呢?
     

1.后台程序
     

命令行程序好写,服务程序也好写,笔者觉得这服务程序最难写.想想原来想在windows下写个服务啥的,又是要注册服务又是要这样那样的老费劲了.现在专职管理linux想让个命令行程序在后台运行,直接在命令后面加个&就搞定了.但是这样总觉得土.有了pcntl_fork突然发现世界是那么的美好.当主进程成功创建子进程并获得子进程的id以后,自己在临死前还不忘说一句:"我已成功运行,我的id是:xxxx(子进程的id)",完了还给系统返回个0(正常退出),哈哈,死都死的那么有尊严.
     

前面说的是程序常驻内存的情况,当然了这时候要注意内存的释放以及向日志文件打印信息,而不是往屏幕上(一打印信息程序就退出的哟).还有一种情况是:程序被其它脚本调用,其它脚本只关心程序是不是正常运行,如果程序要运行很长时间才能运行完的话,最好不让脚本等待.这样的话pcntl_fork又派上用场了:)
     

2.延时处理.
     

有的时候,我们程序退出的时候要清理自身产生的东西,比如说要删除自己(当然了linux下面是可以删除正在运行的文件的,只是举个例子),这个时候就可以另起动一个进程,然后自己结束了,把事情交给另一个进程来做.当我们写服务程序的时候,我们肯定是写日志文件记录程序的运行情况(要不谁知道程序是不是在那睡大觉的:0).程序正常退出的时候我们可以写一条日志说程序退出了,但是当程序收到linux下伟大的kill -9的时候,怎么记录自己的退出行为呢?额.....这个和php的进程信号有关好像和这个没多大关系.
     

另一种情况:一个完善的程序一般都支持start,stop,restart这样的参数.start好说,stop也好说,既然start和stop都好说了,这个restart就先stop然后再start就可以了啊.额...好像又和pcntl_fork没多大关系,当你收到重启的信号总不能还是kill然后再start吧,是不是太黄太暴力了?还是温柔一点,让当前进程退出,让另外的进程再把它拉起来吧.在windows下想实现这一点似乎很困难呢,比如程序更新的时候,一般都是单写更新程序,或者程序退出的时候另起动一个批处理启动自己:)
     

3.不死进程
     

其实就是传说中的双进程了.早些年的时候万象网管为了达到不被恶意结束的目的用的就是这招了.虽然咱不用担心程序被人恶意停止,但是也保不齐主程序因为任务太重抗不住自己先挂了(这种情况也不是不会发生).所以......
     

说了这么多,只是对写程序的一些思考,对一个函数用法的延伸.我想到了这么多,你呢?

 

本文出自:rainbird

出处:http://rainbird.blog.51cto.com/211214/277861


0人打赏
您需要登录后才可以回帖
发表回复
极贡献
技术问答
专题荟萃
程序人生
视觉设计
Android开发
iOS开发
编程语言
前端开发
后端开发
服务器架构
软件测试
运维方案
创业路上



最热文章墙

  • 62748/349   【精品推荐】200多种Android动画效果的强悍框架,太全了,不看这个,再有动画的问题,不理你了^@^

  • 35034/189   情人节福利,程序员表白的正确姿势:改几行代码就变成自己的表白了

  • 32945/142   省时省力的Android组件群来了,非常棒的原型参考

  • 31071/236   【精品推荐】Android版产品级的音乐播放器源码,功能太强大了,最好的产品原型有木有?

  • 29075/0   Python爬虫:常用浏览器的useragent

  • 26770/2   超全!整理常用的iOS第三方资源

  • 25365/70   原创表白APP,以程序员的姿势备战新年后的7夕,持续完善中!

  • 23926/138   2016抢红包软件及源码

  • 20369/29   麻省理工的一帮疯子,真的实现了随意操控万物!(绝对黑科技)

  • 20218/25   Android工程师面试题大全

  • 19732/27   2016程序员跳槽全攻略

  • 19578/9   GitHub上排名前50的iOS项目:总有一款你用得着

  • 18902/20   码魂:程序员的牛B漫画

  • 17984/151   Android版类似UC浏览器:非常赞,产品级的源码

  • 17133/3   吐槽那些程序员的搞笑牛逼注释

  • 16617/10   2016年最全的Android面试考题+答案 精编版

  • 16045/1   iOS 动画总结

  • 15809/41   一个绚丽的loading动效分析与实现!

  • 15481/73   【持续更新中】Android福利贴(二):资料源码大放送

  • 15410/84   Android小而全的博客源码:非常适合全面掌握开发技巧

  • 15013/44   惊艳的App引导页:背景图片切换加各个页面动画效果

  • 14954/10   女程序员的梦,众网友的神回复

  • 14760/23   个人收集的Android 各类功能源代码

  • 14717/11   年会上现场review代码是怎么样的体验!

  • 14490/5   新一代Android渠道打包工具:1000个渠道包只需要5秒

  • 13849/23   珍藏多年的素材,灵感搜寻网站

  • 13734/53   基于瀑布流的美女图片浏览App,有注释的源代码

  • 13436/76   仿京东商城客户端Android最新版,不错的原型和学习资料

  • 13415/17   用JavaScript 来开发iOS和Android 原生应用:React Native开源框架中文版来啦

  • 13068/15   基于Android支付宝支付设计和开发方案

  • 12995/20   Android福利第三波【Android电子书】

  • 12987/94   Android带弹幕的视频播放器源码,来自大名鼎鼎的Bilibili弹幕网站

  • 12810/18   65条最常用正则表达式,你要的都在这里了

  • 12594/17   什么是真正的黑客:收获12200+Stars,人气远超微软开源VS

  • 12579/72   【精品推荐】类似360安全卫士安Android源码:非常赞的产品原型

  • 12337/0   iOS中文版资源库,非常全

  • 12051/7   用程序员的姿势抢过年的火车票

  • 12010/7   一张图搞定iOS学习路线,非常全面

  • 12002/11   有木有这样一张酷图帮你集齐所有git命令超实用

  • 11492/10   成为Java顶尖程序员 ,看这11本书就够了

  • 11243/18   一张图搞定Android学习路线,非常全面

  • 11188/10   微信支付终于成功了(安卓,iOS),在此分享

  • 11062/44   在线音乐播放器完整版(商用级的源码):非常赞,可听免费高品质专辑

  • 10928/3   基于Node.js的强大爬虫,能直接发布抓取的文章哦

  • 10816/0   GitHub iOS 库和框架Top100 

  • 10760/29   【持续更新中】Android福利贴(一):资料源码

  • 10259/4   46 个非常有用的 PHP 代码片段

  • 10204/61   【技巧一】搭配Android Studio,如何实现App远程真机debug?

  • 10035/3   即时通信第三方库

  • 9779/8   流媒体视频直播方案

  • 9741/9   烧了5亿美金,这家神秘的公司即将颠覆人类未来!

  • 9652/9   B站建开源工作组:APP想支持炫酷弹幕的看过来

  • 9527/18   八个最优秀的Android Studio插件

  • 9424/2   【精品推荐】高质量PHP代码的50个实用技巧:非常值得收藏

  • 9341/10   中国黑客的隐秘江湖:攻守对立,顶尖高手月入千万美元

  • 8890/6   开箱即用!Android四款系统架构工具

  • 8729/3   一张图看清Linux 内核运行原理

  • 8690/10   十大技巧快速提升Android应用开发性能

  • 8652/3   10款GitHub上最火爆的国产开源项目——可以媲美西半球

  • 8352/1   Android性能优化视频,文档以及工具

  • 返回顶部