这里是文章模块栏目内容页
php性能探讨——在后端发送http请求对程序的影响

php程序执行是单线程的,nginx接收到来自客户端的请求后,把请求转发给php-fpm容器,fpm是php的线程管理器,fpm开启一个独立线程处理一个客户端请求,fpm线程里运行的是php脚本,php执行结束后把程序处理结果返回给nginx转发给客户端,同时fpm销毁线程。

php在fpm开启的线程中执行,通常会查询mysql数据,查询redis数据,进行数据处理组合。假如mysql访问不了,那么php会报错,中断执行。

现在,如果在php中通过http客户端,例如curl 查询一个接口数据,假如接口一直阻塞住没有响应请求,php代码会一直等待响应,这样整个线程也会阻塞住,为了避免阻塞时间很长,设置php调用curl访问接口的最长等待时间。这样,即使接口一直没响应,php等待超时后会断开curl请求,继续其他php代码运行直到结束。

这种情况下,php没有得到接口数据,最终返回给用户的数据也不正确,所以在程序上来说,是无效的返回结果。

假设,同时访问nginx的用户数量突然上涨到100人。那么在短暂时间,nginx转发请求到php-fpm容器。fpm开启100个线程来处理请求。但是这100个线程都因为php访问接口被阻塞住,忙不过来了。可是用户访问没有停止,又来了100个用户访问站点,nginx继续转发100个请求给php-fpm容器。fpm查看一下最大可以开启的线程满了。这时,php-fpm就直接返回502给nginx,告诉用户服务没有响应了。

在php的服务器端开发时,要非常注意采用http的方式直接对接口进行访问。除非能确定接口的响应速度很快,并且处理能力,比php的性能高效。否则接口会成为 整个php应用的瓶颈。

好了,本文内容全部结束,感谢您的阅读,希望能帮助到您。