php抓取网页连接函数(连接超时(图片下载)函数的超时时间设置短一些)

优采云 发布时间: 2021-11-18 13:13

  php抓取网页连接函数(连接超时(图片下载)函数的超时时间设置短一些)

  最近有个同事在做数据抓取,需要把别人的网站的图片下载到本地。图片链接是从远程服务器的数据库中读取的。他使用的方法是每次从远程数据库中读取某条记录,然后使用双循环下载图片。有可能是代码在执行的时候遇到了问题,就是一些链接失效了,会出现连接超时(图片下载方式是内置readfile函数)。超时也没什么大不了的,顶多是图片还没下载。但结果是:如果有链接超时,那么整个程序就会跑掉,很奇怪。

  我仔细看了一下代码,发现了问题:readfile函数的默认超时时间是1分钟左右,因为这段时间mysql连接一直处于非活动状态,所以连接中断了,他也没有重新连接,所以当 mysql_query 会报错。

  既然知道了原因,问题就可以很好的解决了。从两个方面入手:

  1、设置readfile函数的超时时间更短

  2、mysql_query 判断之前是否有连接,没有则重新连接

  第二个好办,用mysql_ping()就可以了(需要提醒大家:如果连接到远程数据库,最好有连接失败重试,因为一个mysql_connect()不能保证100%连接成功率,您可以使用 Do,同时在连接失败后连接多次)。第一个有点棘手。readfile 函数中似乎没有超时设置。如果把下载文件的方式改成fsockopen,这个功能支持超时设置,但是有点麻烦。我们去网上查了一下,结果还真的找到了。原来 readfile 也支持超时设置。使用第三个参数 $context。这是一个资源类型变量。

  看看代码示例:

  这样readfile函数的超时时间设置为10秒。细心的话,你会发现阵列中还有一些其他的配置。第一维中的http是指定的网络协议,第二维中的方法batch是http请求方法get、post、head等,timeout是超时时间。我想很多人都会使用php内置的file_get_contents函数来下载网页,因为这个函数使用起来很简单。很多人用起来也很简单,只要传递一个链接,它就可以自动发送get请求,下载网页内容。如果情况比较复杂,比如使用POST请求,使用代理下载,定义User-Agent等,很多人会认为这个函数做不到这样的事情,并且会选择其他方法,比如 curl 来实现。其实file_get_contents这些东西也可以做,就是通过它的第三个参数来设置http请求的上下文。

  支持的设置和使用方法见官方说明:

  附:目前我知道的支持上下文参数的php内置函数有

  file_get_contents,file_put_contents,readfile,file,fopen,copy

  (估计支持该类型的功能,待确认)。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线