Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
PHP: fsockopen - Manual
[go: Go Back, main page]

PHP
downloads | documentation | faq | getting help | mailing lists | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

gethostbyaddr" width="11" height="7"/> <dns_get_record
Last updated: Thu, 03 May 2007

view this page in

fsockopen

(PHP 4, PHP 5)

fsockopen — インターネットもしくはUNIXドメインのソケット接続をオープンする

説明

resource fsockopen ( string $target [, int $port [, int &$errno [, string &$errstr [, float $timeout]]]] )

targetに指定されたリソースへのソケット接続を初期化します。 PHPは付録 P. サポートされるソケットトランスポートのリストに記述されているように Internetドメインまたは Unixドメインの中のターゲットをサポートします。 サポートされるトランスポートのリストは、stream_get_transports() を使って取得することもできます。

注意: ソケット経由でデータを読み書きする際のタイムアウトを設定する必要がある場合、 fsockopen()timeout パラメータは、 ソケットに接続する間にだけ適用されるため、 socket_set_timeout()を使用してください。

PHP 4.3.0以降、OpenSSLサポートを有効にしてコンパイルした場合、 hostnameの前に'ssl://' または 'tls://' を付加することにより、TCP/IP経由でリモートホストに 接続する際にSSLまたはTLSクライアント接続を使用することができます。

fsockopen()は、ファイルポインタを返します。 このファイルポインタは、 (fgets(),fgetss(), fputs(), fclose(), feof()のような) 他のファイル関数で使用可能です。

コールに失敗した場合にはFALSEが返され、オプションの引数 errnoおよびerrstr が指定されている場合、システムコールconnect() で生じた実際のシステムレベルエラーを示すように設定されます。 errno0なのに関数が FALSEを返す場合、connect() をコールする前にエラーを発生したことを示します。 この場合、おそらくはソケットの初期化に原因があります。引数 errno および errstr は常に参照渡しであることに注意してください。

環境によってはUNIXドメインまたはオプションの接続タイムアウトは利用 できません。

ソケットはデフォルトでブロックモードで開かれます。 socket_set_blocking()を使用して、 非ブロックモードに切換えることができます。

例 1535. fsockopen()の例

<?php
$fp
= fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!
$fp) {
    echo
"$errstr ($errno)<br />\n";
} else {
   
$out = "GET / HTTP/1.1\r\n";
   
$out .= "Host: www.example.com\r\n";
   
$out .= "Connection: Close\r\n\r\n";

   
fwrite($fp, $out);
    while (!
feof($fp)) {
        echo
fgets($fp, 128);
    }
   
fclose($fp);
}
?>

以下の例は、自分のマシンのUDPサービス "daytime" (ポート13)から日 付と時間を取得する方法を示すものです。

例 1536. UDP接続の使用法

<?php
$fp
= fsockopen("udp://127.0.0.1", 13, $errno, $errstr);
if (!
$fp) {
    echo
"ERROR: $errno - $errstr<br />\n";
} else {
   
fwrite($fp, "\n");
    echo
fread($fp, 26);
   
fclose($fp);
}
?>

警告

UDPソケットは、リモートホストとの接続が確立されていない場合でも、 エラーを発生せずにオープンされたように見えることが時々あります。 このエラーは、そのソケットでデータを読み書きした際にのみ明らかに なります。この原因は、UDPが"コネクションレス"のプロトコルであり、 実際にデータを送受信する必要が生じるまで、オペレーションシステムが ソケット用のリンクを確立しようとしないためです。

注意: timeout は PHP 3.0.9 でサポートされまし た。また、UDP のサポートは PHP 4で追加されました。

pfsockopen(), socket_set_blocking(), socket_set_timeout(), fgets(), fgetss(), fputs(), fclose(), feof(), Curl拡張モジュール も参照ください。



add a note add a note User Contributed Notes
fsockopen
bigpojo at gmail dot com
18-May-2007 01:55
This works from a Windows machine.  I have yet to try it from a *nix box. 
<?php
function print_job($job_data,$ip) {
   
    @
$ps = fsockopen($ip,9100,$errno,$errstr,3);

    if(
$ps) {
       
fwrite($ps,$job_data);
       
fclose($ps);
    }
    else {
        echo(
"$errstr ($errno)\n");
    }
}
/*Usage
$print_string = "This is line 1.\r\nThis is line 2.\r\nThis should be line 3.\r\n";
$ip_printer = "192.168.X.X";
print_job($print_string,$ip_printer);
*/
?>
martjean77 at hot dot sapm dot mail dot com
16-May-2007 11:44
Just a correction

