phpソケット通信例/メモ

```php:exm_socket.php
<?php
//
// Example usage...
//
$server ='127.0.0.1';
$port   ='80';
$uri    ='/cgi-bin/random-cgi';
$content='Your post content...';

$post_results=httpPost($server,$port,$uri,$content);
if (!is_string($post_results)) {
    die('uh oh, something went wrong');
    } else {
    die('Here are your results: '.$post_results);
    }

//
// Post provided content to an http server and optionally
// convert chunk encoded results.  Returns false on errors,
// result of post on success.  This example only handles http,
// not https.
//
functionhttpPost($ip=null,$port=80,$uri=null,$content=null) {
    if (empty($ip))         { returnfalse; }
    if (!is_numeric($port)) { returnfalse; }
    if (empty($uri))        { returnfalse; }
    if (empty($content))    { returnfalse; }
   // generate headers in array.
   $t = array();
   $t[] ='POST '.$uri.' HTTP/1.1';
   $t[] ='Content-Type: text/html';
   $t[] ='Host: '.$ip.':'.$port;
   $t[] ='Content-Length: '.strlen($content);
   $t[] ='Connection: close';
   $t =implode("\r\n",$t) ."\r\n\r\n".$content;
   //
    // Open socket, provide error report vars and timeout of 10
    // seconds.
    //
   $fp= @fsockopen($ip,$port,$errno,$errstr,10);
   // If we don't have a stream resource, abort.
  if (!(get_resource_type($fp) =='stream')) { returnfalse; }
   //
    // Send headers and content.
    //
  if (!fwrite($fp,$t)) {
       fclose($fp);
        returnfalse;
        }
   //
    // Read all of response into $rsp and close the socket.
    //
   $rsp='';
    while(!feof($fp)) {$rsp.=fgets($fp,8192); }
   fclose($fp);
   //
    // Call parseHttpResponse() to return the results.
    //
  returnparseHttpResponse($rsp);
    }

//
// Accepts provided http content, checks for a valid http response,
// unchunks if needed, returns http content without headers on
// success, false on any errors.
//
functionparseHttpResponse($content=null) {
    if (empty($content)) { returnfalse; }
   // split into array, headers and content.
   $hunks=explode("\r\n\r\n",trim($content));
    if (!is_array($hunks) orcount($hunks) <2) {
        returnfalse;
        }
   $header=$hunks[count($hunks) -2];
   $body   =$hunks[count($hunks) -1];
   $headers=explode("\n",$header);
    unset($hunks);
    unset($header);
    if (!verifyHttpResponse($headers)) { returnfalse; }
    if (in_array('Transfer-Coding: chunked',$headers)) {
        returntrim(unchunkHttpResponse($body));
        } else {
        returntrim($body);
        }
    }

//
// Validate http responses by checking header.  Expects array of
// headers as argument.  Returns boolean.
//
functionvalidateHttpResponse($headers=null) {
    if (!is_array($headers) orcount($headers) <1) { returnfalse; }
    switch(trim(strtolower($headers[0]))) {
        case'http/1.0 100 ok':
        case'http/1.0 200 ok':
        case'http/1.1 100 ok':
        case'http/1.1 200 ok':
            returntrue;
        break;
        }
    returnfalse;
    }

//
// Unchunk http content.  Returns unchunked content on success,
// false on any errors...  Borrows from code posted above by
// jbr at ya-right dot com.
//
functionunchunkHttpResponse($str=null) {
    if (!is_string($str) orstrlen($str) <1) { returnfalse; }
   $eol="\r\n";
   $add=strlen($eol);
   $tmp=$str;
   $str='';
    do {
       $tmp=ltrim($tmp);
       $pos=strpos($tmp,$eol);
        if ($pos===false) { returnfalse; }
       $len=hexdec(substr($tmp,0,$pos));
        if (!is_numeric($len) or$len<0) { returnfalse; }
       $str.=substr($tmp, ($pos+$add),$len);
       $tmp =substr($tmp, ($len+$pos+$add));
       $check=trim($tmp);
        } while(!empty($check));
    unset($tmp);
    return$str;
    }

?>
```