cURL-用curl请求为什么比直接用file_get_content远程请求文件稳定?

WP主题讨论 WP主题讨论 主题:1013 回复:2239

cURL-用curl请求为什么比直接用file_get_content远程请求文件稳定?

清晨说ぺ晚安 发布于 2016-10-21 字数 135 浏览 1077 回复 6

本人很菜,今天遇到了这一情况,为什么前者比后者稳定的多呢。。直接file_get_content是用的什么方式?curl技术实现上有什么特别之处呢?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(6

清晨说ぺ晚安 2017-10-23 6 楼

curl是php的扩展模块,file_get_contents是php内置函数;前者是专注网络通信,后者最主要就是操作文件的。
速度方面,对于获取某一个静态页面两者速度差不多,并不像网上有些人所说的那么夸张,但是如果获取那种必须需要身份验证(比如模拟登陆)、多个跳转的页面等那两者的速度就会很明显了,
稳定性,file_get_contents稳定性确实不如curl,尤其是在操作远程文件上,虽然你设置了延迟时间,好像这个时间基本不起什么作用,你可以测试一下。

夜无邪 2017-09-24 5 楼

很简单,不需要说那么多话,你编译过CURL就知道了。
CURL编译依赖OPENSSL,Zlib库,其中Zlib还用了汇编,能压缩传输数据,提高传输性能。

晚风撩人 2017-07-25 4 楼

file_get_contents有时会获取同一个文件的历史版本。就是通过用curl来替换解决的。

灵芸 2017-01-09 3 楼

curl是个命令,基于并使用linux网络IO,并可以随时获得更新
file_get_content是个php函数,嵌套调用其他更多的php函数实现文本获取,涉及网络IO并非这个函数所长,势必在远程请求文件时弱于curl

想挽留 2016-11-24 2 楼

我觉得大多数http wrapper(也就是处理http://开头的地址的封装代码)自己就是用的curl吧。如果说存在你说的稳定性的问题,那可能是默认的超时时间的设置不一样之类。其他差别不大。
不过如果你想要一些特殊的效果,比如想知道服务器返回的HTTP CODE(比如返回HTTP 404的时候知道出错了),那就必须用CURL了。

想挽留 2016-11-14 1 楼

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);

}