(备注图片与文字无关)
曾经有一道php的笔试题,说如果让你使用php语言去写下载文件,你会使用哪个?
其实单就这个问题来讲,php语言当中有很多中方式能够去实现。
但是推荐答案给的是fsockopen 。
但细想想file_get_contents/curl 不也能获取么? 同样都能做的事情,他们几个会有什么样的区别呢?
手册、手册会给答案,呵呵:
1.fsockopen 偏向于网络底层调用;其返回数据是原始数据(未被处理,例如长度、开始结束字符等);fsockopen参数少,配置简单;
2.curl经过的包装支持HTTPS认证,HTTP POST方法, HTTP PUT方法, FTP上传, kerberos认证,HTTP上传, 代理服务器, cookies, 用户名/密码认证, 下载文件断点续传,上载文件断点续传,http代理服务器管道( proxy tunneling), 甚至它还支持IPv6, socks5代理服务器,,通过http代理服务器上传文件到FTP服务器等等,功能十分强大。curl是返回经过处理后的内容;curl参数多,配置复杂;
3.file_get_contents 需要php环境开启配置allow_url_open;请求http时,使用的是http_fopen_wrapper,请求单个文件,执行效率比较高,读取远程文件时,慎用(有人会说file_get_contents获取内容会慢,有时候会超时,其实超时多半是网络问题,file_get_contents也是有参数可以来定制超市时间的,具体请参考示例);
file_get_contents 函数代码使用示例:
/** 下载图片获取大小 */ public static function downGetImageSize($url) { $context = stream_context_create(array( 'http' => array( 'timeout' => 3 //超时时间,单位为秒 ) )); $content = @file_get_contents($url, 0, $context); //$content = @file_get_contents($url); $image_name = rand() . '.jpg'; $save = @file_put_contents(RUNTIME_PATH . '/Cache/' . $image_name, $content); $size = @getimagesize(RUNTIME_PATH . '/Cache/' . $image_name); @unlink(RUNTIME_PATH . '/Cache/' . $image_name); return !empty($size) ? array('width' => $size['0'], 'height' => $size['1']) : array('width' => 720, 'height' => 340); }
综合对比评价:
fsockopen和file_get_contents 不会对dns进行缓存,curl 可以对dns进行缓存,so对于同一个服务器进行多次获取文件内容的时候,curl的优势是很明显的;而且curl可以保持keepalive, fscockopen和file_get_contents受php.ini 环境配置allow_url_open的限制,如果关闭了,那么这两个就不好使了。同样的,fsockopen和file_get_contents 只能get方式获取内容,curl 则比较综合,get /post/form提交等。