今天分享的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 转载请注明出版。
|