• php后台接口异步操作的实践


    需求管理今天碰到一个问题,就是用户反映,添加备注等接口响应速度慢,6秒多,影响用户体验。

    查找原因,发现是因为addComment接口里最后有发送邮件的操作,这个接口是同步的, 需要6秒左右返回。

    addComment请求里,有三个主要操作,都跟网络环境息息相关:

    ** 主要操作**

    1

    连接数据库,修改数据;

    2

    请求日志接口,添加用户日志;

    3

    调用邮件服务的接口发送邮件;

    这个三个操作是串行的顺序的执行的,都执行完才能返回,但是第三步耗时6秒,导致界面卡。这个邮件服务是别人的接口,需要他们去排查吧。

    要解决这个问题,我这边需要把接口改成异步的,首先想到的是用多线程,把第三步发送邮件的操作放到工作线程里,这样当前线程可以及时返回结果给客户端,不能让用户等太长时间,因为他们是上帝。

    问题来了,php自身不支持多线程,听说有个扩展-pthreads可以实现,那就安装吧。

    pthreads的安装

    pthreads扩展

    Windows下PHP多线程扩展pthreads的安装
    pthreads扩展安装步骤

    1.查看phpinfo()

    获取PHP版本号及位数(x86表示32位,x64表示64位)、编译器版本、PHP配置文件加载所在位置等。如下图所示:

    2.pthreads扩展

    下载地址:

    http://windows.php.net/downloads/pecl/releases/pthreads/

    3.在扩展列表中找到对应版本

    4.php_pthreads-2.0.9-5.5-ts-vc11-x86.zip参数详解

    2.0.9代表pthreads的版本号
    5.5代表php的版本号
    ts表示php是线程安全版本
    vc11表示php要MSVC11 (Visual C++ 2012)编译器编译
    x86则表示PHP版本是32位

    5.解压缩包

    复制php_pthreads.dll到D:\xampp\php\ext目录下
    复制pthreadVC2.dll到D:\xampp\php\目录下
    复制pthreadVC2.dll到D:\xampp\apache\bin目录下
    复制pthreadVC2.dll到C:\windows\system32目录下

    7.重启xampp服务器

    重启服务器后,查看phpinfo()就能看到pthreads扩展就表示安装成功,如下图:

    Note:

    安装时看好版本:

    php5需要安装pthreads v2版,

    php7可以安装pthreads v3

    done-用官方例子测试

    test_.php:

    然后在项目里尝试,把发送邮件的代码放到子线程里,日志里也显示调用成功了,但是就是没收到邮件。费解,怀疑是子线程里的操作没完成, 主线程返回,php进程退出了?导致邮件发送失败?

    但是,发送邮件的接口返回的是成功了,没有什么错误,而且,在接口最后,加上sleep(10)也不行,很奇怪。

    过程中,发现一个通过curl并发请求的开源项目 ParallelCurl ,但并不能解决我们的问题。只能另想办法。

    最后,利用php的系统调用,开启新的进程来实现。

    php 提供了fsockopen函数,此函数的功能为初始化一个套接字连接到指定主机,默认情况下将以阻塞模式开启套接字连接。当然你可以通过stream_set_blocking()将它转换到非阻塞模式。

    这是关键。所以,思路就是:开启一个非阻塞的套接字连接到本机,本机收到之后作一些耗时处理。

    现在要做的就是: 把第3步耗时的邮件发送操作放到其他进程里执行。

    这个接口完成第2步后, 与服务器建立非阻塞的socket连接,通过http协议告诉服务器:帮忙发个邮件啊,东西都放这了,我还有事,先走了,拜拜 。

    之后addComment这个接口也就可以马上给客户端回复。

    服务端另外一个接口收到发送邮件请求后,会异步的完成邮件发送。

    废话不多说,直接上代码:

    addComment接口伪代码:

    发送邮件的代码:

    这样就完成了异步操作。

    改完后的效果:

    哈喽,喜欢这篇文章的话烦请点个赞哦!万分感谢(^▽^)PS:有问题可以联系我们哦v ceshiren001

    复制“下方链接”,提升测试核心竞争力!
    更多技术文章分享和免费资料领取

  • 相关阅读:
    Python学习基础笔记七——元组
    CentOS7安装Xrdp以便Windows远程桌面连接
    GameOff2022参与有感
    DFS与回溯专题:路径总和问题
    `VUE`的介绍
    Connect-The-Dots_2
    工具提示框(Tooltip): 设计、应用与最佳实践
    【Spring Boot】JPA — JPA入门
    上位机与下位机通讯方式(转载)
    apple pencil性价比高吗?高性价比的ipad手写笔推荐
  • 原文地址:https://blog.csdn.net/Tester_muller/article/details/126295636