简单地异步调用接口

330 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情

今天给大家结束一下如何使用php来实现异步调用接口。平时大家在开发项目的时候如果项目比较大的话,一般都会把项目划分为若干个小的模块,而模块与模块之间的数据调用可以通过多种方式来实现,可以通过http协议,tpc协议等来调用。如果在一次操作中需要调用多个接口,如果使用同步的方式则会因为网络通讯导致这个接口的请求速度很慢,所以今天我就简单介绍一下如何解决这个问题吧。

首先给大家简单介绍一下几个函数的使用。

stream_socket_client

打开网络或Unix域套接字连接

stream_set_blocking

可以将资源流设置为阻塞模式或者非阻塞模式,第一个参数是resource就是stream_socket_client返回的套接字,第二个参数是mode:true为阻塞false为非阻塞,主要影响的函数分别是fgets,fread。

<?php
$socket stream_socket_client('tcp://127.0.0.1:8000'$errorno$errstr);
echo 'start';
echo fread($socket128);
echo 'success';
fclose($socket);

如果服务器端不发送任何东西,客户端的fread一直卡住,阻塞等待,此时程序只输出start,一直到超时后才输出success。另外需要注意的是阻塞等待过程中如果对应的socket被关闭了也不会继续阻塞,例如上面的服务器端被关闭了。

<?php
$socket stream_socket_client('tcp://127.0.0.1:8000'$errorno$errstr);
stream_set_blocking($socket,false);
echo 'start';
echo fread($socket128);
echo 'success';
fclose($socket);

这样客户端的fread就不会阻塞等待了,直接跳过执行输出success。

stream_set_timeout

作用于读取流时的时间控制。fsockopen函数的timeout只管创建连接时的超时,对于连接后读取流时的超时,则需要用到 stream_set_timeout函数。

然后我就就可以通过使用这个三个函数试下异步请求接口了。

<?php
$socket stream_socket_client('tcp://127.0.0.1:8000'$errorno$errstr);
stream_set_blocking($socket,false);
stream_set_timeout(socket, 5);
$data = '发送给服务端的参数';
fwrite($socket,$data);

//我们可以在这个地方处理我们自己的其他任务
//......

//处理完之后在通过fread异步读取接口返回的数据
echo fread($socket128);
fclose($socket);

谢谢观看!streetlamp敬上!