PHP 异步执行方法,模拟多线程

PHP 本身没有多线程的东西,但可以曲线的办法来造就出同样的效果,比如多进程的方式来达到异步调用,只限于命令模式。

另外还有一种更简单的方式可用于 Web 程序中,那就是用 fsockopen()、fputs() 来请求一个 URL, 而无需等待返回,如果你在那个被请求的页面(URL)中做些事情就相当于异步了。

关键代码如下:

<?php
$fp=fsockopen('localhost',80,&$errno,&$errstr,5);
if(!$fp){
	echo "$errstr ($errno)<br />/n";
}
fputs($fp,"GET another_page.php?flag=1/r/n");
fclose($fp);

上面的代码向页面 another_page.php 发送完请求就不管了,用不着等待请求页面的响应数据,利用这一点就可以在被请求的页面 another_page.php 中异步的做些事情了。

比如,一个很切实的应用,我们每当发表了一篇新日志后需要给所有该日志的订阅者发个邮件通知, 如果按照通常的方式就是:

日志写完 -> 点提交按钮 -> 日志插入到数据库 -> 发送邮件通知 -> 告知撰写者发布成功

那么作者在点提交按钮到看到成功提示之间可能会等待很常时间,基本是在等邮件发送的过程,比如连接邮件服务异常、或器缓慢或是订阅者太多。而实际上是不管邮件发送成功与否,保证日志保存成功基本可接受的,所以等待邮件发送的过程是很不经济的,这个过程可异步来执行,并且邮件发送的结果不太关心或以日志形式记录备查。

改进后的流程就是:

日志写完 -> 点提交按钮 -> 日志插入到数据库 ---> 告知撰写者发布成功 ---> 发送邮件通知 -> [记下日志]

写个实际的程序来测试一下,有两个文件,分别是 write.php 和 sendmail.php,在 sendmail.php 用 sleep(seconds) 来模拟程序执行所使用时间。

write.php,执行耗时 1 秒:

<?php
function asyn_sendmail(){
	$fp=fsockopen('localhost',80,&$errno,&$errstr,5);
	if(!$fp){
		echo "$errstr ($errno)<br />/n";
	}
	sleep(1);
	fputs($fp,"GET /sendmail.php?param=1/r/n"); #请求的资源 URL 一定要写对
	fclose($fp);
}
echo time().'<br>';
echo 'call asyn_sendmail<br>';
asyn_sendmail();
echo time().'<br>'; 

sendmail.php,执行耗时 10 秒:

<?php
sleep(10);
fopen("C:/".time(),"w");

通过页面访问 write.php,页面输出:

1272472697

call asyn_sendmail

1272472698

并且在 C:/ 生成文件:

1272472708

从上面的结果可以看出 sendmail.php 至少花费 10 秒,但不会阻塞 write.php 继续往下执行,表明这一过程是异步的。

您可能感兴趣的文章

  • php异步调试和线上调试网站程序的方法
  • Javascript 异步加载,提高网页的浏览速度
  • PHP Curl批量多线程打开网址的类
  • PHP判断服务器SSL是否启用,也就是判断是否支持HTTPS连接
  • PHP 利用 Curl Functions 实现多线程抓取网页和下载文件
  • php获取目录所有文件并将结果保存到数组的程序
  • php利用curl实现多线程的类,php curl多线程下载图片
  • PHP利用CURL_MULTI实现多线程

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php
, url
, 多线程
, 多进程
, 曲线
方式
php curl 多线程 异步、php 异步多线程、php 多线程 异步处理、php 多线程执行、php 异步执行,以便于您获取更多的相关知识。

时间: 2024-10-29 10:43:32

PHP 异步执行方法,模拟多线程的相关文章

PHP 异步执行方法,模拟多线程的应用分析_php实例

PHP 本身没有多线程的东西,但可以曲线的办法来造就出同样的效果,比如多进程的方式来达到异步调用,只限于命令模式.另外还有一种更简单的方式可用于 Web 程序中,那就是用 fsockopen().fputs() 来请求一个 URL, 而无需等待返回,如果你在那个被请求的页面(URL)中做些事情就相当于异步了.关键代码如下: 复制代码 代码如下: <?php  $fp = fsockopen('localhost',80,&$errno,&$errstr,5);    if(!$fp)

