技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> PHP --> dfopen():discuz封装的fsockopen()

dfopen():discuz封装的fsockopen()

浏览:2397次  出处信息
<?php
 
function dfopen($url, $limit = 0, $post = '', $cookie = '', $bysocket = FALSE, $ip = '', $timeout = 15, $block = TRUE) 
{ 
 $return = '';
 $uri = parse_url($url);
 $host = $uri['host'];
 $path = $uri['path'] ? $uri['path'].($uri['query'] ? '?'.$uri['query'] : '') : '/';
 $port = !empty($uri['port']) ? $uri['port'] : 80;
 
 if($post) {
  $out = "POST $path HTTP/1.0\r\n";
  $out .= "Accept: */*\r\n";
  //$out .= "Referer: $boardurl\r\n";
  $out .= "Accept-Language: zh-cn\r\n";
  $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
  $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
  $out .= "Host: $host\r\n";
  $out .= 'Content-Length: '.strlen($post)."\r\n";
  $out .= "Connection: Close\r\n";
  $out .= "Cache-Control: no-cache\r\n";
  $out .= "Cookie: $cookie\r\n\r\n";
  $out .= $post;
 } else {
  $out = "GET $path HTTP/1.0\r\n";
  $out .= "Accept: */*\r\n";
  //$out .= "Referer: $boardurl\r\n";
  $out .= "Accept-Language: zh-cn\r\n";
  $out .= "User-Agent: $_SERVER[HTTP_USER_AGENT]\r\n";
  $out .= "Host: $host\r\n";
  $out .= "Connection: Close\r\n";
  $out .= "Cookie: $cookie\r\n\r\n";
 }
 $fp = @fsockopen(($ip ? $ip : $host), $port, $errno, $errstr, $timeout);
 if(!$fp) {
  return '';//note $errstr : $errno \r\n
 } else {
  //集阻塞/非阻塞模式流,$block==true则应用流模式
  stream_set_blocking($fp, $block);
  //设置流的超时时间
  stream_set_timeout($fp, $timeout);
  @fwrite($fp, $out);
  //从封装协议文件指针中取得报头/元数据
  $status = stream_get_meta_data($fp);
  //timed_out如果在上次调用 fread() 或者 fgets() 中等待数据时流超时了则为 TRUE,下面判断为流没有超时的情况
  if(!$status['timed_out']) 
  {
   while (!feof($fp)) {
    if(($header = @fgets($fp)) && ($header == "\r\n" ||  $header == "\n")) {
     break;
    }
   }
 
   $stop = false;
   
   //如果没有读到文件尾
   while(!feof($fp) && !$stop) {
    //看连接时限是否=0或者大于8192  =》8192  else =》limit  所读字节数
    $data = fread($fp, ($limit == 0 || $limit > 8192 ? 8192 : $limit));
    $return .= $data;
    if($limit) {
     $limit -= strlen($data);
     $stop = $limit <= 0;
    }
   }
  }
  @fclose($fp);
  return $return;
 }
}
$result = dfopen("http://localhost/ret.php",0,"a=3&b=4");
 
var_dump($result);
?>

建议继续学习:

  1. fsockopen 异步处理    (阅读:9089)
  2. MySQL优化 之 Discuz论坛MySQL通用优化    (阅读:6776)
  3. Discuz!7.0横版及子版块图标显示方法    (阅读:5062)
  4. MySQL优化 之 Discuz论坛优化    (阅读:2879)
  5. 门户、论坛、博客、SNS,网站模式的辨析    (阅读:2380)
  6. 解决DISCUZ7.2和ss7.5聚合设置提示论坛路径错误的方法    (阅读:2229)
  7. 解决Google Adsense无法在Discuz论坛上显示的问题    (阅读:2261)
  8. 如何让discuz7 版规支持html代码    (阅读:1689)
  9. 五四陈透过PHP看JAVA系列:fsockopen    (阅读:1619)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1