The function decode_jbr at ya-right dot com work nice for me (thanks), but is missing a last case, for when the response is not chunked (because it's too short for exemple), here a corrected function :

function decode_body ( $info, $str, $eol = "\r\n" )
{
  $tmp = $str;
  $add = strlen ( $eol );
  $str = '';
  if ( isset ( $info['transfer-encoding'] ) && $info['transfer-encoding'] == 'chunked' )
  {
    do
    {
      $tmp = ltrim ( $tmp );
      $pos = strpos ( $tmp, $eol );
      $len = hexdec ( substr ( $tmp, 0, $pos ) );
      if ( isset ( $info['content-encoding'] ) )
      {
        $str .= gzinflate ( substr ( $tmp, ( $pos + $add + 10 ), $len ) );
      }
      else
      {
        $str .= substr ( $tmp, ( $pos + $add ), $len );
      }
     
      $tmp = substr ( $tmp, ( $len + $pos + $add ) );
      $check = trim ( $tmp );
    }
    while ( ! empty ( $check ) );
  }
  else if ( isset ( $info['content-encoding'] ) )
  {
    $str = gzinflate ( substr ( $tmp, 10 ) );
  }
  else {
    $str = $tmp;
  }
  return $str;
}
03-Mar-2007 12:01
HTTP/1.1 requires that all clients support chunked transfer encoding. If you don't want to implement that and just want something simple, make HTTP/1.0 requests instead:

<?php
...
fputs("GET $path HTTP/1.0\r\n");
fputs("Host: $host\r\n");
...
etc..
?>
jbr at ya-right dot com
02-Mar-2007 01:17
Handling chunked data needs careful handling, because the data can also be compressed inside the chunked data, and chunked data can have many parts, so you need to watch for that. Here a simple example that uses one function decode_header(); to build the header into a key => value array, so it makes it easy to test for the content and transfer types inside the decode_body(); function!

<?php

function decode_header ( $str )
{
   
$part = preg_split ( "/\r?\n/", $str, -1, PREG_SPLIT_NO_EMPTY );

   
$out = array ();

    for (
$h = 0; $h < sizeof ( $part ); $h++ )
    {
        if (
$h != 0 )
        {
           
$pos = strpos ( $part[$h], ':' );

           
$k = strtolower ( str_replace ( ' ', '', substr ( $part[$h], 0, $pos ) ) );

           
$v = trim ( substr ( $part[$h], ( $pos + 1 ) ) );
        }
        else
        {
           
$k = 'status';

           
$v = explode ( ' ', $part[$h] );

           
$v = $v[1];
        }

        if (
$k == 'set-cookie' )
        {
               
$out['cookies'][] = $v;
        }
        else if (
$k == 'content-type' )
        {
            if ( (
$cs = strpos ( $v, ';' ) ) !== false )
            {
               
$out[$k] = substr ( $v, 0, $cs );
            }
            else
            {
               
$out[$k] = $v;
            }
        }
        else
        {
           
$out[$k] = $v;
        }
    }

    return
$out;
}

function
decode_body ( $info, $str, $eol = "\r\n" )
{
   
$tmp = $str;

   
$add = strlen ( $eol );

   
$str = '';

    if ( isset (
$info['transfer-encoding'] ) && $info['transfer-encoding'] == 'chunked' )
    {
        do
        {
           
$tmp = ltrim ( $tmp );

           
$pos = strpos ( $tmp, $eol );

           
$len = hexdec ( substr ( $tmp, 0, $pos ) );

            if ( isset (
$info['content-encoding'] ) )
            {
               
$str .= gzinflate ( substr ( $tmp, ( $pos + $add + 10 ), $len ) );
            }
            else
            {
               
$str .= substr ( $tmp, ( $pos + $add ), $len );
            }

           
$tmp = substr ( $tmp, ( $len + $pos + $add ) );

           
$check = trim ( $tmp );

        } while ( ! empty (
$check ) );
    }
    else if ( isset (
$info['content-encoding'] ) )
    {
       
$str = gzinflate ( substr ( $tmp, 10 ) );
    }

    return
$str;
}

if ( (
$io = fsockopen( "www.yahoo.com", 80, $errno, $errstr, 5 ) ) !== false )
{
   
$send  = "GET / HTTP/1.1\r\n";
   
$send .= "Host: www.yahoo.com\r\n";
   
$send .= "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021204\r\n";
   
$send .= "Referer: http://www.yahoo.com/\r\n";
   
$send .= "Accept: text/xml,application/xml,application/xhtml+xml,";
   
$send .= "text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,";
   
$send .= "image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n";
   
$send .= "Accept-Language: en-us, en;q=0.50\r\n";
   
$send .= "Accept-Encoding: gzip, deflate, compress;q=0.9\r\n";
   
$send .= "Connection: Close\r\n\r\n";

   
fputs ( $io, $send );

   
$send = '';

    do
    {
       
$send .= fgets ( $io, 4096 );

    } while (
strpos ( $send, "\r\n\r\n" ) === false );

   
$info = decode_header ( $send );

   
$send = '';

    while ( !
feof ( $io ) )
    {
       
$send .= fread ( $io, 8192 );
    }

   
fclose ( $io );

   
$send = decode_body ( $info, $send );

    echo
'<h3>Header Array</h3>';
    echo
'<pre>';
   
print_r ( $info );
    echo
'</pre>';
    echo
'<h3>Document Body</h3>';
    echo
$send;

}

?>
ryan1_00 at hotmail dot com
30-Jan-2007 12:52
Sorry for multiple submission of this but Added @ to suppress errors and a few exmples:

Also note that this script checks specific ports so you need to have the correct port open on the server for this to work.

E.g if i have a windows domain controller and it is servering LDAP then the following would be used to check it is online:

chkServer("MyDC", "389");

for a webserver
chkServer("MyWebSvr", "80");

etc etc
--------------------------------------------------------

// check if a server is up by connecting to a port
function chkServer($host, $port)
{  
    $hostip = @gethostbyname($host); // resloves IP from Hostname returns hostname on failure
   
    if ($hostip == $host) // if the IP is not resloved
    {
        echo "Server is down or does not exist";
    }
    else
    {
        if (!$x = @fsockopen($hostip, $port, $errno, $errstr, 5)) // attempt to connect
        {
            echo "Server is down";
        }
        else
        {
            echo "Server is up";
            if ($x)
            {
                @fclose($x); //close connection (i dont know if this is needed or not).
            }
        } 
    }
}
ryan1_00 at hotmail dot com
30-Jan-2007 12:44
Function to "ping" a server.

// check if a server is up by connecting to a port
function chkServer($host, $port)
{  
    $hostip = gethostbyname($host); // resloves IP from Hostname returns hostname on failure
   
    if ($hostip == $host) // if the IP is not resloved
    {
        echo "Server is down or does not exist";
    }
    else
    {
        if (!$x = fsockopen($hostip, $port, $errno, $errstr, 5)) // attempt to connect
        {
            echo "Server is down";
        }
        else
        {
            echo "Server is up";
            if ($x)
            {
                fclose($x); //close connection (i dont know if this is needed or not).
            }
        } 
    }
}
v13+phpnet at it dot teithe dot gr
25-Jan-2007 08:01
The following function performs pop3 authentication. Returns NULL on error, or true/false to indicate username/password matching:

$address is the hostname of the server and $ssl is a boolean that indicates whether an SSL connection is requested.

<?php
function pop3authCheck($username, $password, $address, $ssl)
{
    if (
$ssl)
       
$uri="ssl://$address:995";
    else
       
$uri="tcp://$address:110";

   
$fp=fsockopen($uri);

    if (!
$fp)
        return(
NULL);

   
$st=fgets($fp, 512);
    if (
substr($st, 0, 3)!="+OK")
    {
       
fclose($fp);
        return(
NULL);
    }

   
$st="USER $username\n";
    if (
fwrite($fp, $st)!=strlen($st))
    {
       
fclose($fp);
        return(
NULL);
    }

   
$st=fgets($fp, 512);
    if (
substr($st, 0, 3)!="+OK")
    {
       
fclose($fp);
        return(
NULL);
    }

   
$st="PASS $password\n";
    if (
fwrite($fp, $st)!=strlen($st))
    {
       
fclose($fp);
        return(
NULL);
    }

   
$st=fgets($fp, 512);
   
fclose($fp);
    if (
substr($st, 0, 3)=="+OK")
        return(
true);
    else if (
substr($st, 0, 4)=="+ERR")
        return(
false);
    else
        return(
NULL);
}
?>
Protractor
18-Jan-2007 03:54
The documentation fails to note that 'float timeout' is defined in seconds.
jk at ricochetsolutions dot com
20-Dec-2006 12:20
here is my contribution for parsing chunked data.

please note: this function simply handles the RESPONSE, not the HEADERS, it would be your job to check the headers for 'Transfer-Encoding: chunked' field:

<?php
function parseChunked($response) {

 
$do = true;
 
$return = "";
 
$size = NULL;

  while(
$do) {

   
// suppress warnings w/ @ if offset not in string (past end)
   
$pos = @strpos($response, "\r\n", 0);

    if(!(
$pos === false) && $size === NULL) {

     
// we found CRLF, get len from hex
     
$size = hexdec(substr($response, 0, $pos));
               
     
// get the actual chunk-len, reset $response, $size
     
$return .= substr($response, $pos+2, $size);
     
$response = substr($response, ($pos+2) + $size);
     
$size = NULL;
    }
    else {
     
$do = false;
    }
// end if/else

 
} // end while

 
return $return;
}
// end function parseChunked()
?>

Any recomendations or improvements please post
05-Dec-2006 01:34
I've had issues with some of the handlers for chunked http 1.1 responses.  Here's a method that worked for me, if it works for you as well, then cheers :P

<?php

   
function httpSocketConnection($host, $method, $path, $data)
    {
       
$method = strtoupper($method);       
       
        if (
$method == "GET")
        {
           
$path.= '?'.$data;
        }   
       
       
$filePointer = fsockopen($host, 80, $errorNumber, $errorString);
       
        if (!
$filePointer)
        {
           
logEvent('debug', 'Failed opening http socket connection: '.$errorString.' ('.$errorNumber.')<br/>\n');
            return
false;
        }

       
$requestHeader = $method." ".$path."  HTTP/1.1\r\n";
       
$requestHeader.= "Host: ".$host."\r\n";
       
$requestHeader.= "User-Agent:      Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1) Gecko/20061010 Firefox/2.0\r\n";
       
$requestHeader.= "Content-Type: application/x-www-form-urlencoded\r\n";

        if (
$method == "POST")
        {
           
$requestHeader.= "Content-Length: ".strlen($data)."\r\n";
        }
       
       
$requestHeader.= "Connection: close\r\n\r\n";
       
        if (
$method == "POST")
        {
           
$requestHeader.= $data;
        }           

       
fwrite($filePointer, $requestHeader);
       
       
$responseHeader = '';
       
$responseContent = '';

        do
        {
           
$responseHeader.= fread($filePointer, 1);
        }
        while (!
preg_match('/\\r\\n\\r\\n$/', $responseHeader));
       
       
        if (!
strstr($responseHeader, "Transfer-Encoding: chunked"))
        {
            while (!
feof($filePointer))
            {
               
$responseContent.= fgets($filePointer, 128);
            }
        }
        else
        {

            while (
$chunk_length = hexdec(fgets($filePointer)))
            {
               
$responseContentChunk = '';
           
               
logEventToTextFile('debug', $chunk_length);
               
$read_length = 0;
               
                while (
$read_length < $chunk_length)
                {
                   
$responseContentChunk .= fread($filePointer, $chunk_length - $read_length);
                   
$read_length = strlen($responseContentChunk);
                }

               
$responseContent.= $responseContentChunk;
               
               
fgets($filePointer);
               
            }
           
        }

       
logEventToTextFile('debug', $responseContent);
       
       
        return
chop($responseContent);
    }

?>
chrisrulesall at gmail dot com
30-Nov-2006 09:20
I found that if i typed a full url like so: fsockopen('http://www.example.com'), fsockopen would return false, with errstr 'Success' and errno '0'. i had to use it like so fsockopen('www.example.com')
without the http://
jasoncernivsky at gmail dot com
30-Oct-2006 04:13
For IPN I recommend to customize a nice framework called LibePal. It has been very handy here. We currently base more than 10 customer sites with the same tool. It works by CURL I think.
john at realtourvision dot com
15-Aug-2006 10:17
when requesting remote filesize via a socket in PHP5, do NOT use the IP address, use the domain name instead.
albertohf at hotmail dot com
04-Aug-2006 01:01
I had a problem receving a "Content-Transfer: chunked" response i tried some prior codes but i had some problems too and i decided to code my own (it post something and receive the response although it's chunked). I hope you enjoy...

    function doPost($uri,$postdata,$host){
        $da = fsockopen($host, 80, $errno, $errstr);
        if (!$da) {
            echo "$errstr ($errno)<br/>\n";
            echo $da;
        }
        else {
            $salida ="POST $uri  HTTP/1.1\r\n";
            $salida.="Host: $host\r\n";
            $salida.="User-Agent: PHP Script\r\n";
            $salida.="Content-Type: application/x-www-form-urlencoded\r\n";
            $salida.="Content-Length: ".strlen($postdata)."\r\n";
            $salida.="Connection: close\r\n\r\n";
            $salida.=$postdata;
            fwrite($da, $salida);
                     while (!feof($da))
                $response.=fgets($da, 128);
            $response=split("\r\n\r\n",$response);
            $header=$response[0];
            $responsecontent=$response[1];
            if(!(strpos($header,"Transfer-Encoding: chunked")===false)){
                $aux=split("\r\n",$responsecontent);
                for($i=0;$i<count($aux);$i++)
                    if($i==0 || ($i%2==0))
                        $aux[$i]="";
                $responsecontent=implode("",$aux);
            }//if
            return chop($responsecontent);
        }//else
    }//function-doPost
tylernt at bigfoot dot com
19-Jul-2006 03:57
If you are composing your own HTTP POST to upload to a form or upload a file, you need to realize that when you *use* your boundary to separate the parts, you need to prepend two dashes (--) to whatever you *defined* your boundary as. For example, if you define your boundary as --1234, then you need to send ----1234 as your boundaries.

If you forget to prepend those two dashes, it is particularly frustrating because the server will return a 200 OK / accepted code, but your receiving form will not recieve any POSTed data.

I only wasted a day and a half on that one.
bimal dot das at maxartists dot com
08-Jun-2006 03:22
Here is how to POST a form action to a SSL server's cgi and retrieve output with pfsockopen

<?php

$host
= gethostbyaddr($_SERVER['REMOTE_ADDR']);

# working vars
$host = 'www.example.com';
$service_uri = '/cgi-bin/processACT';
$vars ='code=22&act=TEST';

# compose HTTP request header
$header = "Host: $host\r\n";
$header .= "User-Agent: PHP Script\r\n";
$header .= "Content-Type: application/x-www-form-urlencoded\r\n";
$header .= "Content-Length: ".strlen($vars)."\r\n";
$header .= "Connection: close\r\n\r\n";

$fp = pfsockopen("ssl://".$host, 443, $errno, $errstr);
if (!
$fp) {
   echo
"$errstr ($errno)<br/>\n";
   echo
$fp;
} else {
   
fputs($fp, "POST $service_uri  HTTP/1.1\r\n");
   
fputs($fp, $header.$vars);
   
fwrite($fp, $out);
    while (!
feof($fp)) {
        echo
fgets($fp, 128);
    }
   
fclose($fp);
}

?>
31-May-2006 02:42
For everyone complaining about wasting their time because the socket remained open when using HTTP 1.1

Why don't you try and read the RFC for HTTP before you start trying to implement a simple HTTP client?

http://www.w3.org/Protocols/rfc2616/rfc2616.html
dmitry dot polushkin at gmail dot com
22-May-2006 09:45
If you want to GET/POST some page through the HTTP protocol and if you want to keep-alive your connection, you may have a problem with a loop-stuck. Here is hint how to solve it:
<?php
$fp
= fsockopen ("www.php.net", 80, $errno, $errstr, 30);
if(!
$fp) {
    echo
$errstr;
} else {
   
fwrite($fp, "GET / HTTP/1.1\r\nHost: www.php.net\r\nConnection: Keep-Alive\r\n\r\n");
   
$data = '';
    while(!
feof($fp)) {
       
$data .= fread($fp, 4096);
        if(
substr($data, -9)=="\r\n\r\n0\r\n\r\n") {
            exit;
        }
    }
}
echo
$data;
?>
leibwaechter at web dot de
05-May-2006 07:15
If you want to connect to a SSL server by HTTPS, you have to write
fsockopen('ssl://www.example.com', 443, $errno, $errstr, 30);
instead of
fsockopen('www.example.com', 443, $errno, $errstr, 30);

If have needed days to find that out.
yourpicture at hotpop dot com
05-May-2006 03:30
When your connection times out the server may issue Fatal error: Maximum execution time of 30 seconds exceeded in ...
To get around this try this method used with error handling and copied method for ping operation.

<?php
   
function Ping(){
       
// false proxy used to generate connection error
       
$ProxyServer = "116.155.95.163";
       
$ProxyPort = 8080;
       
$timeout=10;
        echo
"Opening ProxyServer $ProxyServer<br>";
       
// must use next two statements
       
Set_Time_Limit(0);  //Time for script to run .. not sure how it works with 0 but you need it
       
Ignore_User_Abort(True); //this will force the script running at the end
       
       
$handle = fsockopen($ProxyServer, $ProxyPort,$errno,$errstr,$timeout);       
        if (!
$handle){
            echo
"Failed to open ProxyServer $ProxyServer errno=$errno,errstr=$errstr<br>";
            return
0;
        }
        else {
           
// copied method for PING like time operation
           
$status = socket_get_status($handle);
            echo
"Opened ProxyServer $ProxyServer<br>";
           
           
//Time the responce
           
list($usec, $sec) = explode(" ", microtime(true));
           
$start=(float)$usec + (float)$sec;
           
           
           
$timeout=120;
           
stream_set_timeout($handle,$timeout);     
           
//send somthing
           
ini_set('display_errors','0');
           
$write=fwrite($handle,"echo this\n");
            if(!
$write){
                return
0;
            }
           
            echo
"Try To Read<br>";
           
stream_set_blocking($handle,0);  
           
//Try to read. the server will most likely respond with a "ICMP Destination Unreachable" and end the read. But that is a responce!
           
fread($handle,1024);
           
fclose($handle);
            echo
"Read<br>";
           
ini_set('display_errors','1');
                 
           
//Work out if we got a responce and time it          
           
list($usec, $sec) = explode(" ", microtime(true));
           
$laptime=((float)$usec + (float)$sec)-$start;
            if(
$laptime>$timeout)
                return
0;
           
//else  
            //    $laptime = round($laptime,3);
           
return $laptime;
        }
    }

   
// must use ErrorHandler to avoid php error being printed to screen
   
function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
    {
      
// you can set this to what ever you like.
      
echo "In Error Handler<br>";
       return
0;
    }

   
$old_error_handler = set_error_handler("userErrorHandler");

   
$time = Ping();
    echo
"Time=$time<br>";
    echo
"Done Checking<br>";
?>

Response Will be:
Opening ProxyServer 116.155.95.163
In Error Handler
Failed to open ProxyServer 116.155.95.163 errno=10060,errstr=A connection attempt failed
because the connected party did not properly respond after a period of time, or
established connection failed because connected host has failed to respond.
Time=0
Done Checking

Thanks to everyone for your source code examples.
AndE
yadiutama_skom at yahoo dot com
07-Apr-2006 06:09
This is a simple example for sending and retrieve SOAP message by using fsockopen:

<?php
$fp
= @fsockopen("www.example.com", 80, $errno, $errstr);
if (!
$fp) {
    echo
"$errstr ($errno)<br />\n";
} else {

$soap_out  = "POST /example/exampleServer.php HTTP/1.0\r\n";
$soap_out .= "Host: www.example.com\r\n";
$soap_out .= "User-Agent: MySOAPisOKGuys \r\n";
$soap_out .= "Content-Type: text/xml; charset=ISO-8859-1\r\n";
$soap_out .= "Content-Length: 512\r\n\r\n";
$soap_out .= '<?xml version="1.0" encoding="ISO-8859-1"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body>
<ns5973:contact xmlns:ns5973="http://tempuri.org">
<__numeric_0><id  xsi:nil="true"/></__numeric_0>
</ns5973:contact>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>'
;

   
fputs($fp, $soap_out, strlen($soap_out));  // send request SOAP

   
echo "<xmp>".$out."</xmp>";

    while (!
feof($fp)) {
       
$soap_in . = fgets($fp, 100);
    }

    echo
"<xmp>$soap_in</xmp>";   //display response SOAP

   
fclose($fp);
}
?>

And this is an example result:

POST /soap/example/contactServer.php HTTP/1.0
Host: www.example.com
User-Agent: MySOAPisOKGuys
Content-Type: text/xml; charset=ISO-8859-1
Content-Length: 512
<?xml version="1.0" encoding="ISO-8859-1"?>
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body><ns5973:contact
xmlns:ns5973="http://tempuri.org"><__numeric_0><id
xsi:nil="true"/></__numeric_0></ns5973:contact>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

HTTP/1.1 200 OK
Date: Thu, 06 Apr 2006 07:03:26 GMT
Server: Apache/1.3.23 (Win32)
X-Powered-By: PHP/4.1.1
X-SOAP-Server: MySOAPisOKGuys
Content-Length: 625
Connection: close
Content-Type: text/xml; charset=ISO-8859-1
<?xml version="1.0" encoding="ISO-8859-1"?>
<SOAP-ENV:Envelope
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
<SOAP-ENV:Body><ns1:contactResponse
xmlns:ns1="http://tempuri.org">
<return xsi:type="xsd:string">
</return>
</ns1:contactResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Duukkis
27-Feb-2006 10:13
Lots of tries and lots of reading http-headers...

If you want to post $_POST vars and (in this case) one file named userfile to $remote_server and $remote_url.

<?php
       
// get the necessary data
       
$file_name = $_FILES['userfile']['name'];     // the file
       
$tmp_name = $_FILES['userfile']['tmp_name'];     // the file
       
$content_type = $_FILES['userfile']['type'];     // the file mime type
       
       
srand((double)microtime()*1000000);
       
$boundary = "---------------------".substr(md5(rand(0,32000)),0,10);
       
       
// Build the header
       
$header = "POST $remote_url HTTP/1.0\r\n";
       
$header .= "Host: $remote_server\r\n";
       
$header .= "Content-type: multipart/form-data, boundary=$boundary\r\n";
       
// attach post vars
       
foreach($_POST AS $index => $value){
           
$data .="--$boundary\r\n";
           
$data .= "Content-Disposition: form-data; name=\"".$index."\"\r\n";
           
$data .= "\r\n".$value."\r\n";
           
$data .="--$boundary\r\n";
        }
       
// and attach the file
       
$data .= "--$boundary\r\n";
       
$content_file = join("", file($tmp_name));
       
$data .="Content-Disposition: form-data; name=\"userfile\"; filename=\"$file_name\"\r\n";
       
$data .= "Content-Type: $content_type\r\n\r\n";
       
$data .= "".$content_file."\r\n";
       
$data .="--$boundary--\r\n";
       
$header .= "Content-length: " . strlen($data) . "\r\n\r\n";
                
// Open the connection
       
$fp = fsockopen($remote_server, 80);
       
// then just
       
fputs($fp, $header.$data);
       
fclose($fp);
?>
18-Feb-2006 05:49
Dante
28-Dec-2005 06:42
If you're using code like the manual's example, it is a good idea to keep using HTTP/1.0 instead of changing it to HTTP/1.1. Using HTTP/1.1 with fsockopen sometimes results in junk before and after the body content (but not in the headers).

This is not actually true, if you are using HTTP/1.1, you will most likely be receiving chunked data. The 'junk' that you are seeing is probably the size of the chunks in hex.
ittasks at gmail dot com
16-Feb-2006 09:02
login to the site prior to downloading page:

In some wierd situations site security is based on
 ASPSESSION ID and where could be a
 login asp  script in one place, and the actual page with
information in another place.

for such cases you have to submit ( POST ) you login and
password first, when grab ASP session (and also some
cookies from response, and when use that ASP SESSION in
second request to the actual page: (i took some parts of
codes from other ppl)
<?php
//submit login form: (url, post data, extra headers (optional))
//do not put  http into URL, just domain name
$mycookies = GetCookies("www.yourdomain.com/login.login.asp",
"password=12345&username=your_username&submit=LOGIN&set=Y","");
//some extra params if you need them
// echo "Cookies:<br><pre>\n".$mycookies."\n</pre>";
//$body =PostPage("www.yourdomain.com/coolpage.asp",
//"action=zzz",$mycookies);
//echo "<br>Body:<br>\n".$body."\n";
//im using get page - so it goes like this:
$opts = array('http'=>array('method'=>"GET",
'header'=>"Accept-language: en\r\nCookie: ".$mycookies."\r\n" ));
$context = stream_context_create($opts);
$fp = fopen('http://www.yourdomain.com/coolpage.asp?p1=1&p2=23', 'r', false, $context);
fpassthru($fp);
$html = fread($fp, 1000000);
fclose($fp);
echo
$html;

function
PostPage($host,$query,$others=''){
  
$path=explode('/',$host);
  
$host=$path[0];
   unset(
$path[0]);
  
$path='/'.(implode('/',$path));
$post="POST $path HTTP/1.1\r\nHost: $host\r\n";
$post.="Content-type: application/x-www-form-";
$post.="urlencoded\r\n${others}";
$post.="User-Agent: Mozilla 4.0\r\nContent-length: ";
$post.=strlen($query)."\r\nConnection: close\r\n\r\n$query";
  
$h=fsockopen($host,80);
  
fwrite($h,$post);
   for(
$a=0,$r='';!$a;){
      
$b=fread($h,8192);
      
$r.=$b;
      
$a=(($b=='')?1:0);
   }
  
fclose($h);
   return
$r;
}
function
GetCookies($host,$query,$others=''){
  
$path=explode('/',$host);
  
$host=$path[0];
   unset(
$path[0]);
  
$crlf = "\r\n";
  
$path='/'.(implode('/',$path));
  
$post="POST $path HTTP/1.1\r\nHost: $host\r\n";
$post.="Content-type: application/x-www-form-urlencoded\r\n${others}";
$post.="User-Agent: Mozilla 4.0\r\nContent-length: ";
$post.=strlen($query)."\r\nConnection: close\r\n\r\n$query";
  
$h=fsockopen($host,80);
  
fwrite($h,$post);
  
$r="";
   for(
$a=0;!$a;){
      
$b=fread($h,512);
       echo
$b;
      
$r.=$b;
      
$gotSession=strpos($r,"ASPSESSION");
   if(
$gotSession)
      if(
strpos($r, $crlf . $crlf,$gotSession)>0) break;
      
$a=(($b=='')?1:0);
   }
  
fclose($h);
  
$arr = split("Set-Cookie:",$r);
  
$AllCookies="";$count=1;
   while (
$count < count($arr)) {
$AllCookies.=substr($arr[$count].";",
0,strpos($arr[$count].";",";")+1);

 
$count++;}
   return
$AllCookies;

}
 
?>

It's not optimized , but i hope someone might find it usefull.
Best Regards
DRY_GIN
na8ur
16-Jan-2006 09:41
if you send some header information to any server eg. sending cookie data, don't forget to have \r\n\r\n (double new line) at the end of your header data.
davem
06-Jan-2006 02:25
For data returned as "chunked" you cannot simply loop through the file with fgets and return a correct response.

This function has worked for me, any improvements welcome:

//parse response text out of chunked response
function ParseChunked($response)
{
    $response = explode("\r\n",$response);
    for($i=0; $i<count($response); $i++)
        if(hexdec($response[$i])==strlen($response[$i+1]))
          $return.=$response[++$i];
    return $return;
}
Dante
28-Dec-2005 05:42
If you're using code like the manual's example, it is a good idea to keep using HTTP/1.0 instead of changing it to HTTP/1.1. Using HTTP/1.1 with fsockopen sometimes results in junk before and after the body content (but not in the headers).
SysCo/al - developer [at] sysco[dot] ch
24-Dec-2005 10:41
We have implemented a Syslog class in PHP following the RFC 3164 rules. Using this class, it is possible to send syslog messages to external servers.
We use this class for example to log information, to synchronize some processes or to launch external "threads".

Class abstract, full class implementation can be found at http://developer.sysco.ch/php/
       
<?php

   
// (...)
   
   
class Syslog
   
{
        var
$_facility; // 0-23
       
var $_severity; // 0-7
       
var $_hostname; // no embedded space, no domain name, only a-z A-Z 0-9 and other authorized characters
       
var $_fqdn;
        var
$_ip_from;
        var
$_process;
        var
$_content;
        var
$_msg;
        var
$_server;   // Syslog destination server
       
var $_port;     // Standard syslog port is 514
       
var $_timeout// Timeout of the UDP connection (in seconds)
       
        // (...)
   
       
function Send($server = "", $content = "", $timeout = 0)
        {
           
// (...)
           
           
$actualtime = time();
           
$month      = date("M", $actualtime);
           
$day        = substr("  ".date("j", $actualtime), -2);
           
$hhmmss     = date("H:i:s", $actualtime);
           
$timestamp  = $month." ".$day." ".$hhmmss;
           
           
$pri    = "<".($this->_facility*8 + $this->_severity).">";
           
$header = $timestamp." ".$this->_hostname;
           
           
// (...)
           
           
$msg = $this->_process.": ".$this->_fqdn." ".$this->_ip_from." ".$this->_content;
           
           
$message = substr($pri.$header." ".$msg, 0, 1024);
           
           
$fp = fsockopen("udp://".$this->_server, $this->_port, $errno, $errstr, $this->_timeout);
            if (
$fp)
            {
               
fwrite($fp, $message);
               
fclose($fp);
               
$result = $message;
            }
            else
            {
               
$result = "ERROR: $errno - $errstr";
            }
            return
$result;
        }

   
// (...)
?>

Example
<?php
   
require_once('syslog.php');
   
$syslog = new Syslog();
   
$syslog->Send('192.168.0.12', 'My first PHP syslog message');
?>
sivann at cs dot ntua dot gr
10-Dec-2005 12:40
This is an ident request example. If your client is running identd your real username will be known by the server.
It is also usefull to identify people bypassing IP ACLs by using SOCKS proxy and dynamic IP forwarding. If the socks proxy server uses ident (most unices do) you will know his real username.
For more information see RFC1413
Timeout of 2 seconds in the example may not be enough.

<?
error_reporting
(E_ALL);
$remip = $HTTP_SERVER_VARS['REMOTE_ADDR'];
$remport = $HTTP_SERVER_VARS['REMOTE_PORT'];

ob_implicit_flush();
$fp = fsockopen($remip, 113, $errno, $errstr, 2);
if (!
$fp) {
   echo
"$errstr ($errno)<br>\n";
   exit;
}
else {
  
$out = "$remport, 80\r\n";
  
fwrite($fp, $out);
  
$answer=fgets($fp, 128);
}
fclose($fp);
$ansparts=explode(":",$answer);
$user=chop($ansparts[3]);
echo
"You are $user@$remip:$remport";

?>
Kiki_EF
27-Oct-2005 04:20
Additional ICQ status request over proxy
<?php
function icq_uin($uin)
{
    if (!
is_numeric($uin))
        return
false;
   
$proxy_name = 'proxy.mydomain.de';
   
$proxy_port = 8080;
   
$proxy_user = "";
   
$proxy_pass = "";
   
$proxy_cont = '';
   
$request_url = "http://status.icq.com/online.gif?icq=$uin";

   
$proxy_fp = fsockopen($proxy_name, $proxy_port);
    if (!
$proxy_fp)
        return
false;
   
fputs($proxy_fp, "GET $request_url HTTP/1.0\r\nHost: $proxy_name\r\n");
   
fputs($proxy_fp, "Proxy-Authorization: Basic ". base64_encode ("$proxy_user:$proxy_pass")."\r\n\r\n");
    while(!
feof($proxy_fp)){
       
$proxy_cont .= fread($proxy_fp,4096);
    }
   
fclose($proxy_fp);
   
$proxy_cont = substr($proxy_cont, strpos($proxy_cont,"\r\n\r\n")+4);
    if (
strstr($proxy_cont, 'online1'))
        return
'online';
    if (
strstr($proxy_cont, 'online0'))
        return
'offline';
    if (
strstr($proxy_cont, 'online2'))
        return
'disabled';
}
echo
"User is ".icq_uin(123456789012345);
?>
Based on http://de2.php.net/manual/de/function.fopen.php#53090
Thanx
alex at renesource dot lv
29-Sep-2005 04:52
Setting up SSL connection to server that requires client certificate (https).

Function fsockopen() has 5 arguments only in PHP5. There is sixth undocumented argument in PHP4 fsockopen() function . Therefore code in note 'alex at renesource dot lv 16-Mar-2004 09:07' will work with PHP4 only.

You can use the following code to post request to HTTPS server that requires client certificate to establish SSL connection:

<?php
# working vars
$host = 'ssl.host.com';
$service_uri = '/some/service/address';
$local_cert_path = '/path/to/keys.pem';
$local_cert_passphrase = 'pass_to_access_keys';
$request_data = '<some><xml>data</xml></some>';

# array with the options to create stream context
$opts = Array();

# compose HTTP request header
$header = "Host: $host\\r\\n";
$header .= "User-Agent: PHP Script\\r\\n";
$header .= "Content-Type: text/xml\\r\\n";
$header .= "Content-Length: ".strlen($request_data)."\\r\\n";
$header .= "Connection: close";

# define context options for HTTP request (use 'http' index, NOT 'httpS')
$opts['http']['method'] = 'POST';
$opts['http']['header'] = $header;
$opts['http']['content'] = $request_data;

# define context options for SSL transport
$opts['ssl']['local_cert'] = $local_cert_path;
$opts['ssl']['passphrase'] = $local_cert_passphrase;

# create stream context
$context = stream_context_create($opts);

# POST request and get response
$filename = 'https://'.$host.$service_uri;
$content = file($filename, false, $context);
$response_data = implode('', $content);

?>
robin at pozytron dot com
22-Aug-2005 07:38
I have found, when using fsockopen() and the POST method, that using HTTP/1.1 is VERY significantly slower than HTTP/1.0 (at least for the server I'm querying, an Orion-based server). Also, using cURL tended to be faster than fsockopen(), though only slightly. For example, here was a recent set of data (for the same exact request in each case):

cURL: 4.2sec
fsockopen() HTTP/1.0: 4.9sec
fsockopen() HTTP/1.1: 19.9sec (!)

I'm not sure why this was occurring. Perhaps it has something to do with the Orion server, which I have little experience with. However, it was not a fluke, and I double-checked the code to make sure there were no errors.

EDITORS NOTE: HTTP/1.1 uses persistent connection causing this delay. Use "Connection: close" header to disable it.
l0gic at l0gic dot net
13-Aug-2005 03:54
After a little experimenting, I worked out how to reliably handle chunked HTTP/1.1 data. The following code assumes a connection has already been opened as $fp, and the response header has been read into the array $header. A loop is used to read data until the entire chunk length has been read, due to fsockopen()'s tendency to stop reading when a new packet is received. Please note that I have not put this code through thorough testing; this is merely to demonstrate the methodology.

if (isset($header['Transfer-Encoding'])) {
   
    // Read the length of the current chunk
    while ($chunk_length = hexdec(fgets($fp))) {
       
        // Initialize counter and buffer
        $read_length = 0;
        $data = NULL;
       
        // Read $chunk_length bytes of data
        while ($read_length < $chunk_length) {
           
            $data .= fread($fp, $chunk_length - $read_length);
            $read_length = strlen($data);
           
            }
       
        // Output the data read
        echo $data;
       
        }
}
dna at revold-design dot de
10-Aug-2005 09:04
Something useful for ICQ:
<?php
$icquin
= "197829943";
function
GetICQ($uin) {
    if (!
is_numeric($uin)) return FALSE;

   
$fp = fsockopen('status.icq.com', 80, &$errno, &$errstr, 8);
    if (!
$fp) {
    return
"N/A";
        }
    else {

   
$request = "HEAD /online.gif?icq=$uin HTTP/1.0\r\n"
             
."Host: web.icq.com\r\n"
             
."Connection: close\r\n\r\n";
   
fputs($fp, $request);

    do {
       
$response = fgets($fp, 1024);
    }
    while (!
feof($fp) && !stristr($response, 'Location'));

   
fclose($fp);

    if (
strstr($response, 'online1')) return 'Online';
    if (
strstr($response, 'online0')) return 'Offline';
    if (
strstr($response, 'online2')) return 'N/A';
   
// N/A means, this User set the Option, his Online
    // Status cannot be shown over the Internet
   
   
return FALSE;
    }
}

echo
GetICQ($icquin);
?>
Jeremy
06-Jul-2005 03:52
The only think wrong with richard burton's code as regarding apache is that
$byte != "\\r" should be
$byte == "\r"
suma at fairrank dot noadsplease dot de
31-May-2005 05:51
To retrieve a page from a HTTP server over a SSL connection (HTTPS), execute this script with an SSL enabled build of PHP, and enter your data.

$fp = pfsockopen("ssl://yourwebsite.com", 443, $errno, $errstr);
if (!$fp) {
    echo "$errstr ($errno)<br/>\n";
    echo $fp;
} else {
    fputs($fp, "GET /path/page.php  HTTP/1.1\r\n");
    fputs($fp, "Host: yourwebsite.com\r\n");
    fputs($fp, "Authorization: Basic ".base64_encode("username:password")."\r\n");
    fputs($fp, "Connection: close\r\n\r\n");
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
mzvarik at gmail dot com
24-May-2005 05:09
If you just want to get the page content it's better to use fopen instead of fsockopen... I did a benchmark and it's faster... depends on how big is the content, getting it using fopen can be sometimes even 2x faster.
richard dot lajaunie at cote-azur dot cci dot fr
19-May-2005 04:10
<?
/************************************************************
* Author: Richard Lajaunie
* Mail : richard.lajaunie@cote-azur.cci.fr
*
* subject : this script retreive all mac-addresses on all ports
* of a Cisco 3548 Switch by a telnet connection
*
* base on the script by: xbensemhoun at t-systems dot fr on the same page
**************************************************************/

if ( array_key_exists(1, $argv) ){
  
$cfgServer = $argv[1];
}else{
   echo
"ex: 'php test.php 10.0.0.0' \n";
   exit;
}

$cfgPort    = 23;                //port, 22 if SSH
$cfgTimeOut = 10;

$usenet = fsockopen($cfgServer, $cfgPort, $errno, $errstr), $cfgTimeOut);

if(!
$usenet){
       echo
"Connexion failed\n";
       exit();
}else{
       echo
"Connected\n";
      
fputs ($usenet, "password\r\n");
      
fputs ($usenet, "en\r\n");
      
fputs ($usenet, "password\r\n");
      
fputs ($usenet, "sh mac-address-table\r\n");
      
fputs ($usenet, " "); // this space bar is this for long output
     
       // this skip non essential text
      
$j = 0;
       while (
$j<16){
      
fgets($usenet, 128);
      
$j++;
       }
  
stream_set_timeout($usenet, 2); // set the timeout for the fgets
  
$j = 0;
       while (!
feof($usenet)){
      
$ret = fgets($usenet, 128);
      
$ret = str_replace("\r", '', $ret);
      
$ret = str_replace("\n", "", $ret);
       if  (
ereg("FastEthernet", $ret)){
           echo
"$ret \n";
       }
       if (
ereg('--More--', $ret) ){
          
fputs ($usenet, " "); // for following page
      
}
      
$info = stream_get_meta_data($usenet);
       if (
$info['timed_out']) {
          
$j++;
       }
       if (
$j >2){
          
fputs ($usenet, "lo");
           break;
       }
   }
}
echo
"End.\r\n";
?>
saul dot dobney at dobney dot com
20-Apr-2005 12:40
If you are using fsockopen to access webpage, but come across a redirect (Location: ) in the header and want to find and follow the redirect as in this snippet:

while (!feof($fp)) {
   $line=fgets($fp, 1024);               
   if (stristr($line,"location:")!="") {
    $redirect=preg_replace("/location:/i","",$line);
   }
}

Then don't forget to trim($redirect) before trying to follow this new link as $redirect actually has a \r\n on the end of it and won't give you a valid path in the next iteration otherwise. A six hour bug.

Saul Dobney
nospam at cronjob dot de
17-Apr-2005 09:06
Be careful if you open a lot of sockets in one php-file!
I had a script which checked a lot of domains and opened sockets to the whois-server. Even that I closed the connections after I checked a domain (fclose), the sockets seemed to stay open. After a while (about 1000 connections) the php-script couldn't open any more sockets.
It took a while to fix this problem. I did this by writing a script which started the check-scripts with wget (or lynx). I started 5 scripts parallel and just checked 20 domains. After that new 5 scripts where opened. That helped me not to open too many sockets in one php-file because when a php-script ends, all open sockets are closed.

Example:

start.php:
<?php
ignore_user_abort
(true);
for(
$i=0; $i<100; $i++) {
    echo
$i."- "; flush();
   
$exec_string = 'lynx http://domain.tld/whois.php &';
   
$output = `$exec_string`;
   
sleep(10);
   
$exec_string = 'killall lynx';
   
$output = `$exec_string`;
}
?>

whois.php:
<?php
ignore_user_abort
(true);
for(
$i=0; $i<50; $i++) {
   
fsockopen(whois.server...);
   
// here you process the whois-things
}
?>

Hope this'll help some people!
ahauk at NO-SPAM dot synergynt dot net
29-Mar-2005 07:38
The following script will login to a POP3 account using the username, password and server name provided via a standard form; determine the amount of messages using a binary search; then purge all messages.

<?php
    $server
= $_POST["server"];
   
$user = $_POST["user"];
   
$pass = $_POST["pass"];
   
$count = 1;
   
$low = 0;
   
$mid = 0;
   
$high = 100000;
   
$connection = fsockopen($server, 110, $errno, $errstr, 30);

    if(!
$connection) {
        print
"Connect Failed: $errstr ($errno)";
    } else {
       
$output = fgets($connection, 128);
       
fputs($connection, "user $user\n");
       
$output = fgets($connection, 128);
       
fputs($connection, "pass $pass\n");
       
$output = fgets($connection, 128);
        while(
$low < $high - 1) {
           
$mid = floor(($low + $high) / 2);
           
fputs($connection, "list $mid\n");
           
$output = fgets($connection, 128);
           
$subout = substr($output, 0, 4);
            if(
$subout == "+OK ") {
               
$low = $mid;
                continue;
            }
            elseif(
$subout == "-ERR") {
                   
$high = $mid;
                    continue;
            } else {
                break;
                print
"An error has occurred. Please try again.";
            }
        }
       
$limit = $mid - 1;
        while(
$count <= $limit) {
           
fputs($connection, "dele $count\n");
           
fgets($connection, 128);
           
$count = $count + 1;
        }
       
fputs($connection, "quit\n");
    }
   
fclose($connection);
    print
"Successfully removed $limit messages.";
?>
JMPZ
01-Mar-2005 02:04
I had a similar problem to a previous poster with terrible performance. I tried changing to HTTP 1.0 but that didn't fix it. I then removed the line:

connection: keep-alive

This fixed it. What took 13 seconds now takes 1.
redvader at yandex dot ru
26-Feb-2005 12:34
here are some fixes to code by
edwin at bitstorm dot org
they might seem silly, but still useful in some cases

<?php
 
function fetchURL( $url ) {
  
$url_parsed = parse_url($url);
  
$host = $url_parsed["host"];
  
$port = $url_parsed["port"];
    if (
$port==0)
      
$port = 80;
  
$path = $url_parsed["path"];

  
//if url is http://example.com without final "/"
   //I was getting a 400 error
   
if (empty($path))
   
$path="/";

   
//redirection if url is in wrong format
   
if (empty($host)):
   
$host="www.somesite.com";
   
$path="/404.shtml";
    endif;

   if (
$url_parsed["query"] != "")
      
$path .= "?".$url_parsed["query"];
  
$out = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";
  
$fp = fsockopen($host, $port, $errno, $errstr, 30);
  
fwrite($fp, $out);
  
$body = false;
   while (!
feof($fp)) {
   echo
fgets($fp, 128);
   }
  
fclose($fp);
   return
$in;
}

fetchURL($address);
?>
dante at dantecubed dot com
24-Feb-2005 09:00
You may be able to speed this function up by using an IP address instead of a domain. PHP uses getHostByAddr internally in this function anyway, so you can save a step in the function process.
konrad dot meyer at gmail dot com
13-Feb-2005 06:34
The documentation example is of a GET request. I have found POST documentation to be lacking, and here's a function to easily simulate submitting form data:

<?php
# $host includes host and path and filename
    # ex: "myserver.com/this/is/path/to/file.php"
# $query is the POST query data
    # ex: "a=thisstring&number=46&string=thatstring
# $others is any extra headers you want to send
    # ex: "Accept-Encoding: compress, gzip\r\n"
function post($host,$query,$others=''){
   
$path=explode('/',$host);
   
$host=$path[0];
    unset(
$path[0]);
   
$path='/'.(implode('/',$path));
   
$post="POST $path HTTP/1.1\r\nHost: $host\r\nContent-type: application/x-www-form-urlencoded\r\n${others}User-Agent: Mozilla 4.0\r\nContent-length: ".strlen($query)."\r\nConnection: close\r\n\r\n$query";
   
$h=fsockopen($host,80);
   
fwrite($h,$post);
    for(
$a=0,$r='';!$a;){
       
$b=fread($h,8192);
       
$r.=$b;
       
$a=(($b=='')?1:0);
    }
   
fclose($h);
    return
$r;
}
?>
edwin at bitstorm dot org
02-Dec-2004 10:50
Here's a function to just fetch the contents behind an URL.

<?php
function fetchURL( $url ) {
   
$url_parsed = parse_url($url);
   
$host = $url_parsed["host"];
   
$port = $url_parsed["port"];
    if (
$port==0)
       
$port = 80;
   
$path = $url_parsed["path"];
    if (
$url_parsed["query"] != "")
       
$path .= "?".$url_parsed["query"];

   
$out = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";

   
$fp = fsockopen($host, $port, $errno, $errstr, 30);

   
fwrite($fp, $out);
   
$body = false;
    while (!
feof($fp)) {
       
$s = fgets($fp, 1024);
        if (
$body )
           
$in .= $s;
        if (
$s == "\r\n" )
           
$body = true;
    }
   
   
fclose($fp);
   
    return
$in;
}
?>
Simon Riget at paragi.com
18-Nov-2004 01:25
Ping from PHP script. (Without system call)

This is of cause not a real ping since there is no support for ICMP. So it can't send a packet and get it back. But the important thing is to get a response from the server, even if it is only a ICMP  error message. That way it verifies the servers existens and calculate the round trip time, which is the essential function of ping. It work well on all servers I have tried, with the echo service running.

<?
$host
='www.php.com';
$timeout=2;
   
//Open the socket
$handle=fsockopen('ddp://'.$host, 7, $errno, $errstr, $timeout);
if (!
$handle)
     echo
"$errstr ($errno)<br>\r\n";
else {
   
//Set read timeout
   
stream_set_timeout($handle, $timeout);
    for(
$i=0;$i<3;$i++){
       
//Time the responce
       
list($usec, $sec) = explode(" ", microtime(true));
     
$start=(float)$usec + (float)$sec;
       
       
//send somthing
        
$write=fwrite($handle,"echo this\n");
        if(!
$write){
            echo
"Error in writing to socked<br>\r\n";
            break;
        }
        echo
'Send packet to '.$host;
       
       
//Try to read. the server will most likely respond with a "ICMP Destination Unreachable" and end the read. But that is a responce!
       
fread($handle,1024);
       
       
//Work out if we got a responce and time it           
       
list($usec, $sec) = explode(" ", microtime(true));
       
$laptime=((float)$usec + (float)$sec)-$start;
        if(
$laptime>$timeout)
            echo
" : No reply<br>\r\n";
        else   
            echo
" : Round trip = ".round($laptime,3)." s<br>\r\n";
    }
   
fclose($handle);
}
?>
michiel at parse dot nl
25-Oct-2004 08:42
The following snippet allows you to retrieve the title oa page.

Great for rewriting auto-url detectors to display the actual title rather then http://...

<?
echo get_url_title("http://www.php.net/cal.php?id=409");

function
get_url_title($url, $timeout = 2)
{
   
$url = parse_url($url);

    if(!
in_array($url['scheme'],array('','http')))
        return;

   
$fp = fsockopen ($url['host'], ($url['port'] > 0 ? $url['port'] : 80), $errno, $errstr, $timeout);
    if (!
$fp)
    {
        return;
       
// echo "$errstr ($errno)<br>\n";
   
}
    else
    {
       
fputs ($fp, "GET /".$url['path'].($url['query'] ? '?'.$url['query'] : '')." HTTP/1.0\r\nHost: ".$url['host']."\r\n\r\n");
       
$d = '';
        while (!
feof($fp))
        {
           
$d .= fgets ($fp,2048);

            if(
preg_match('~(</head>|<body>|(<title>\s*(.*?)\s*</title>))~i', $d, $m))
                break;
        }
       
fclose ($fp);

        return
$m[3];
    }
}
?>
elemental21 at hotmail dot com
08-Oct-2004 11:23
Found this php class to use telnet from here:
http://cvs.adfinis.ch/cvs.php/phpStreamcast/telnet.class.php

There's no docs and a lot of it's in french though so maybe it will help
someone to have my working code. This code is used to telnet into a
pix and execute the "shun" command.

//-------telnet.class.php usage example---------
                $telnet = new telnet;
// Next line is for logging. 
//By default you need to create a folder called /log and give it the
//rights your webserver is running.
                $telnet->setLog(1,"mylog");
                $telnet->set_host("myhost.myplace.com");
//You need to set the prompt to what you know its going to be,
//then call wait_prompt...which waits for what you just set
                $telnet->set_prompt("Password: ");
                $telnet->connect();
                $telnet->wait_prompt();
                $telnet->write("mypassword");
//Have to change the prompt...in my example this is the
//prompt that a pix will change to after loggin in.
                $telnet->set_prompt("pix> ");
                $telnet->wait_prompt();
                $telnet->write("en");
                $telnet->set_prompt("Password: ");
                $telnet->wait_prompt();
                $telnet->write("enable_password");
//When you go into enable mode in a pix the prompt changes
                $telnet->set_prompt("pix# ");
                $telnet->wait_prompt();
                $telnet->write("shun " . $shun_address);
                $telnet->wait_prompt();
                $telnet->write("clear xlate");
                $telnet->wait_prompt();
                $telnet->write("write mem");
                $telnet->wait_prompt();
                $telnet->write("exit");
                $telnet->disconnect();
mikebNOSPAM at xamo dot com
30-Sep-2004 08:17
Hey, why were my comments regarding fsockopen connection timeouts taken out? I'm sure they would have been very useful to other users.

fsockopen (on FreeBSD and probably OpenBSD) will ignore the connection timeout parameter, and hang for several minutes if it can't connect for a variety of reasons (no DNS resolve, host down, extreme firewall setups). Use curl instead until a solution is found (i spent days on this issue)
bjorn (at) ahusonline dot com
21-May-2004 08:50
Modified code for telnet to work with not-so-fast connections.
The old version garbles the output and/or cuts the output before
it is finished when output is above about 100 lines.

<?php
# This is the difficult part, the Telnet header
$header1=chr(0xFF).chr(0xFB).chr(0x1F).chr(0xFF).chr(0xFB).
chr(0x20).chr(0xFF).chr(0xFB).chr(0x18).chr(0xFF).chr(0xFB).
chr(0x27).chr(0xFF).chr(0xFD).chr(0x01).chr(0xFF).chr(0xFB).
chr(0x03).chr(0xFF).chr(0xFD).chr(0x03).chr(0xFF).chr(0xFC).
chr(0x23).chr(0xFF).chr(0xFC).chr(0x24).chr(0xFF).chr(0xFA).
chr(0x1F).chr(0x00).chr(0x50).chr(0x00).chr(0x18).chr(0xFF).
chr(0xF0).chr(0xFF).chr(0xFA).chr(0x20).chr(0x00).chr(0x33).
chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0x2C).chr(0x33).
chr(0x38).chr(0x34).chr(0x30).chr(0x30).chr(0xFF).chr(0xF0).
chr(0xFF).chr(0xFA).chr(0x27).chr(0x00).chr(0xFF).chr(0xF0).
chr(0xFF).chr(0xFA).chr(0x18).chr(0x00).chr(0x58).chr(0x54).
chr(0x45).chr(0x52).chr(0x4D).chr(0xFF).chr(0xF0);
$header2=chr(0xFF).chr(0xFC).chr(0x01).chr(0xFF).chr(0xFC).
chr(0x22).chr(0xFF).chr(0xFE).chr(0x05).chr(0xFF).chr(0xFC).chr(0x21);

# connecting
$fp=fsockopen("127.0.0.1",23);

# sending the Telnet header
fputs($fp,$header1);
usleep(125000);
fputs($fp,$header2);
usleep(125000);

# login
fputs($fp,"user\r");
usleep(125000);
fputs($fp,"users.pass\r");
usleep(125000);
# root looks nice
fputs($fp,"su\r");
usleep(125000); # takes some time, we had to wait
fputs($fp,"root.pass\r");

# some tests
fputs($fp,"ifconfig\r");       
fputs($fp,"echo year telnet php connect works|wall\r");

# we had to wait
usleep(125000);

# show the output
do                               
{  
   
$output.=fread($fp, 80);    // read line by line, or at least small chunks
   
$stat=socket_get_status($fp);
}
while(
$stat["unread_bytes"]);
 
$output = str_replace("\n", "<br>", $output);
echo
$output;
fclose($fp);
?>
alex at renesource dot lv
17-Mar-2004 04:07
Set up SSL connection to server that requires client certificate:

Convert client certificate from *.pfx (pkcs12) into*.pem with openssl (if needed):

> openssl pkcs12 -in keys.pfx -out keys.pem

PHP:

<?php
$context
= stream_context_create();
$result = stream_context_set_option($context, 'ssl', 'local_cert', '/path/to/keys.pem');
$result = stream_context_set_option($context, 'ssl', 'passphrase', 'pass_to_access_keys');

$socket = fsockopen('ssl://'.$host, 443, $errno, $errstr, 30, $context);
?>
jack at jtr dot de
17-Feb-2004 07:05
Here is a function for testing a website/URI for availability:

<?php
   
/*
    * @return boolean
    * @param  string $link
    * @desc   �berpr�ft die angegeben URL auf Erreichbarkeit (HTTP-Code: 200)
    */
   
function url_validate( $link )
    {       
       
$url_parts = @parse_url( $link );

        if ( empty(
$url_parts["host"] ) ) return( false );

        if ( !empty(
$url_parts["path"] ) )
        {
           
$documentpath = $url_parts["path"];
        }
        else
        {
           
$documentpath = "/";
        }

        if ( !empty(
$url_parts["query"] ) )
        {
           
$documentpath .= "?" . $url_parts["query"];
        }

       
$host = $url_parts["host"];
       
$port = $url_parts["port"];
       
// Now (HTTP-)GET $documentpath at $host";

       
if (empty( $port ) ) $port = "80";
       
$socket = @fsockopen( $host, $port, $errno, $errstr, 30 );
        if (!
$socket)
        {
            return(
false);
        }
        else
        {
           
fwrite ($socket, "HEAD ".$documentpath." HTTP/1.0\r\nHost: $host\r\n\r\n");
           
$http_response = fgets( $socket, 22 );
           
            if (
ereg("200 OK", $http_response, $regs ) )
            {
                return(
true);
               
fclose( $socket );
            } else
            {
//                echo "HTTP-Response: $http_response<br>";
               
return(false);
            }
        }
    }
?>
sir_reality2001 at yahoo dot com
14-Feb-2004 02:45
<?
// This is a modification to the script I submitted below.
// This script is an example of posting multiple files using
// fsockopen.
// The tricky part is making sure the HTTP headers and file boundaries are acceptable to the target webserver.
// This script is for example purposes only and could/should be improved upon.

$host='targethost';
$port=80;
$path='/test/socket/file_upload/receive_files.php';

// the file you want to upload
$file_array[0] = "dingoboy.gif"; // the file
$file_array[1] = "dingoboy2.gif"; // the file
$file_array[2] = "dingoboy3.gif"; // the file
$content_type = "image/gif"; // the file mime type
//$content_type = "text/plain";
//echo "file_array[0]:$file_array[0]<br><br>";

srand((double)microtime()*1000000);
$boundary = "---------------------------".substr(md5(rand(0,32000)),0,10);

$data = "--$boundary";

for(
$i=0;$i<count($file_array);$i++){
  
$content_file = join("", file($file_array[$i]));

  
$data.="
Content-Disposition: form-data; name=\"file"
.($i+1)."\"; filename=\"$file_array[$i]\"
Content-Type: $content_type

$content_file
--$boundary"
;

}

$data.="--\r\n\r\n";

$msg =
"POST $path HTTP/1.0
Content-Type: multipart/form-data; boundary=$boundary
Content-Length: "
.strlen($data)."\r\n\r\n";

$result="";

// open the connection
$f = fsockopen($host, $port);

fputs($f,$msg.$data);

// get the response
while (!feof($f)) $result .= fread($f,32000);

fclose($f);

?>
xbiron at citenet dot net
25-Jan-2004 04:42
Header to declare cookie :

<?php
/* [other headers] */
# Syntax => Cookie: name=value; name=value
# Never finish with ';'
$header.= "Cookie: name_cookie1=value_cookie1; name_cookie2=value_cookie2\r\n";
?>

Header to create cookie :

<?php
/* [other headers] */
# Syntax => Set-Cookie: name=value[; path=PATH][; expires=DATE][; domain=DOMAIN_NAME][; secure]
# DATE format : Day, dd-Mmm-yy hh:ii:ss GMT
# Never finish with ';'
$header.= "Set-Cookie: name_cookie=value_cookie; path=\; Friday, 13-Jan-03 12:00:00 GMT\r\n";
?>
rob at robhulme dot com
24-Jan-2004 02:17
Just a note to everyone who is using fsockopen and fread / fgets for a HTTP connection.

Unless you specify "Connection: Close" in your headers you will need to wait for the socket to time out before feof($streamPointer) to return true.

This has wasted 2 days of my time, grr!

-Rob
asalamanca at redcetus dot com
19-Nov-2003 04:27
This is a very fast program for test a form or link (many times).
<?php
$repeat 
= 100// How many times repeat the test

$timeout = 100// Max time for stablish the conection
$size    = 16;   // Bytes will be read (and display). 0 for read all

$server  = '64.246.30.37';            // IP address
$host    = 'www.foo.com';             // Domain name
$target  = '/poll/answer.asp';        // Specific program
$referer = 'http://www.test.com/';    // Referer
$port    = 80;

// Setup an array of fields to get with then create the get string
$gets = array ( 'get_field_1' => 'somevalue',
               
'get_field_2' => 'somevalue' );

// Setup an array of fields to post with then create the post string
$posts = array ( 'post_field_1' => 'somevalue',
                
'post_field_2' => 'somevalue' );

// That's all. Now the program proccess $repeat times

$method = "GET";
if (
is_array( $gets ) ) {
   
$getValues = '?';
    foreach(
$gets AS $name => $value ){
       
$getValues .= urlencode( $name ) . "=" . urlencode( $value ) . '&';
    }
   
$getValues = substr( $getValues, 0, -1 );
} else {
   
$getValues = '';
}

if (
is_array( $posts ) ) {
    foreach(
$posts AS $name => $value ){
       
$postValues .= urlencode( $name ) . "=" . urlencode( $value ) . '&';
    }
   
$postValues = substr( $postValues, 0, -1 );
   
$method = "POST";
} else {
   
$postValues = '';
}

$request  = "$method $target$getValues HTTP/1.1\r\n";
$request .= "Host: $host\r\n";
$request .= 'User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) ';
$request .= "Gecko/20021204\r\n";
$request .= 'Accept: text/xml,application/xml,application/xhtml+xml,';
$request .= 'text/html;q=0.9,text/plain;q=0.8,video/x-mng,image/png,';
$request .= "image/jpeg,image/gif;q=0.2,text/css,*/*;q=0.1\r\n";
$request .= "Accept-Language: en-us, en;q=0.50\r\n";
$request .= "Accept-Encoding: gzip, deflate, compress;q=0.9\r\n";
$request .= "Accept-Charset: ISO-8859-1, utf-8;q=0.66, *;q=0.66\r\n";
$request .= "Keep-Alive: 300\r\n";
$request .= "Connection: keep-alive\r\n";
$request .= "Referer: $referer\r\n";
$request .= "Cache-Control: max-age=0\r\n";

if (
$method == "POST" ) {
   
$lenght = strlen( $postValues );
   
$request .= "Content-Type: application/x-www-form-urlencoded\r\n";
   
$request .= "Content-Length: $lenght\r\n";
   
$request .= "\r\n";
   
$request .= $postValues;
}

for (
$i = 0; $i < $repeat; $i++ ) {
   
$socket  = fsockopen( $server, $port, $errno, $errstr, $timeout );
   
fputs( $socket, $request );
    if (
$size > 0 ) {
       
$ret = fgets( $socket, $size );
    } else {
       
$ret = '';
        while ( !
feof( $socket ) ) {
           
$ret .= fgets( $socket, 4096 );
        }
    }
   
fclose( $socket );
    echo
"<hr> $i -- $content $ret";
}
?>

Alejandro Salamanca
RedCetus.com
terminal
24-Oct-2003 04:30
Try this.
Use AUTH when necessary.
Read RFC 821 when having problems.

<?php

    $handle
= smtp_connect($smtp_server, 25, 30, 1, 1, 1);
    echo
smtp_command($handle, "EHLO $domain\r\n", 1, 1);
    echo
smtp_command($handle, "MAIL FROM:<$from_mail>\r\n", 1, 1);
    echo
smtp_command($handle, "RCPT TO:<$to_mail>\r\n", 1, 1);
    echo
smtp_command($handle, "DATA\r\n", 1, 1);
    echo
smtp_command($handle, "$message\r\n.\r\n", 1, 1);
   
// don't do it like this - it will hang up
    // echo smtp_command($handle, "$message", 1, 1);
    // echo smtp_command($handle, "\r\n.\r\n", 1, 1);
   
echo smtp_command($handle, "QUIT\r\n", 1, 1);
   
smtp_close($handle);
   
   
    function
smtp_connect($host, $port, $timeout=30, $echo_command=False, $echo_response=False, $nl2br=False)
    {
       
$errno = 0;
       
$errstr = 0;
        if(
$echo_command)
        {
            if(
$nl2br) { echo nl2br("CONNECTING TO $host\r\n"); }
            else { echo
"CONNECTING TO $host\r\n"; }
        }
       
$handle = fsockopen($host, $port, $errno, $errstr, $timeout);
        if(!
$handle)
        {
            if(
$echo_command)
            {
                if(
$nl2br) { echo nl2br("CONNECTION FAILED\r\n"); }
                else { echo
"CONNECTION FAILED\r\n"; }
            }
            return
False;
        }
        if(
$echo_command)
        {
            if(
$nl2br) { echo nl2br("SUCCESS\r\n"); }
            else { echo
"SUCCESS\r\n"; }
        }
       
$response = fgets($handle,1);
       
$bytes_left = socket_get_status($handle);
        if (
$bytes_left > 0) { $response .= fread($handle, $bytes_left["unread_bytes"]); }
        if(
$echo_response)
        {
            if(
$nl2br) { echo nl2br($response); }
            else { echo
$response; }
        }
        return
$handle;
    }

    function
smtp_command($handle, $command, $echo_command=False, $nl2br=False)
    {
        if(
$echo_command)
        {
            if(
$nl2br) { echo nl2br($command); }
            else { echo
$command; }
        }
       
fputs($handle, $command);
       
$response = fgets($handle,1);
       
$bytes_left = socket_get_status($handle);
        if (
$bytes_left > 0) { $response .= fread($handle, $bytes_left["unread_bytes"]); }
        if(
$nl2br) { return nl2br($response); }
        else { return
$response; }
    }
   
    function
smtp_close($handle)
    {
       
fclose($handle);
    }
?>
richardaburton at hotmail dot com
20-Oct-2003 12:29
Improved HTTP/1.1 chunked transfer-encoding example.

The sample code given below by Jack does not function correctly when run against a recent version of Apache (I'm assuming that this did once work, but from the HTTP/1.1 spec I can only assume if it did work it was based mostly on luck).

<?php

$header
= "";
$response = "";

// connect
if (!($request=fsockopen('whatever.com',80,$errno,$errstr))) exit($errstr);
else {
  
socket_set_timeout($request,10);
  
// send request
  
fwrite($request,$post);
  
// get header
  
do $header.=fread($request,1); while (!preg_match('/\\r\\n\\r\\n$/',$header));
  
// check for chunked encoding
  
if (preg_match('/Transfer\\-Encoding:\\s+chunked\\r\\n/',$header))
      do {
        
$byte = "";
        
$chunk_size="";
         do {
           
$chunk_size.=$byte;
           
$byte=fread($request,1);
         } while (
$byte!="\\r");      // till we match the CR
        
fread($request, 1);         // also drop off the LF
        
$chunk_size=hexdec($chunk_size); // convert to real number
        
$response.=fread($request,$chunk_size);
        
fread($request,2);          // ditch the CRLF that trails the chunk
     
} while ($chunk_size);         // till we reach the 0 length chunk (end marker)
  
else {
     
// check for specified content length
     
if (preg_match('/Content\\-Length:\\s+([0-9]*)\\r\\n/',$header,$matches)) {
        
$response=fread($request,$matches[1]);
      } else {
        
// not a nice way to do it (may also result in extra CRLF which trails the real content???)
        
while (!feof($request)) $response .= fread($request, 4096);
      }
   }
  
// close connection
  
fclose($request);
}

// do something useful with the response
print($header);
print(
$response);

?>

Richard.
pulstar at ig dot com dot br
24-Sep-2003 03:24
To emulate a web browser with PHP using socket functions, there is a very good class to do this:

http://sourceforge.net/projects/snoopy/

Some of its features:
   
* easily fetch the contents of a web page
* easily fetch the text from a web page (strip html tags)
* easily fetch the the links from a web page (add a filter for "mailto:" links and you can easily fetch e-mail addresses).
* supports proxy hosts
* supports basic user/pass authentication
* supports setting user_agent, referer, cookies and header content
* supports browser redirects, and controlled depth of redirects
* expands fetched links to fully qualified URLs (default)
* easily submit form data and retrieve the results
* supports SSL and frames
joe at edwardsconsultants dot com
10-Aug-2003 06:56
just a quick note for users attempting https and thinking they must resort to curl or alternate methods -
you can use fsockopen, just read the docs closely.  basically they are saying to use 'ssl://' for a HTTPS (SSL) web request.

so this would work for authorize.net, and others; even for that paypal IPN - however I think it would be best to leave the site and deal with paypal's form:

$host = "somehost.somedomain.com";
$port = 443;
$path = "/the/url/path/file.php"; //or .dll, etc. for authnet, etc.

//you will need to setup an array of fields to post with
//then create the post string
$formdata = array ( "x_field" => "somevalue");
//build the post string
  foreach($formdata AS $key => $val){
    $poststring .= urlencode($key) . "=" . urlencode($val) . "&";
  }
// strip off trailing ampersand
$poststring = substr($poststring, 0, -1);

$fp = fsockopen("ssl://".$host, $port, $errno, $errstr, $timeout = 30);

if(!$fp){
 //error tell us
 echo "$errstr ($errno)\n";
  
}else{

  //send the server request
  fputs($fp, "POST $path HTTP/1.1\r\n");
  fputs($fp, "Host: $host\r\n");
  fputs($fp, "Content-type: application/x-www-form-urlencoded\r\n");
  fputs($fp, "Content-length: ".strlen($poststring)."\r\n");
  fputs($fp, "Connection: close\r\n\r\n");
  fputs($fp, $poststring . "\r\n\r\n");

  //loop through the response from the server
  while(!feof($fp)) {
    echo fgets($fp, 4096);
  }
  //close fp - we are done with it
  fclose($fp);
}
sergiopaternoster at tiscali dot it
31-Jul-2003 02:49
If you want to connect via Telnet, it could be useful to set also the Terminal Type (some OS requires it)

$IAC  = chr(255);   /* interpret as command: */
$SB = chr(250);     /* interpret as subnegotiation */
$SE = chr(240);     /* end sub negotiation */
$TELOPT_TTYPE = chr(24);     /* terminal type */
$TELQUAL_IS = chr(0);    /* Option is... */

//sending Terminal Type
fwrite($sock,$IAC.$SB.$TELOPT_TTYPE.$TELQUAL_IS.'vt100'.$IAC.$SE);

ciao
Sergio Paternoster
johnyu at revolutionhosting dot net
24-Jul-2003 06:45
It appears with PHP 4.3.2, on windows machines. fsockopen isn't able to use the ssl:// prefix even if you have the OpenSSL dll loaded in php.ini

On the otherhand, with PHP 4.5 CVS, it looks like SSL support for fsockopen is already compiled in... but it's missing the zip lib which I also need =(
brage (a t) jeffnappi (d.o.t) commie
10-Jul-2003 06:16
thought you guys may appreciate this function, allows you to pass an array of urls to download and does so simultaneously using non-blocking sockets, then returns the data in an array.

// function connects to an array of URLS at the same time
// and returns an array of results.

function multiHTTP ($urlArr) {
 $sockets = Array(); // socket array!
 $urlInfo = Array(); // info arr
 $retDone = Array();
 $retData = Array();
 $errno   = Array();
 $errstr  = Array();
 for ($x=0;$x<count($urlArr);$x++) {
  $urlInfo[$x] = parse_url($urlArr[$x]);
  $urlInfo[$x][port] = ($urlInfo[$x][port]) ? $urlInfo[$x][port] : 80;
  $urlInfo[$x][path] = ($urlInfo[$x][path]) ? $urlInfo[$x][path] : "/";
  $sockets[$x] = fsockopen($urlInfo[$x][host], $urlInfo[$x][port],
                           $errno[$x], $errstr[$x], 30);
  socket_set_blocking($sockets[$x],FALSE);
  $query = ($urlInfo[$x][query]) ? "?" . $urlInfo[$x][query] : "";
  fputs($sockets[$x],"GET " . $urlInfo[$x][path] . "$query HTTP/1.0\r\nHost: " .
        $urlInfo[$x][host] . "\r\n\r\n");
 }
 // ok read the data from each one
 $done = false;
 while (!$done) {
  for ($x=0; $x < count($urlArr);$x++) {
   if (!feof($sockets[$x])) {
    if ($retData[$x]) {
     $retData[$x] .= fgets($sockets[$x],128);
    } else {
     $retData[$x] = fgets($sockets[$x],128);
    }
   } else {
    $retDone[$x] = 1;
   }
  }
  $done = (array_sum($retDone) == count($urlArr));
 }
 return $retData;
}

# also if anyone has idea to improve this that would be wonderful
chris at music-server dot com
03-Jul-2003 10:53
I also needed a file upload via fsockopen and tried to work with Chris Snyders posting above:

========================
POST /path/to/script.php HTTP/1.0
Host: example.com
Content-type: multipart/form-data, boundary=AaB03x
Content-Length: $requestlen

--AaB03x
content-disposition: form-data; name="field1"

$field1
--AaB03x
content-disposition: form-data; name="field2"

$field2
--AaB03x
content-disposition: form-data; name="userfile"; filename="$filename"
Content-Type: $mimetype
Content-Transfer-Encoding: binary

$binarydata
--AaB03x--
==========================

I discovered some weird behaviour on my Linux server with PHP 4.0 and wanted to let you know :)

1) Lines needed to end with \r\n (else the last character of the value was cropped)
2) I needed to remove Content-Type and Content-Transfer-Encoding from the binary "userfile" - else the uploaded file contained these strings and was invalid!
3) The receiving script couldn't reference to the variables $field1 although register_globals was switched on! Needed to work with $HTTP_POST_VARS['field1'] and $HTTP_POST_FILES['userfile'] to get the values.

o.k., here's the script sending the header:

$f=fsockopen($server,80,$errno,$errstr,30);
fwrite($f,$header);
fclose($f);

The receiving script is as easy :) The file was uploaded to $HTTP_POST_FILES['userfile']['tmp_name'] and the variables were named as mentioned above.

