PHP循环下载多张图片 不超时稳定运行的办法

记录一下,直接粘贴过来,懂得自然懂~

今天分享的PHP开发知识,我在项目中已经应用了,运行很稳定不会出现脚本超时现象。例如我们想要用PHP脚本一次下载多张美女图片,因为网络延迟经常会出现超时的现象。

所以,我们需要换个思路,比如使用循环实现多次单图的下载方法,例如: down.php?i=2,3,4,5 .... 一直到 down.php?i=99 。页面下载成功后自动跳转到下一页。

首先,我们将在下载的图片URL放在缓存之中,方便循环时调用,代码如下:

public function download_init ( $id, $now )

{

  # 使用缓存减少MySQL查询

  $key = "download_init_{$id}";

  $data = cache::get( $key );

  $data = unserialize($data);

  if ( !$data )

  {

    $data = $this->sql(' select `imgs` from `www.tmd86.com`.`photo` where `pid` = ? limit 1; ', $id);

    if ( !$data )

      return false;

    # 该缓存60分钟自动过期

    cache::set( $key, serialize($data), 3600 );

  }

  # $url

  $data['imgs'] = trim($data['imgs']);

  $tmp = explode(PHP_EOL, $data['imgs']);

  $i = $now - 1;

  $url = isset($tmp[$i]) ? $tmp[$i] : '';

  $url = trim($url); // clear space

  $data2['now'] = $now;

  $data2['max'] = $data['num'];

  $data2['url'] = $url;

  unset($data);

  return $data2; 

}

 

通过 download_init() 方法取得相关数据后,我们就可以开始循环了~

指定 $now 和 $max 两个参数,页面链接类似于 down.php?now=5&max=99 ,当 $now > $max 时说明循环结束直接抛出完成提示, $now 递增,中途出现错误时记录或者直接抛出异常结束脚本。以下是PHP代码片断:

case 'download':

  $id = get('id', 1);

  $now = get('now', 1);

  if ( $now <= 0 )

  {

    $url = "photo.php?action=download&id={$id}&now=1";

    echo "<p style='padding-top: 80px; text-align: center'><button οnclick='location.href=\"{$url}\"'>Start Download</button></p>";

    exit();

  }

  $data = $obj->download_init($id, $now);

  if ( !$data )

    exit('object not found');

  $url = $obj->download_content($data['url']); 

  if ( !preg_match('/www.tmd86.com/images/', $url) )

    exit("download_content_error at line {$now} - {$data['url']}");

  # 进入下一行

  $now++;

  if ( $now > $data['max'] )

  {

    exit(' It's OK! ');

  }

  $goto = "photo.php?action=download&id={$id}&now={$now}";

  echo "<script>document.writeln('downloading...<br>{$url} - OK'); window.setTimeout(function(){location.href='{$goto}';}, 500);</script>";

  //template2('photo_download', $data);

  exit();

  break;

 

由于代码是帮人开发的,不方便把所有PHP代码放出来,但思路相信大家还是可以理解的。至于 $obj->download_content($url) 就不多解释了,其实就是 file_get_contnets($url) 。

好了,就写到这里了。

转载于:https://my.oschina.net/4ever/blog/3080808

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值