查找缘故原由,创造是由于addComment接口里末了有发送邮件的操作,这个接口是同步的, 须要6秒旁边返回。

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

紧张操作

phppthreadphp后台接口异步操作的实践 HTML

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接口伪代码:

发送邮件的代码:

这样就完成了异步操作。

https://qrcode.ceba.ceshiren.com/link?name=article&project_id=qrcode&from=toutiao×tamp=1661706000&author=Muller