首页 > 编程语言 >PHP异步调用实现方式

PHP异步调用实现方式

时间:2023-01-05 16:36:28浏览次数:66  
标签:fp 异步 执行 HTTP 用户 调用 curl PHP


PHP异步调用实现方式


浏览器和服务器之间只一种面向无连接的HTTP协议进行通讯的,面向无连接的程序的特点是客户端请求服务端,服务端根据请求输出相应的程序,不能保持持久连接。

这样就出现了一个问题,一个客户端的相应服务端可能执行1秒也有可能执行1分钟,这样浏览器就会一直处于等待状态,如果程序执行缓慢,用户可能就没耐心关掉了浏览器。

而有的时候我们不需要关心程序执行的结果,没有必要这样浪费时间和耐心等待,那我们就要想出办法让程序不收等待在后台静默执行。

比如现在有一个场景,给1000个用户发送一封推荐邮件,用户输入或者导入邮件账号了提交服务器执行发送。



<?php  
$count=count($emailarr);
for($i=0;$i<$count;$i++)
{
  sendmail(.....);//发送邮件
}
?>


这段代码用户体验极差,也无法实际运用,首先发送这么多邮件会产生服务器运行超时,其实漫长的用户等待时间会让用户对系统产品怀疑和失去信心。但是用户不需要等待到1000封邮件都发送完毕了才提交发送成功,我们完全可以提交后台后直接给用户提示发送成功,然后让后台程序静默依次发送。

这个时候我们就需要“异步执行”技术来执行代码,异步执行的特点是后台静默执行,用户无需等待代码的执行结果,使用异步执行的好处:

1.摆脱了应用程序对单个任务的依赖性

2.提高了程序的执行效率

3.提高了程序的扩展性

4.在一定场景提高了用户体验

5.因为PHP不支持多线程,使用异步调用的请求多个HTTP的方式达到了程序并行执行效果,但是注意的是请求的HTTP过多的话,会大大加大了系统的开销

 

PHP异步执行的常用方式:

1.客户端页面采用AJAX技术请求服务器

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


2.popen()函数

resource popen ( string command, string mode );
//打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生。

所以可以通过调用它,但忽略它的输出。

​​pclose(popen(​​          ​​"/home/xinchen/backend.php &"​​          ​​, ​​          ​​'r'​​          ​​));​​



  这个方法避免了第一个方法的缺点,并且也很快。但是问题是,这种方法不能通过HTTP协议请求另外的一个WebService,只能执行本地的脚本文件。并且只能单向打开,无法穿大量参数给被调用脚本。

并且如果,访问量很高的时候,会产生大量的进程。如果使用到了外部资源,还要自己考虑竞争。


3.CURL扩展

CURL是一个强大的HTTP命令行工具,可以模拟POST/GET等HTTP请求,然后得到和提取数据,显示在"标准输出"(stdout)上面 <!--EndFragment-->



$ch = curl_init();

$curl_opt = array(CURLOPT_URL, 'http://www.example.com/backend.php',
CURLOPT_RETURNTRANSFER, 1,
CURLOPT_TIMEOUT, 1,);

curl_setopt_array($ch, $curl_opt);

curl_exec($ch);

curl_close($ch);



使用CURL需要设置CUROPT_TIMEOUT为1(最小为1,郁闷)。也就是说,客户端至少必须等待1秒钟。 <!--EndFragment-->

4.fscokopen()函数

fsockopen是一个非常强大的函数,支持socket编程,可以使用fsockopen实现邮件发送等socket程序等等,使用fcockopen需要自己手动拼接出header部分

官方文档: ​​http://cn.php.net/fsockopen/​


​​$fp​​           ​​= ​​          ​​fsockopen​​          ​​(​​          ​​"www.example.com"​​          ​​, 80, ​​          ​​$errno​​          ​​, ​​          ​​$errstr​​          ​​, 30); ​​          


​​if​​ ​​(!​​ ​​$fp​​ ​​) { ​​


​​echo​​ ​​"$errstr ($errno)<br />\n"​​ ​​; ​​


​​} ​​ ​​else​​ ​​{ ​​


​​$out​​ ​​= ​​ ​​"GET /backend.php / HTTP/1.1\r\n"​​ ​​; ​​


​​$out​​ ​​.= ​​ ​​"Host: www.example.com\r\n"​​ ​​; ​​


​​$out​​ ​​.= ​​ ​​"Connection: Close\r\n\r\n"​​ ​​; ​​





​​fwrite(​​ ​​$fp​​ ​​, ​​ ​​$out​​ ​​); ​​


​​/*忽略执行结果 ​​


​​while (!feof($fp)) { ​​


​​echo fgets($fp, 128); ​​


​​}*/​​


​​fclose(​​ ​​$fp​​ ​​); ​​


​​}​​

标签:fp,异步,执行,HTTP,用户,调用,curl,PHP
From: https://blog.51cto.com/kenkao/5991420

相关文章

  • C#调用VC的DLL的接口函数参数类型转换一览表
    handle---------IntPtrhwnd-----------IntPtrchar*----------stringint*-----------refintint&-----------refintvoid*----------IntPtrunsignedchar*-----refbyt......
  • 如何在forEach内使用异步调用 async/await
    翻自:HowtouseasyncandawaitinaforEachJSloop?https://learn.coderslang.com/0144-how-to-use-async-and-await-in-a-foreach-js-loop/事实上我们无法在forEa......
  • 反射3 - 创建对象、调用方法
    反射-练习反射机制的优势很明显:它可以实现动态创建对象和编译,体现出语言很大的灵活性,这也是反射被广泛用于各种框架中的最主要原因。反射机制的缺点也是显而易见的......
  • unity3d异步加载场景
    ​​unity3d​​​​loading界面​​​​异步加载​​​​进度条​​根据宣雨松前辈的教程来做的,因为我用到的场景不是在游戏里的那种(本人做增强现实的,完全把unity拿来做应......
  • c#的构造函数及构造函数的调用
    C#构造函数的特性一、什么是C#构造函数?Construct,Function   C#构造函数是一种特殊的成员函数,它主要用于为对象分配存储空间,对数据成员进行初始化.   C#构造......
  • android基础02 - 多媒体、多线程与异步任务、Service、网络
    多媒体通知通知渠道:程序对自己发出的通知进行分类,用户可根据渠道对消息进行屏蔽或设置响铃振动。一个应用的通知渠道一旦创建就无法再修改,只能再创建新的可在Activity、......
  • Unity利用协同实现场景异步加载
    1.usingUnityEngine;2.usingSystem.Collections;3.4.publicclassFightTriggle:MonoBehaviour{5.privateAsyncOperationasync;6.i=0;7.......
  • unity调用windows取色器实现换色和保存颜色
    需求如下:要打包后的exe文件可以实现给地板换颜色,而且必须用取色器来选颜色,当下次打开的时候颜色还要保留成上次选择后的颜色。思路:unity自带的取色器只能在编辑状态用,打包......
  • ThinkPHP多语言模块文件包含RCE复现详细教程
    漏洞描述:ThinkPHP在开启多语言功能的情况下存在文件包含漏洞,攻击者可以通过get、header、cookie等位置传入参数,实现目录穿越+文件包含,通过pearcmd文件包含这个trick即可实......
  • C#调用http请求,HttpWebRequest添加http请求头信息
    usingSystem;usingSystem.Collections.Generic;usingSystem.IO;usingSystem.Linq;usingSystem.Net;usingSystem.Text;usingSystem.Threading.Tasks;namesp......