今天工作中我遇到了一个需要请求第三方接口数据的需求,别人(同事)用的是 fiel_get_contents ,由于对这个函数不是特别清楚,我就去查文档,这个函数可以发送get请求从网站(必须得有http://)获取数据,或者直接从文件中取出数据,如果成功就将数据存起来,如果失败就返回false。后来我上网查这个函数,发现了file_get_contents这个函数可能会造成服务器挂掉,原因是:(接下来是搬运的大神的,来自汪爷的博客https://www.cnblogs.com/scofi/articles/3607529.html)如果第三方公司提供的URL响应速度慢,或者出现问题,我们服务器的PHP程序将会一直执行去获得这个URL,我们知道,在 php.ini 中,有一个参数 max_execution_time 可以设置 PHP 脚本的最大执行时间,但是,在 php-cgi(php-fpm) 中,该参数不会起效。真正能够控制 PHP 脚本最大执行时间的是 php-fpm.conf 配置文件中的以下参数: <value name="request_terminate_timeout">0s</value> 默认值为 0 秒,也就是说,PHP 脚本会一直执行下去,当请求越来越多的情况下会导致php-cgi 进程都卡在 file_get_contents() 函数时,这台 Nginx+PHP 的 WebServer 已经无法再处理新的 PHP 请求了,Nginx 将给用户返回“502 Bad Gateway”。CPU的利用率达到100% ,时间一长服务器就会挂掉[1]。
后来我请教了一些工作经验比较丰富的的员工,他们说请求第三方数据一般用curl来实现,我正好前几天刚学了下这个curl系列的函数,只是理解的不深刻,于是我又去找了网上找了大神们关于curl方法的讲解其中在脚本之家看了一篇:《php中file_get_contents与curl性能比较分析》我觉得讲的比较好。其中我觉得重要的有如下几点:
一、CURL会自动对DNS信息进行缓存,file_get_contents 每次请求都会重新做DNS查询,并不对 DNS信息进行缓存。
二、curl 可以模拟多种请求,例如:POST数据,表单提交等,用户可以按照自己的需求来定制请求。而file_get_contents只能使用get方式获取数据。
三、file_get_contents 函数会受到php.ini文件中allow_url_open选项配置的影响。如果该配置关闭了,则该函数也就失效了。而curl不受该配置的影响。
四、curl比file_get_contents速度快了30%左右,最重要的是服务器负载更低,而且更稳定。
本文参考文献有:
《php函数file_get_contents(一)》汪爷的博客https://www.cnblogs.com/scofi/articles/3607529.html)
《php中file_get_contents与curl性能比较分析》 http://www.jb51.net/article/57238.htm