PHP Socket 封装类 [ [ Socket.class ] ]

<?php
 
/**
 * 使用PHP Socket 编程模拟Http post和get请求
 * @author koma
 */
 
class Socket{
 
  private $sp = "\r\n"; //这里必须要写成双引号
 
  private $protocol = 'HTTP/1.1';
 
  private $requestLine = "";
 
  private $requestHeader = "";
 
  private $requestBody = "";
 
  private $requestInfo = "";
 
  private $fp = null;
 
  private $urlinfo = null;
 
  private $header = array();
 
  private $body = "";
 
  private $responseInfo = "";
 
  private static $http = null; //Http对象单例

  private $timeout = 0;
 
    
 
  private function __construct() {}
 
    
 
  public static function create() {
 
    if ( self::$http === null ) {
 
      self::$http = new Socket();
 
    }
 
    return self::$http;
 
  }
 
    
 
  public function init($url) {
 
    $this->parseurl($url);
 
    $this->header['Host'] = $this->urlinfo['host'];
 
    return $this;
 
  }
 
    
 
  public function get($header = array()) {
 
    $this->header = array_merge($this->header, $header);
 
    return $this->request('GET');
 
  }
 
    
 
  public function post($header = array(), $body = array()) {
 
    $this->header = array_merge($this->header, $header);
 
    if ( !empty($body) ) {
 
      $this->body = http_build_query($body);
 
      $this->header['Content-Type'] = 'application/x-www-form-urlencoded';
 
      $this->header['Content-Length'] = strlen($this->body);
 
    }
 
    return $this->request('POST');
 
  }
 
    
 
  private function request($method) {
 
    $header = "";
 
    $this->requestLine = $method.' '.$this->urlinfo['path'].'?'.$this->urlinfo['query'].' '.$this->protocol;
 
    foreach ( $this->header as $key => $value ) {
 
      $header .= $header == "" ? $key.':'.$value : $this->sp.$key.':'.$value;
 
    }
 
    $this->requestHeader = $header.$this->sp.$this->sp;
 
    $this->requestInfo = $this->requestLine.$this->sp.$this->requestHeader;
 
    if ( $this->body != "" ) {
 
      $this->requestInfo .= $this->body;
 
    }
 
    /*
     * 注意:这里的fsockopen中的url参数形式为"www.xxx.com"
     * 不能够带"http://"这种
     */
    $scheme = strtolower($this->urlinfo['scheme']);
 
    $port = isset($this->urlinfo['port']) ? (int)$this->urlinfo['port'] : ('https' == $scheme ? 443 : 80);
 
    $this->fp = fsockopen($this->urlinfo['host'], $port, $errno, $errstr);
 
    if ( !$this->fp ) {
 
      echo $errstr.'('.$errno.')';
 
      return false;
 
    }
 
    if ( fwrite($this->fp, $this->requestInfo) ) {
 
      $str = "";
	
	  if ($this->timeout)
	  {
	    stream_set_blocking($this->fp, TRUE); 

	    stream_set_timeout($this->fp, $this->timeout); 

	    $info = stream_get_meta_data($this->fp);
	  }
 
      while ( (!feof($this->fp)) && ($this->timeout ? !$info['timed_out'] : TRUE) ) {
 
        $str .= fread($this->fp, 1024);

		if ($this->timeout)
		{

		    $info = stream_get_meta_data($this->fp); 

	        ob_flush; 

	        flush(); 
		}
 
      }
 
      $this->responseInfo = $str;
 
    }
 
    fclose($this->fp);
 
    return $this->responseInfo;
 
  }
  
  public function bin2str($bin)
  {

      $hex = unpack("H*", $bin);

      $str='';

      for ($i=0; $i < strlen($hex)-1; $i+=2)
      {

          $str .= chr(hexdec($hex[$i].$hex[$i+1]));

      }

      return $str;
  }
    
 
  private function parseurl($url) {
 
    $this->urlinfo = parse_url($url);
 
  }
 
}
 
// $url = "http://news.163.com/14/1102/01/AA0PFA7Q00014AED.html";
 
$url = "http://localhost/httppro/post.php";
 
$http = Socket::create()->init($url);
 
/* 发送get请求
echo $http->get(array(
  'User-Agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36',
));
*/
 
  
 
/* 发送post请求 */
 
echo $http->post(array(
 
    'User-Agent' => 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36',
 
), array('username'=>'发一个中文', 'age'=>22));

--------------------- 
作者:AbleYu 
来源:CSDN 
原文:https://blog.csdn.net/why444216978/article/details/84063402 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值