Hope, it prevents spending another afternoon to figure out a file-upload this way :-)
xbensemhoun at t-systems dot fr
25-Jun-2003 06:48
To make a telnet connection with a Cisco router:

$cfgServer = "192.168.0.10";  //IP of your router
$cfgPort    = 23;                //port, 22 if SSH
$cfgTimeOut = 10;

$usenet = fsockopen($cfgServer, $cfgPort, &$errno, &$errstr, $cfgTimeOut);

if(!$usenet)
        {
        echo "Connexion failed\n";
        exit();
        }
else
        {
        echo "Connected\n<BR>";
        fputs ($usenet, "toto\r\n");
        fputs ($usenet, "en\r\n");
        fputs ($usenet, "tutu\r\n");
        fputs ($usenet, "exit\r\n");
        while (!feof($usenet))
                {
                echo ". ".fgets($usenet, 128)."<BR>\n";
                }
        }

Then you will have:
Connected
. ��������
.
. User Access Verification
.
. Password:
. testXB>en
. Password:
. testXB#exit
.
blazely at removetoemail netspace net au
09-Jun-2003 01:55
Here's a quick function to establish a connection to a web server that will time out if the connection is lost after a user definable amount of time or if the server can't be reached.

Also supports Basic authentication if a username/password is specified. Any improvements or criticisms, please email me! :-)

