Dedecms织梦HttpDown类的问题以及使用中的注意事项

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

使用道具 举报

精彩图文
Copyright;  © 新科学想法 2016-2017   浙公网安备 33010202000686号   ( 浙ICP备09035230号-1 )