函数[应用]php多线程机制

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

PHP异步调用、多线程、计划任务

2012-03-0417:45: 13 作者 user 来源会员投稿 评论 0 点击9 [我要投稿]

PHP编程也能实现这些看起来很高级的编程任务。异步调用一般用来执行耗时较长的操作让程序在服务器后台执行前台用户无需等待。参考这篇. . .PHP编程也能实现这些看起来很“高级”的编程任务。

异步调用一般用来执行耗时较长的操作让程序在服务器后台执行前台用户无需等待。参考这篇文章 PHP异步调用避免程序运行超时。

案例 PHP语言

某SNS社区在系统里用户给自己的好友好友数量上百发送邮件每封邮件内容不一发送后提示发送完毕

常用PHP写法sendmail.php

1<?php

2$count=count($emailarr) ;//$emailarr数组为好友的邮件地址

3for($i=0;$i<$count;$i++) {

4sendmail (. . . . . ) ;//发送邮件

5}

6echo '发送完毕' ;

7?>

假设该次发送100封邮件。本次操作会出现什么结果呢?

用户体验用户等待->发送数十封邮件出去->系统超时返回错误信息

本次操作由于需要发送大量的邮件导致php执行时间过长用户烦躁的等待。当apache或者nginx等待超过允许执行时间返回超时错误。这个时候用户不明确本次操作到底成功与否到底发出了几封邮件。

我们可以看出该代码用户体验极差并且不能够顺利完成任务。

那应该怎么操作呢?

这里提到一个概念异步执行

用户体验用户等待->发送完毕

朋友们就会问怎么缺少发信环节

OK发信环节就在用户提交请求的时候把发信任务转给了一个单独处理发信的

php程序处理了当用户看见“发送完毕”的时候其实信还没发送完这个时候发信程序正在后台努力的工作着一封一封的向外发送sendmail.php

1 <?php

2 $domai n="www.admpub.com";

3 $url="/system_mail.php";

4 $par="email=". implode(' , ' , $emailarr) . "&. . . . . . . . ";

5 $header = "POST $url HTTP/1.0\r\n";

6 $header .= "Content-Type: application/x-www-form-urlencoded\r\n";7 $header .= "Content-Length: " . strlen($par) . "\r\n\r\n";

8 $fp = @fsockopen ($domain, 80, $errno, $errstr, 30) ;

9 fputs ($fp, $header . $par) ;

10fclose($fp) ;

11echo '发送完毕' ;

12?>system_mail.php

<?php

1ini_set("ignore_user_abort", true) ;

2//ignore_user_abort(true) ;此处的代码需要php. ini开启相关的选项保证3php执行不超时的不明白参考我的另一篇文章 “关闭浏览器后,php脚本会4不会继续运行”

5//获取email地址发信此处为发信代码

?>

好了改成异步方式后用户提交信息可以立即得到结果“发送完毕” 。信呢会在后台一封一封的发送直到发送完毕。

前几天用ASP.NET实现了计划任务功能心里想 PHP或许也能实现搜索了一下确实也能实现。参考这篇文章 PHP计划任务的实现。php计划任务的实现(zt)

文章分类:PHP编程

1 <?php

2 ignore_user_abort() ; //即使Client断开(如关掉浏览器)  PHP脚本也可以3继续执行.

4 set_time_limit(0) ; //执行时间为无限制 php默认的执行时间是30秒5通过set_time_limit(0)可以让程序无限制的执行下去

6 $interval=60*5; //每隔5分钟运行

7 do{$fp = fopen(' test. txt' , 'a' ) ;

8 fwrite($fp, ' test' ) ;

9 fclose($fp) ;

10sleep($interval) ;

11//等待5分钟

}while(true) ;

?>php定时计划任务介绍2010-05-06 10: 10以前对se特别感兴趣但是自己又不会java lucene等搜索引擎开发工具于是不断挖掘php的功效。

最后发现php也可以做抓取并且原理很易直接获取页面源文件然后通过正则或字符串的参照截取来获取需要的信息。但是性能上不能和搜索引擎的多线程抓取相比。

实现了上一步之后又思考着如果抓取可以自动定时获取那么人工运行可执行页面也就省下来了。

后来也在一些php开源程序中了解到关于"计划任务"的效果可以定时运行某程序 比如数据库备份更新缓存生成静态页面生成网站地图等。

最近由于项目需要定时更新远程数据库到本地网上搜了搜还真找到了。ignore_user_abort() ;函数搭配set_time_limit(0) ;和sleep($interval) ;即可实现以上自动更新。

先给出一个基本的范式其中有个人的测试程序

1 <?php

2 ignore_user_abort() ; // run script in background

3 set_time_limit(0) ; // run script forever

4 $interval=30; // do every 15 minutes. . .

5 do{

6 $fp = fopen(' text3. txt' , 'a' ) ;

7 fwrite($fp, ' test' ) ;

8 fclose($fp) ;

9 sleep($interval) ; // wait 15 minutes

10}while(true) ;

11?>

首先运行该程序然后关闭该页面程序仍然运行中 test会每隔30秒的填补到text3. txt文件。

实现效果如图 (略)

最后根据php手册简单介绍一些相关的知识

1.连接处理

在PHP内部系统维护着连接状态其状态有三种可能的情况

0 - NORMAL 正常

1 - ABORTED 异常退出

2 - TIMEOUT 超时

