这两天因为要去实现维基手册中远程图片本地化的功能,想起Dedecms中有这个功能,所以就拿来主义呗。不过在使用过程中,也发现了一些问题,并作了一些改进,希望对大家有用。
我看得是5.3版本的文件,这个类的文件位置在DEDE安装目录/include/dedehttpdown.class.php
类名称为DedeHttpDown
问题一:
创建实例后,使用OpenUrl($url)方法打开文件链接,但是这个方法却是没有返回值的,建议设置返回值。这样遇到死链接时候就可以直接通知程序链接失败,有利于控制。- //打开指定网址
- function OpenUrl($url,$requestType="GET")
- {
- $this->ResetAny();
- $this->JumpCount = 0;
- $this->m_httphead = Array() ;
- $this->m_html = '';
- $this->reTry = 0;
- $this->Close();
-
- //初始化系统
- $this->PrivateInit($url);
- $this->PrivateStartSession($requestType);
- }
复制代码 改为- //打开指定网址
- function OpenUrl($url,$requestType="GET")
- {
- $this->ResetAny();
- $this->JumpCount = 0;
- $this->m_httphead = Array() ;
- $this->m_html = '';
- $this->reTry = 0;
- $this->Close();
-
- //初始化系统
- $this->PrivateInit($url);
- return $this->PrivateStartSession($requestType); //返回是否成功链接的判断
- }
复制代码 问题二:SaveToBin方法未进行超时管理,建议使用stream_set_timeout函数进行超时管理- //用Http协议下载文件
- function SaveToBin($savefilename)
- {
- if(!$this->IsGetOK())
- {
- return false;
- }
- if(@feof($this->m_fp))
- {
- $this->m_error = "连接已经关闭!"; return false;
- }
- $fp = fopen($savefilename,"w");
- while(!feof($this->m_fp))
- {
- fwrite($fp,fread($this->m_fp,1024));
- }
- fclose($this->m_fp);
- fclose($fp);
- return true;
- }
复制代码 改为- function SaveToBin($savefilename)
- {
- if(!$this->IsGetOK()) return false;
- if(@feof($this->m_fp)) { $this->m_error = "连接已经关闭!"; return false; }
- $info=array();
- $fp = fopen($savefilename,"w");
- while(!feof($this->m_fp)){
- stream_set_timeout($this->m_fp, 2);
- stream_set_timeout($fp, 1);
- fwrite($fp,fread($this->m_fp,1024));
- $info_m_fp = stream_get_meta_data($this->m_fp);
- $info_fp = stream_get_meta_data($fp);
- if ($info_m_fp['timed_out']) {
- $this->m_error = "下载数据超时!";
- return false;
- }
- if ($info_fp['timed_out']) {
- $this->m_error = "写入数据超时!";
- return false;
- }
- }
-
- fclose($this->m_fp);
- fclose($fp);
- return true;
- }
复制代码 问题3:printError方法只是用echo输出,而实际工作过程中我们往往需要写入log进行调试
建议也设置返回值,代码改为- function printError()
- {
- $str= "错误信息:".$this->m_error;
- $str.= "<br/>具体返回头:<br/>";
- foreach($this->m_httphead as $k=>$v){ $str.="$k => $v <br/>\r\n"; }
- return $str;
- }
复制代码 注意事项:Mysql链接超时问题。当进行大量的文件远程下载之后,可能时间已经过去很久,这时候mysql_time_out时间已经过去,原来建立的mysql链接这时候已经gone away了。所以有必要在执行完DedeHttpDown类以及相关任务后检查mysql链接是否还在,可以使用mysql_ping()函数检查。比如说在DEDE安装目录/dede/add_article.php的第129行后加入- if (!mysql_ping($dsql->LinkID)){
- $dsql = $db = new DedeSql(false);//还不熟悉dede,所以这里这么写好不好,有待商榷
- }
复制代码 |