Returns either a resource ID, an error code or 0 if the server can't be reached at all. Returns -1 in the event that something really wierd happens like a non-standard http response or something. Hope it helps someone.

Cheers,

Ben Blazely

function connectToURL($addr, $port, $path, $user="", $pass="", $timeout="30")
{
        $urlHandle = fsockopen($addr, $port, $errno, $errstr, $timeout);

        if ($urlHandle)
        {
                socket_set_timeout($urlHandle, $timeout);

                if ($path)
                {
                        $urlString = "GET $path HTTP/1.0\r\nHost: $addr\r\nConnection: Keep-Alive\r\nUser-Agent: MyURLGrabber\r\n";
                        if ($user)
                                $urlString .= "Authorization: Basic ".base64_encode("$user:$pass")."\r\n";
                        $urlString .= "\r\n";

                        fputs($urlHandle, $urlString);

                        $response = fgets($urlHandle);

                        if (substr_count($response, "200 OK") > 0)      // Check the status of the link
                        {
                                $endHeader = false;                     // Strip initial header information
                                while ( !$endHeader)
                                {
                                        if (fgets($urlHandle) == "\r\n")
                                                $endHeader = true;
                                }

                                return $urlHandle;                      // All OK, return the file handle
                        }
                        else if (strlen($response) < 15)                // Cope with wierd non standard responses
                        {
                                fclose($urlHandle);
                                return -1;
                        }
                        else                                            // Cope with a standard error response
                        {
                                fclose($urlHandle);
                                return substr($response,9,3);
                        }
                }

                return $urlHandle;
        }
        else
                return 0;
}
annettetruong at yahoo dot com
28-May-2003 08:23
I need to use Paypal IPN and can't use fsockopen() or cURL. I'm trying the following as a workaround to using fsockopen() which creates a hidden form that is automatically submitted upon page load, with the final verification step from Paypal caught in the iframe. I would appreciate comments on the pitfalls to this method.