当PHP脚本正常地运行NORMAL状态时连接为有效。当远程客户端中断连接时 ABORTED状态的标记将会被打开。远程客户端连接的中断通常是由用户点击STOP按钮导致的。当连接时间超过PHP的时限时 TIMEOUT状态的标记将被打开。

可以决定脚本是否需要在客户端中断连接时退出。有时候让脚本完整地运行会带来很多方便即使没有远程浏览器接受脚本的输出。默认的情况是当远程客户端连接中断时脚本将会退出。该处理过程可由php. ini的ignore_user_abort或由Apache .conf设置中对应的"php_value ignore_user_abort"以及ignore_user_abort() 函数来控制。如果没有告诉PHP忽略用户的中断脚本将会被中断除非通过register_shutdown_function()设置了关闭触发函数。通过该关闭触发函数当远程用户点击STOP按钮后脚本再次尝试输出数据时PHP将会检测到连接已被中断并调用关闭触发函数。

脚本也有可能被内置的脚本计时器中断。默认的超时限制为30秒。这个值可以通过设置php. ini的max_execution_time或Apache .conf设置中对应的"php_value max_execution_time"参数或者set_time_limit() 函数来更改。当计数器超时的时候脚本将会类似于以上连接中断的情况退出先前被注册过的关闭触发函数也将在这时被执行。在该关闭触发函数中可以通过调用connection_status() 函数来检查超时是否导致关闭触发函数被调用。如果超时导致了关闭触发函数的调用该函数将返回2。

需要注意的一点是ABORTED和TIMEOUT状态可以同时有效。这在告诉PHP忽略用户的退出操作时是可能的。PHP将仍然注意用户已经中断了连接但脚本仍然在运行的情况。如果到了运行的时间限制脚本将被退出设置过的关闭触发函数也将被执行。在这时会发现函数connection_status()返回3。

2.相关函数

int ignore_user_abort ( [bool setting] )

This function sets whether a client disconnect should cause a script tobe aborted. It will return the previous setting and canbe called withoutan argument to not change the current setting and only return the currentsetting.int connection_aborted ( void )

Returns TRUE if client disconnected.int connection_status ( void )

Returns the connection status bitfield.

至于多线程这个课题参考一下这篇文章 PHP多线程

阿里云香港 16核32G 20M 999元/月

阿里云香港配置图提速啦是成立于2012年的十分老牌的一个商家这次给大家评测的是 阿里云香港 16核32G 20M 这款产品,单单说价格上就是十分的离谱原价8631元/月的现价只要 999元 而且还有个8折循环优惠。废话不多说直接进入正题。优惠时间 2021年8月20日-2021年9月20日 优惠码 wn789 8折优惠阿里云香港BGP专线 16核32G 10M带宽 优惠购买 399元购买链接阿里云...

Advinservers:美国达拉斯便宜VPS/1核/4GB/80GB SSD/1Gbps不限流量/月付$2.5/美国10Gbps高防服务器/高达3.5TBDDos保护$149.99元/月

Advinservers,国外商家,公司位于新泽西州,似乎刚刚新成立不久,主要提供美国和欧洲地区VPS和独立服务器业务等。现在有几款产品优惠,高达7.5TB的存储VPS和高达3.5TBDDoS保护的美国纽约高防服务器,性价比非常不错,有兴趣的可以关注一下,并且支持Paypal付款。官方网站点击直达官方网站促销产品第一款VPS为预购,预计8月1日交付。CPU为英特尔至强 CPU(X 或 E5)。官方...

弘速云20.8元/月 ,香港云服务器 2核 1g 10M

弘速云元旦活动本公司所销售的弹性云服务器、虚拟专用服务器(VPS)、虚拟主机等涉及网站接入服务的云产品由具备相关资质的第三方合作服务商提供官方网站:https://www.hosuyun.com公司名:弘速科技有限公司香港沙田直营机房采用CTGNET高速回国线路弹性款8折起优惠码:hosu1-1 测试ip:69.165.77.50​地区CPU内存硬盘带宽价格购买地址香港沙田2-8核1-16G20-...

php多线程为你推荐
海贼王644集海贼王巴托洛米奥是路飞的忠实粉丝,638集他和贝拉米打的时候路飞给贝拉米加油他知道嘛?最后他说烧烧桌面背景图片桌面背景和桌面壁纸的区别是什么?登陆qq空间首页使用您的原来关闭了空间的QQ号码登录空间首页http://qzone.qq.com,在进入QQ空间个人中心体验版后,点击左上角“立即开通QQ空间”,根据系统提示,输入您相关的资料后为什么还是没有开通视频制作软件哪个好我想学做视频跟作图,推荐下什么软件好涡轮增压和自然吸气哪个好发动机涡轮增压好还是自然吸气好迈腾和帕萨特哪个好迈腾和帕萨特哪个好江门旅游景点哪个好玩的地方江门有那个地方好玩呢手机杀毒软件哪个好手机杀毒软件那个好用牡丹江教育云空间登录牡丹江教育云平台学生注册错了怎么办?飞信空间登录怎样在网上登陆飞信
免费二级域名 泛域名绑定 inmotionhosting 777te 域名转接 静态空间 ebay注册 阿里云邮箱申请 杭州电信宽带 winds 美国主机 winserver2008r2 globalsign 极域网 冰盾ddos防火墙 dell服务器论坛 好看的空间名字 个人web服务器 元旦促销方案 英国伦敦时间 更多