分享

PHP循环下载多张图片的技巧,运行稳定不超时

 昵称65365553 2019-07-29

今天分享的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.`.`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 = "http://wwww./photo.php?action=download&id={$id}&now=1";

    echo "<p style='padding-top: 80px; text-align: center'><button onclick='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./images/', $url) )

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

  # 进入下一行

  $now++;

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

  {

    exit(' It's OK! ');

  }

  $goto = "http://wwww./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) 。

好了,今天的分享就到这里了,首发 360doc 转载请注明出版。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约