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

桔子数据58元/月 ,Cera美西云服务器 2核4G 50G数据盘 500M带宽 1000G流量

桔子数据(徐州铭联信息科技有限公司)成立于2020年,是国内领先的互联网业务平台服务提供商。公司专注为用户提供低价高性能云计算产品,致力于云计算应用的易用性开发,并引导云计算在国内普及。目前公司研发以及运营云服务基础设施服务平台(IaaS),面向全球客户提供基于云计算的IT解决方案与客户服务,拥有丰富的国内BGP、双线高防、香港等优质的IDC资源。 公司一直秉承”以人为本、客户为尊、永...

RAKsmart 2021新年新增韩国服务器及香港美国日本VPS半价

RAKsmart 商家我们肯定不算陌生,目前主要的营销客户群肯定是我们。于是在去年的时候有新增很多很多的机房,比如也有测试过的日本、香港、美国机房,这不今年有新增韩国机房(记得去年是不是也有增加过)。且如果没有记错的话,之前VPS主机也有一次磁盘故障的问题。 这不今天有看到商家新增韩国服务器产品,当然目前我还不清楚商家韩国服务器的线路和速度情况,后面我搞一台测试机进行...

Hostodo:$19.99/年KVM-1GB/12GB/4TB/拉斯维加斯

Hostodo发布了几款采用NVMe磁盘的促销套餐,从512MB内存起,最低年付14.99美元,基于KVM架构,开设在拉斯维加斯机房。这是一家成立于2014年的国外VPS主机商,主打低价VPS套餐且年付为主,基于OpenVZ和KVM架构,产品性能一般,数据中心目前在拉斯维加斯和迈阿密,支持使用PayPal或者支付宝等付款方式。下面列出几款NVMe硬盘套餐配置信息。CPU:1core内存:512MB...

php多线程为你推荐
ddr2内存价格台式电脑DDR2 内存 现在的价格。月付百万的女人们满身香水味的女人和满身油烟味的女人,那种才男人们最想要的的女人?百度空间首页登录百度空间涡轮增压和自然吸气哪个好涡轮增压与自然吸气哪个好传奇类手游哪个好腾讯热血传奇手机版哪个职业厉害音乐播放器哪个好哪个音乐播放器最好牡丹江教育云空间登录云端学习如何登录?yy空间登录怎么进入YY音乐空间东莞电信宽带东莞电信宽带资费问题。急!dns服务器故障DNS服务异常是什么意思
虚拟主机控制面板 二级域名查询 工信部域名备案系统 冰山互联 香港机房 免备案cdn shopex空间 ssh帐号 patcha 服务器cpu性能排行 全能主机 qq数据库 本网站在美国维护 anylink hostloc 空间技术网 上海服务器 drupal安装 免费的asp空间 starry 更多