程序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

Vultr新注册赠送100美元活动截止月底 需要可免费享30天福利

昨天晚上有收到VULTR服务商的邮件,如果我们有清楚的朋友应该知道VULTR对于新注册用户已经这两年的促销活动是有赠送100美元最高余额,不过这个余额有效期是30天,如果我们到期未使用完的话也会失效的。但是对于我们一般用户来说,这个活动还是不错的,只需要注册新账户充值10美金激活账户就可以。而且我们自己充值的余额还是可以继续使用且无有效期的。如果我们有需要申请的话可以参考"2021年最新可用Vul...

NameSilo域名优惠码活动

NameSilo是通过之前的感恩节优惠活动中认识到这家注册商的,于是今天早上花了点时间专门了解了NameSilo优惠码和商家的详细信息。该商家只销售域名,他们家的域名销售价格还是中规中矩的,没有像godaddy域名标价和使用优惠之后的价格悬殊很大,而且其特色就是该域名平台提供免费的域名停放、免费隐私保护等功能。namesilo新注册域名价格列表,NameSilo官方网站:www.namesilo....

Fiberia.io:$2.9/月KVM-4GB/50GB/2TB/荷兰机房

Fiberia.io是个新站,跟ViridWeb.com同一家公司的,主要提供基于KVM架构的VPS主机,数据中心在荷兰Dronten。商家的主机价格不算贵,比如4GB内存套餐每月2.9美元起,采用SSD硬盘,1Gbps网络端口,提供IPv4+IPv6,支持PayPal付款,有7天退款承诺,感兴趣的可以试一试,年付有优惠但建议月付为宜。下面列出几款主机配置信息。CPU:1core内存:4GB硬盘:...

php多线程为你推荐
锦天城和君合哪个好和君智业和三人禾哪个公司的营销做的好宝来和朗逸哪个好宝来和朗逸哪个好网页传奇哪个好玩哪个传奇类网页游戏即好玩又不花钱??无纺布和熔喷布口罩哪个好医用 口罩里面是无纺布好还是过滤纸好无纺布和熔喷布口罩哪个好无纺布除了做尿布湿口罩这些,还有其他什么用处吗?杰士邦和杜蕾斯哪个好安全套杜蕾丝好还是杰士邦好?播放器哪个好哪个播放器比较好用行车记录仪哪个好行车记录仪哪种好用?行车记录仪哪个好行车记录仪哪个好牡丹江教育云空间登录请问一下校园云空间的登录方式有哪些?
国外主机空间 国外网站空间 北京vps主机 美国主机评测 singlehop inmotionhosting mediafire 60g硬盘 免费网站监控 150邮箱 中国智能物流骨干网 有益网络 域名接入 gtt 多线空间 免费mysql数据库 免费asp空间 阿里云邮箱登陆 阿里云邮箱个人版 阿里云邮箱怎么注册 更多