linux中shell模拟多线程执行任务详解

shell本身是不能实现多线程的,但是可以通过启动子进程,并将子进程放入后台执行来模拟多线程,为了在提高脚本执行效率的同时又不明显增加负载的作用,还需要对同时放入后台的进程数做下限制.  代码如下 复制代码 #!/bin/bash set -x  # 开启调试模式 #判断是否有参数 if [ $# != 1 ];then     echo "您输入的参数有误"     exit -1 fi # 允许的最大进程数 MAX_THREAD_NUM=5 tmp_fifo_file=/tmp/$

PHP 命令行模式实战之cli+mysql 模拟队列批量发送邮件(在Linux环境下PHP 异步执行脚本发送事件通知消息实际案例)

源码地址:https://github.com/Tinywan/PHP_Experience 测试环境配置: 环境:Windows 7系统 .PHP7.0.Apache服务器 PHP框架:ThinkPHP框架(3.2) Redis数据库:测试数据回调函数:通过一个Redis的自增incr来测试异步脚本执行的次数和访问的时间(平时都是用Redis测试写日志的) 编辑器:Visual Studio Code (CLI运行环境好看点) PHP 的命令行模式       从版本 4.3.0 开始,PHP

PHP异步执行实现的四种方法详解

PHP异步执行的常用方式: 1.AJAX1. 最简单的办法,就是在返回给客户端的HTML代码中,嵌入AJAX调用,或者,嵌入一个img标签,src指向要执行的耗时脚本. 这种方法最简单,也最快.服务器端不用做任何的调用. 但是缺点是,一般来说Ajax都应该在onLoad以后触发,也就是说,用户点开页面后,就关闭,那就不会触发我们的后台脚本了. 而使用img标签的话,这种方式不能称为严格意义上的异步执行.用户浏览器会长时间等待php脚本的执行完成,也就是用户浏览器的状态栏一直显示还在load. 当

PHP ajax 异步执行不等待执行结果的处理方法

  这篇文章主要介绍了PHP ajax 异步执行不等待执行结果的处理方法,本文直接给出实现代码,需要的朋友可以参考下 短地址生成应用中,要根据长地址生成网页快照,这个生成时间非瞬发,不可预估. 所以前台方面采用的方案一般为先展示生成的短地址,再定期AJAX轮查网页快照是否生成完毕. So,PHP代码这里做了如下处理: 代码如下: // 这边服务器采用的是phantomjs 来生成网页快照 $cd = '/home/emp/phpinstall/phantomjs-1.5.0/bin/phanto

JavaScript使用yield模拟多线程的方法

 这篇文章主要介绍了JavaScript使用yield模拟多线程的方法,实例分析了javascript多线程的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了JavaScript使用yield模拟多线程的方法.分享给大家供大家参考.具体分析如下: 在python和C#中都有yield方法,通过yield可以实现很多多线程才能实现的功能. 对javascript有版本要求:JavaScript 1.7 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14

微信扫码支付成功后未执行异步回调方法

问题描述 微信扫码支付成功后未执行异步回调方法 微信扫码支付成功后未执行异步回调方法,电脑页面也没有任何变化,是什么原因呢

csharp-cSharp代码生成的dll内部的某些方法的执行能使用多线程么?

问题描述 cSharp代码生成的dll内部的某些方法的执行能使用多线程么? 1.csharp的代码被生成dll: 2.dll内部存在某些方法,它的执行流程中存在多线程的操作: 3.这种情况下,dll能够正常使用么? 解决方案 why not? dll内的函数跟你程序集本身的函数在运行时有什么不同?

JavaScript使用yield模拟多线程的方法_javascript技巧

本文实例讲述了JavaScript使用yield模拟多线程的方法.分享给大家供大家参考.具体分析如下: 在python和C#中都有yield方法,通过yield可以实现很多多线程才能实现的功能. 对javascript有版本要求:JavaScript 1.7 function Thread( name ) { for ( var i = 0; i < 5; i++ ) { Print(name+': '+i); yield; } } //// thread management var thre