fsockopen
是比较底层的调用,属于网络系统的socket调用。
返回的是没有处理过的数据,包括数据的长度数据内容和数据的结束符。因此获取结果可能需要再做处理。
每次请求都会重新做DNS查询,并不对DNS信息进行缓存。
curl
经过了包装。因此可以支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证,HTTP上传, 代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传,http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。
返回的是处理后的内容。
自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。
file_get_contents
需要php.ini里开启allow_url_fopen。
获取https链接内容的时候,需要php 中mod_ssl的支持(或安装opensll)。
每次请求都会重新做DNS查询,并不对DNS信息进行缓存。
效率对比
file_get_contents() 调用外部文件容易超时报错。curl 效率比 file_get_contents() 和 fsockopen() 高一些,原因是CURL会自动对DNS信息进行缓存。
总之,file_get_contents 和 curl 能干的,socket都能干。socket能干的,curl 就不一定能干了 。file_get_contents 更多的时候只是去拉取数据。效率比较高也比较简单。