About Paypal IPN:
http://www.paypal.com/cgi-bin/webscr?cmd=p/xcl/rec/ipn-intro-outside

Thanks, Annette.

<?php
   
// Create one additional form element called 'cmd'
   
$hiddenForm = "<input type='hidden' name='cmd' value='_notify-validate'>\n";

   
// Assemble page structure
   
$pageBody = "<body onLoad='document.all.myForm.submit();'>";
   
$pageBody .= "<h2>IPN Results</h2>";

   
// Look at values sent via POST.
    // Add to hidden form in same order.
   
foreach ($_POST as $key => $value) {
     
$hiddenForm .= "<input type='hidden' name='".$key."' value='".$value."'>\n";
     
// Display everything on the page for inspection.
     
echo $key.": ".$value."<br>\n";
    }
   
// Assemble Paypal IPN hidden form.
   
$hiddenForm = "<form name='myForm' method='POST' action='https://www.paypal.com/cgi-bin/webscr' target='myFrame'>\n".$hiddenForm."</form>\n<br>";

   
// Display helpful message about iframe.
   
$pageBody .= "The frame below will contain the IPN response: VERIFIED or INVALID.<br>\n";

   
// Create iframe to catch results of automatic
    // form submission. This frame should
    // display 'VERIFIED' or 'INVALID'. If it shows
    // a paypal page then something went wrong.
   
