cURL-用curl请求为什么比直接用file_get_content远程请求文件稳定?
本人很菜,今天遇到了这一情况,为什么前者比后者稳定的多呢。。直接file_get_content是用的什么方式?curl技术实现上有什么特别之处呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
本人很菜,今天遇到了这一情况,为什么前者比后者稳定的多呢。。直接file_get_content是用的什么方式?curl技术实现上有什么特别之处呢?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(6)
curl是php的扩展模块,file_get_contents是php内置函数;前者是专注网络通信,后者最主要就是操作文件的。
速度方面,对于获取某一个静态页面两者速度差不多,并不像网上有些人所说的那么夸张,但是如果获取那种必须需要身份验证(比如模拟登陆)、多个跳转的页面等那两者的速度就会很明显了,
稳定性,file_get_contents稳定性确实不如curl,尤其是在操作远程文件上,虽然你设置了延迟时间,好像这个时间基本不起什么作用,你可以测试一下。
很简单,不需要说那么多话,你编译过CURL就知道了。
CURL编译依赖OPENSSL,Zlib库,其中Zlib还用了汇编,能压缩传输数据,提高传输性能。
file_get_contents有时会获取同一个文件的历史版本。就是通过用curl来替换解决的。
curl是个命令,基于并使用linux网络IO,并可以随时获得更新
file_get_content是个php函数,嵌套调用其他更多的php函数实现文本获取,涉及网络IO并非这个函数所长,势必在远程请求文件时弱于curl
我觉得大多数http wrapper(也就是处理http://开头的地址的封装代码)自己就是用的curl吧。如果说存在你说的稳定性的问题,那可能是默认的超时时间的设置不一样之类。其他差别不大。
不过如果你想要一些特殊的效果,比如想知道服务器返回的HTTP CODE(比如返回HTTP 404的时候知道出错了),那就必须用CURL了。
file_get_contents其实是一堆内置的文件操作函数的合并版本,比如file_exists,fopen,fread,fclose,专门提供给懒人用的
而且它主要是用来对付本地文件的,但又是因为懒人的原因,同时加入了对网络文件的支持。
curl是专门用来进行网络交互的库,提供了一堆自定义选项,用来应对不同的环境,稳定性自然要大于file_get_contents
以下是它的源代码
PHP_FUNCTION(file_get_contents)
{
char *filename;
int filename_len;
char *contents;
zend_bool use_include_path = 0;
php_stream *stream;
int len;
long offset = -1;
long maxlen = PHP_STREAM_COPY_ALL;
zval *zcontext = NULL;
php_stream_context *context = NULL;
/* Parse arguments */
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|br!ll", &filename, &filename_len, &use_include_path, &zcontext, &offset, &maxlen) == FAILURE) {
return;
}
if (strlen(filename) != filename_len) {
RETURN_FALSE;
}
if (ZEND_NUM_ARGS() == 5 && maxlen < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "length must be greater than or equal to zero");
RETURN_FALSE;
}
context = php_stream_context_from_zval(zcontext, 0);
stream = php_stream_open_wrapper_ex(filename, "rb",
(use_include_path ? USE_PATH : 0) | ENFORCE_SAFE_MODE | REPORT_ERRORS,
NULL, context);
if (!stream) {
RETURN_FALSE;
}
if (offset > 0 && php_stream_seek(stream, offset, SEEK_SET) < 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Failed to seek to position %ld in the stream", offset);
php_stream_close(stream);
RETURN_FALSE;
}
if ((len = php_stream_copy_to_mem(stream, &contents, maxlen, 0)) > 0) {
if (PG(magic_quotes_runtime)) {
contents = php_addslashes(contents, len, &len, 1 TSRMLS_CC); /* 1 = free source string */
}
RETVAL_STRINGL(contents, len, 0);
} else if (len == 0) {
RETVAL_EMPTY_STRING();
} else {
RETVAL_FALSE;
}
php_stream_close(stream);
}