记录一下,直接粘贴过来,懂得自然懂~
今天分享的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) 。
好了,就写到这里了。