$iFrame = "<iframe name='myFrame'></iframe><br>\n";
   
$pageBody .= $hiddenForm;
   
$pageBody .= $iFrame;
   
$pageBody .= "</body></html>\n";

   
// Display page that contains automatic form
    // submission with embedded iframe.
   
echo $pageBody;

?>
Ignacio Sbampato
05-May-2003 02:49
You can know from which country are your visitors sending a query to ip-to-country online tool using code below:

****************************************

$ip = $REMOTE_ADDR;

$doc = "/get-country/?ip=" . $ip . "&user=guest&pass=guest";
$url = "ip-to-country.com";

$fp = fsockopen ($url, 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br/>\n";
} else {
    fputs ($fp, "GET $doc HTTP/1.0\r\nHost: " . $url. "\r\n\r\n");
    while (!feof($fp)) {
        $httpresult = fgets ($fp,1024);
    }
    fclose ($fp);
}

if (isset($httpresult))
{
    echo "Ud. est� accediendo desde: <b>$httpresult</b>";
}

****************************************

NOTE: I had to modify the code provided by ip-to-country in its own Tools section because is buggy.
csnyder at chxo dot com
29-Mar-2003 12:04
Need to create a POST request that uploads a file?
I spent this afternoon trying to figure out what one looks like, and here is a template that has been successful for me:

