EEfaq论坛-赚客自留地

 找回密码
 免费注册
查看: 1333|回复: 10

PHP函数file_get_contents的问题

  [复制链接]
发表于 2013-8-7 20:18:01 | 显示全部楼层 |阅读模式
PHP函数file_get_contents的函数如何设置设置网络连接超时?

发表于 2013-8-7 20:55:20 | 显示全部楼层
file_get_contents默认超时时间(秒)
php.ini中的default_socket_timeout设置,默认超时时间是default_socket_timeout = 60

如果要修改超时时间,修改第3个参数即可

$opts = array(
  'http'=>array(
    'method'=>"GET",
    'timeout'=>120,
   )
);

$context = stream_context_create($opts);

$html =file_get_contents('http://www.example.com', false, $context);
回复 支持 反对

使用道具 举报

发表于 2013-8-7 20:57:09 | 显示全部楼层

直接set_time_limit(0);不是更方便吗

点评

两码事.......  发表于 2013-8-7 20:58
回复 支持 反对

使用道具 举报

发表于 2013-8-7 21:23:34 | 显示全部楼层
adver 发表于 2013-8-7 20:57
直接set_time_limit(0);不是更方便吗

set_time_limit是当前页超时设置,与楼主说的没有关联

回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-7 22:19:56 | 显示全部楼层
月光飞燕 发表于 2013-8-7 21:23
set_time_limit是当前页超时设置,与楼主说的没有关联

如果用了default_socket_timeout,请求A页面超时,可以接下去请教B页面吗?不让程序停止。

评分

参与人数 1e币 +1 收起 理由
comcom + 1 我也遇到一样的问题

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2013-8-7 22:56:21 | 显示全部楼层
default_socket_timeout仅仅控制了file_get_contents
如果这个超时,那么当前执行的file_get_contents返回false
程序是继续向下执行的

但是要看你本页的超时时间是否大于file_get_contents的超时
本页的超时时间使用set_time_limit进行设置,你可以设置成很大的值,比如0无限
但是避免长时间执行造成内存溢出,最终导致服务器崩溃,你应该要设置一个
set_time_limit有限的值,比如120,360

让一个php页面无限时运行是非常不好的,你应该使用cronjob间隔调用php页面进行采集
这样会非常稳定,不至于服务器崩溃
回复 支持 反对

使用道具 举报

发表于 2013-8-7 23:03:39 | 显示全部楼层
你是要采集吧
建议不要用file_get_contents,有时候会造成cpu飙升
建议用curl库,不仅高效而且强大,
我一直用curl库
回复 支持 反对

使用道具 举报

发表于 2013-8-8 10:14:07 | 显示全部楼层
用curl比file_get_contents效率要高
回复 支持 反对

使用道具 举报

发表于 2013-8-8 16:26:13 | 显示全部楼层



....我权限不能短消息

我一般采集都是用定时任务方式,比如每分钟采集两条三条,以免频率太高,被封。又可以不间断运行。
你如果想通过设置set_time_limit来延长php运行时间,是不现实的。比如我vps,我用crontab设置采集程序一分钟运行一次,第运行一次可以采集两三条,一天也能采集好几千条了

网络连接错误,获取内容为空,那就重试,你也可以让它采集下一条网址,跳过当前网址,做个判断就可以了啊


评分

参与人数 2e币 +4 收起 理由
frankwng1985 + 1 只能给你加这么多了
月光飞燕 + 3

查看全部评分

回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-14 15:35:45 | 显示全部楼层
mulao 发表于 2013-8-8 16:26
....我权限不能短消息

我一般采集都是用定时任务方式,比如每分钟采集两条三条,以免频率太高,被封。 ...

如果下个1分钟调用的时候程序还在运行,怎么处理?系统会自动处理?

回复 支持 反对

使用道具 举报

发表于 2013-8-16 22:39:41 | 显示全部楼层
frankwng1985 发表于 2013-8-14 15:35
如果下个1分钟调用的时候程序还在运行,怎么处理?系统会自动处理?

这个应该不会吧,curl库采集一页网址的内容,10s绝对绰绰有余,一分钟采集两次肯定没问题

之前用curl做过小偷程序,curl库的效率很高,负载要远低于file_get_contents,不会出现file_get_contents等待时间过长而造成cpu飙升情况。有一次我的小偷程序上1w的IP,vps负载都不过0.2,当然了,我也是做了缓存的

好吧,万一碰上比较极端的情况,上一分钟的进程时间拖得确实比较长,到了新的一分钟,旧的进程继续执行他的,新的进程有自动开始,http进程也才两个而已,两个进程不相互影响,系统负载也不高,能够轻松应付。
但是如果这种极端情况不停的累加,那就是主机本身的问题了

ps,平常不上QQ的……




回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

QQ|联系我们|Archiver|手机版|小黑屋|EEfaq论坛

GMT+8, 2024-4-30 23:18

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表