程序linux下php多线程的妙用[基础]

php多线程  时间:2021-01-31  阅读:()

l inux下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 parentpcntl_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.不死进程

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

转载于 http://www.phptarena.com/jishuwenzhang/113.html

ProfitServer$34.56/年,5折限时促销/可选西班牙vps、荷兰vps、德国vps/不限制流量/支持自定义ISO

ProfitServer怎么样?ProfitServer好不好。ProfitServer是一家成立于2003的主机商家,是ITC控股的一个部门,主要经营的产品域名、SSL证书、虚拟主机、VPS和独立服务器,机房有俄罗斯、新加坡、荷兰、美国、保加利亚,VPS采用的是KVM虚拟架构,硬盘采用纯SSD,而且最大的优势是不限制流量,大公司运营,机器比较稳定,数据中心众多。此次ProfitServer正在对...

vpsdime:夏日促销活动,美国达拉斯VPS,2G内存/2核/20gSSD/1T流量,$20/年

vpsdime怎么样?vpsdime是2013年注册的国外VPS主机商,实际上他还有一系列的其他域名站点如Winity.io, Backupsy,Cloudive, Virtora等等,母公司“Nodisto IT”相对来说还是很靠谱了的商家。VPSDime主要提供各种高配低价VPS套餐,其中Linux VPS和存储VPS基于OpenVZ架构,高级VPS基于KVM。VPSDime在上个季度的Low...

PQ.hosting:香港HE/乌克兰/俄罗斯/荷兰/摩尔多瓦/德国/斯洛伐克/捷克vps,2核/2GB内存/30GB NVMe空间,€3/月

PQ.hosting怎么样?PQ.hosting是一家俄罗斯商家,正规公司,主要提供KVM VPS和独立服务器,VPS数据中心有香港HE、俄罗斯莫斯科DataPro、乌克兰VOLIA、拉脱维亚、荷兰Serverius、摩尔多瓦Alexhost、德国等。部分配置有变化,同时开通Paypal付款。香港、乌克兰、德国、斯洛伐克、捷克等为NVMe硬盘。香港为HE线路,三网绕美(不太建议香港)。免费支持wi...

php多线程为你推荐
名侦探柯南644名侦探柯南882~884是第几集马云将从软银董事会辞职亚洲首富马云今年有多太岁数马云卸任软银董事马云昨天卸任阿里巴巴董事长,不是之前听说已经卸任了吗?怎么又卸任?之前听说卸任交给了张勇唐人社美国10次啦我看到罗显琪第一眼就喜欢他了!当中我们一共见过10次面,也发生过两次关系! 但是他有女朋友对我也只是一时兴起吧,所以第十次见面之后,我们再没有联系,但是现在我大姨妈晚了很多天了,我担心是否怀孕,如果有的话,我又不想打掉,该找他吗?316不锈钢和304哪个好保温杯不锈钢316和304哪个好租车平台哪个好想租车,什么平台好苹果x和xr哪个好苹果x,苹果xs,苹果xr,苹果xs max哪个更值得买?传奇类手游哪个好什么传奇类手游好玩不坑钱?炒股软件哪个好炒股软件真的那么好用吗?核芯显卡与独立显卡哪个好英特尔核芯显卡怎么样?和独立显卡那个更好?
如何查询域名备案号 企业主机 zpanel vmsnap3 火车票抢票攻略 网站实时监控 警告本网站 eq2 hnyd 150邮箱 灵动鬼影 圣诞促销 秒杀预告 域名接入 web服务器安全 厦门电信 空间购买 国外在线代理服务器 独立主机 photobucket 更多