========================
POST /path/to/script.php HTTP/1.0
Host: example.com
Content-type: multipart/form-data, boundary=AaB03x
Content-Length: $requestlen

--AaB03x
content-disposition: form-data; name="field1"

$field1
--AaB03x
content-disposition: form-data; name="field2"

$field2
--AaB03x
content-disposition: form-data; name="userfile"; filename="$filename"
Content-Type: $mimetype
Content-Transfer-Encoding: binary

$binarydata
--AaB03x--
==========================

Note that you have to generate the Content-Length header after you generate the body of the request (from the first --AaB03x down, including the file data), so the thing to do in practice is to build the body first, get the strlen(), and then build the headers onto the front of the body.

See RFC1867 - Form-based File Upload in HTML (http://www.faqs.org/rfcs/rfc1867.html) for more info on the format of "multipart/form-data" posts.
Good luck!
admin at php dot kz
28-Mar-2003 10:19
[quote]have seen in lot of places ppl asking on how to post data to another server using a php script...so here is what is required to do that...

//create a string with all the posted data...

foreach ($HTTP_POST_VARS as $key => $value) {
$value = urlencode(stripslashes($value));
 $req .= "&$key=$value";
}
.....
[/quote]

it is better to move '&' sign to the end of string

$req .= "$key=$value&";
nospam at phppatterns dot com
10-Mar-2003 05:20
The second half of the sample chapter (chptr 2) from Pro PHP Web Services is an in depth look at the HTTP protocol and how to build PHP clients for it.

http://www.wrox.com/books/sample-chapters/SampleChapter_1861008074.pdf [ free ]
Sherif Gayed
30-Jan-2003 03:00
Here is how to connect to the web from behind a proxy server:
/*************start code**************/
/*your proxy server address*/
$proxy = "192.168.10.1";
/*your proxy server port*/
$port = 8080;
/*the url you want to connect to*/
$url = "http://www.php.net/";
$fp = fsockopen($proxy, $port);
fputs($fp, "GET $url HTTP/1.0\r\nHost: $proxy\r\n\r\n");
while(!feof($fp)){
  $line = fgets($fp, 4000);
  print($line);
}
fclose($fp);
/*************end code**************/
bart at mediawave dot nl
06-Jan-2003 08:44
Here is a good article on some of the differences between HTTP 1.0 and HTTP 1.1.

http://wireless.java.sun.com/midp/questions/chunking/
g dot bashi at ntlworld dot com
04-Jan-2003 02:55
The timeout parameter was not supported under windows until PHP 4.3.0, previously it was fixed at 30sec.
dan at lovepond dot com
18-Dec-2002 06:38
<?
$port
=4000;
$host="localhost";
$message="test";
$status=senddata($host,$port,$message);
print
"$status";

function
senddata($host,$port,$message) {

#takes in account servers that do not return EOF character
#send data to server and get back input

#function globals
$linenumber="2"; #amount of lines to get rid of before we give input
$lineamount="1"; #amount of lines to read after we give input

$fp = fsockopen("$host", $port, $errno, $errstr, 30);
if (!
$fp) {
   echo
"$errstr ($errno)";
}
else {
   for (
$i = 1; $i < $linenumber+1; $i++) {
     
fread ($fp,1);
     
$bytes_left = socket_get_status($fp);
      if (
$bytes_left > 0) { fread($fp, $bytes_left[unread_bytes]); }
   }
  
fputs($fp, "$message\r\n");
   for (
$i = 1; $i < $lineamount+1; $i++) {
     
$status.=fread($fp,1);
     
$bytes_left = socket_get_status($fp);
      if (
$bytes_left > 0) { $status.=fread($fp, $bytes_left[unread_bytes]); }
   }
  
fclose ($fp);
}

return
$status;
}

?>

Here is some code to help out abit more with the EOF problem.
I had a problem where I needed to strip out so many lines of server input to get back right data i wanted. UPDATE
verran at descent-rangers dot com
17-Oct-2002 11:28
I was tearing my hair out for a week trying to figure out how to do this.

If you use fsockopen with a service that doesn't have an EOF, or you try to read beyond EOF or line break, PHP can hang completely.

In my case, I was trying to write a class that talks to Kali servers (www.kali.net) to get a list of people on the chat server. To keep PHP from hanging due to the above, I discovered this:

    class kali_utils {
        function games_list($kali_server_ip, $kali_server_port) {
            $result = array();
            $fp = fsockopen($kali_server_ip, $kali_server_port, $errno, $error, 30);
            if (!$fp) {
                $result["errno"] = $errno;
                $result["error"] = $error;
            }
            else {
                fputs($fp, "KALIQ");
                $header = fread($fp, 5);
                $bytes_left = socket_get_status($fp);
                if ($bytes_left > 0) {
                    $result["results"] = fread($fp, $bytes_left["unread_bytes"]);
                }
                else {
                    $result["results"] = "";
                }
                fclose($fp);
            }
            return $result;
        }
    }

When I send the request packet, I get a response packet of length 5. Then I call socket_get_status() and use the unread_bytes key from it to know how far to fread from the socket. Works very good.

I've only used this on PHP 4.2.1 so far.
iain at monitormedia dot co dot uk
19-Jul-2002 09:48
Here's how to send an email using SMTP. This includes rudimentary checking on server responses during the process of sending an email. Could be improved by more comprehensive processing of the result codes...or going on to the next mail exchanger when you fail after connecting to the first.

<?

function another_mail($to,$subject,$headers,$message)
{
 
// Could get this from the php ini?
 
$from="me@here.com";
 list(
$me,$mydomain) = split("@",$from);

 
// Now look up the mail exchangers for the recipient
 
list($user,$domain) = split("@",$to,2);
 if(
getmxrr($domain,$mx,$weight) == 0)  return FALSE;

 
// Try them in order of lowest weight first
 
array_multisort($mx,$weight);
 
$success=0;

 foreach(
$mx as $host) {
 
// Open an SMTP connection
 
$connection = fsockopen ($host, 25, &$errno, &$errstr, 1);
  if (!
$connection)
    continue;
 
$res=fgets($connection,256);
  if(
substr($res,0,3) != "220") break;

 
// Introduce ourselves
 
fputs($connection, "HELO $mydomain\n");
 
$res=fgets($connection,256);
  if(
substr($res,0,3) != "250") break;

 
// Envelope from
 
fputs($connection, "MAIL FROM: $from\n");
 
$res=fgets($connection,256);
  if(
substr($res,0,3) != "250") break;

 
// Envelope to
 
fputs($connection, "RCPT TO: $to\n");
 
$res=fgets($connection,256);
  if(
substr($res,0,3) != "250") break;

 
// The message
 
fputs($connection, "DATA\n");
 
$res=fgets($connection,256);
  if(
substr($res,0,3) != "354") break;

 
// Send To:, From:, Subject:, other headers, blank line, message, and finish
  // with a period on its own line.
 
fputs($connection, "To: $to\nFrom: $from\nSubject: $subject\n$headers\n\n$message\n.\n");
 
$res=fgets($connection,256);
  if(
substr($res,0,3) != "250") break;

 
// Say bye bye
 
fputs($connection,"QUIT\n");
 
$res=fgets($connection,256);
  if(
substr($res,0,3) != "221") break;

 
// It worked! So break out of the loop which tries all the mail exchangers.
 
$success=1;
  break;
 }
 
// Debug for if we fall over - uncomment as desired
 // print $success?"Mail sent":"Failure: $res\n";
 
if($connection) {
  if(
$success==0) fputs($connection, "QUIT\n");
 
fclose ($connection);
 }
 return
$success?TRUE:FALSE;
}

another_mail("recipient@some.domain","My Subject","X-mailer: PHP Script\nX-another-header: Whatever","Test email body.\n\nNote if you actually put a period on a line\nby itself, the function will terminate prematurely.\n\nYou will get a partial email sent though.\n");
?>
t dot hodder at globalgold dot co dot uk
27-Jun-2002 12:52
You can post to a script that uses basic authentication if you create the
header like this and insert it into the relevant script above;

// Build the header
$header = "POST /path/to/script.cgi HTTP/1.0\r\nAuthorization: Basic ";
$header .= base64_encode("$username:$password") . "\r\n";
$header .= "Content-type: application/x-www-form-urlencoded\r\n";
$header .= "Content-length: " . strlen($request) . "\r\n";
$header .= "Connection: close\r\n\r\n";
philip at cornado dot com
17-Mar-2002 08:14
An example to send POST data using fsockopen can be seen here:
http://www.faqts.com/knowledge_base/view.phtml/aid/12039/fid/51
Arif dot Budiman at no dot spam dot please
17-Jan-2002 01:43
This example queries Network Solutions whois database:

<?
$domain
= "arifbudiman.net";

if (
trim($domain) <> "") {
  
$domain = trim($domain);
  
$fp = fsockopen("whois.networksolutions.com", 43, $errno, $errstr, 30);
   if (!
$fp) {
      echo
"$errstr ($errno)";
   } else {
     
fputs($fp, "$domain\r\n");
      print
"<pre>\r\n";
      while (!
feof($fp)) {
         echo
fread($fp,128);
      }
      print
"</pre>";
     
fclose ($fp);
   }
}
?>
info at TAKETHISOUT dot ski-info-online dot com
08-Jan-2002 11:30
This is a "gotcha" that "got me" and discusses the careful use of HTTP/1.1 over HTTP/1.0
 
I had a script that suffered dreadful performance and return Hex values amongst the correct data. This was eventually traced to my inclusion of HTTP/1.1 in the line which read:

-- CODE (watch wrap) --
  $request = "GET $document" . "?" . "$query" . " HTTP/1.1\r\n";
  $request .= "Host: $myServer\r\n\r\n";
-- CODE --

By sending a HTTP/1.1 request it declares that it is willing to 'speak' HTTP/1.1, of course, but there are some aspects of HTTP/1.1 that make it necessary to handle the socket differently from HTTP/1.0.

In the RFC 2616, Section 3.6 defines:

[...]
All HTTP/1.1 applications MUST be able to receive and decode the "chunked" transfer-coding,
[...]

This was the cause of the extraneous HEX values being displayed.

Regards the loss of performance, this is also due to using HTTP/1.1, which defaults to having keepalive on until you tell it to close the connection, or it times out. Therefore the socket was being kept open by the script.

Simply changing the line in the script to HTTP/1.0 completely fixed the problem.

Speaking with one of the members in PHP-dev his words were:

[Comment from Hartmut Holzgraefe]
"I stumbled over the same 'chunked' problem not to long ago as a rule of thumb: never use HTTP/1.1 unless you really know that you have to, claiming to be a HTTP/1.0 client is no problem."

I have posted this as it was something I found very difficult to debug as there is actually nothing wrong with the script. This sort of problem often requires an in depth knowledge of an area that most developers would not have or consider. I would doubt that many, in any, who are reading this have ever read the HTTP RFC 2616 (I doubt also that it is a rivetting read :))  I hope this helps any future developers who are considering the use of high level socket connections with HTTP/1.1.

gethostbyaddr" width="11" height="7"/> <dns_get_record
Last updated: Thu, 03 May 2007
 
 
show source | credits | sitemap | contact | advertising | mirror sites