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

发布于 2016-10-21 06:28:40 字数 81 浏览 1253 评论 6

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

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

评论(6

清晨说ぺ晚安 2017-10-23 22:35:20

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

夜无邪 2017-09-24 20:39:57

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

晚风撩人 2017-07-25 08:41:24

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

灵芸 2017-01-09 04:47:51

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

想挽留 2016-11-24 15:26:12

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

想挽留 2016-11-14 17:31:53

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文