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

search for in the

gethostbyaddr> <dns_get_record
Last updated: Sat, 24 Mar 2007

view this page in

fsockopen

(PHP 4, PHP 5)

fsockopen — Otevře socketové spojení v internetové nebo unixové doméně.

Popis

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

Iniciuje proudové spojení v internetové (AF_INET, za použití TCP nebo UDP) nebo unixové (AF_UNIX) doméně. Pro internetovou doménu otevře TCP kanál na stroj hostname na port port. hostname v takovém případě může být plně určené doménové jméno nebo IP adresa. Pro spojení UDP musíte explicitně specifikovat protokol předřazením 'udp://' před hostname. V unixové doméně se hostname použije jako cesta k socketu port se pak musí nastavit na 0. Nepovinný parametr timeout se může použít k nastavení time-outu pro systémové volání connect.

Od PHP 4.3.0, pokud jste PHP zkompilovali s podporou OpenSSL, můžete před hostname předřadit 'ssl://' nebo 'tls://' pro použití SSL nebo TSL spojení na vzdálený stroj přes TCP/IP.

fsockopen() vrací deskriptor souboru, který lze použít s jinými souborovými funkcemi (např. fgets(), fgetss(), fputs(), fclose() a feof()).

Pokud volání selže, vrací funkce FALSE, a pokud jsou přítomny nepovinné parametry errno a errstr, budou nastaveny na aktuální chybovou úroveň v systémovém volání connect(). Je-li vrácená hodnota v errno rovna 0 a funkce vrátila FALSE, znamená to, že chyba nastala před voláním connect(). Nejčastěji je to kvůli problému při inicializaci socketu. Uvědomte si, že argumenty errno a errstr se vždy předávají odkazem.

V závislosti na prostředí nemusí být k dispozici unixová doména nebo volitelný parametr timeout.

Socket se implicitně otevře v blokujícím režimu. Do neblokujícího režimu ho můžete přepnout použitím socket_set_blocking().

Příklad 1328. fsockopen() Příklad

<?php
$fp
= fsockopen ("www.example.com", 80, $errno, $errstr, 30);
if (!
$fp) {
    echo
"$errstr ($errno)<br>\n";
} else {
   
fputs ($fp, "GET / HTTP/1.0\r\nHost: www.example.com\r\n\r\n");
    while (!
feof($fp)) {
        echo
fgets ($fp,128);
    }
   
fclose ($fp);
}
?>

Další (níže uvedený) příklad ukazuje, jak získat datum a čas z UDP služby "daytime" (port 13) na vašem vlastním počítači.

Příklad 1329. Použití UDP spojení

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

Poznámka: Parametr timeout by zaveden v PHP 3.0.9 a podpora UDP v PHP 4.

Viz také pfsockopen(), socket_set_blocking(), socket_set_timeout(), fgets(), fgetss(), fputs(), fclose(), feof() a rozšíření Curl.



gethostbyaddr> <dns_get_record
Last updated: Sat, 24 Mar 2007
 
add a note add a note User Contributed Notes
fsockopen
kj83 at op dot pl
18-Aug-2008 03:34
Sending multiple files with form(modification of sir_reality2001 at yahoo dot com's and Duukkis's scripts):

<?php
        $boundary
= "AaB03x";
       
$boundary2 = "BbC04y";
      
       
// Build the header
       
$header = "POST remoteurl HTTP/1.0\r\n";
       
$header .= "Host: remotehost\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
       
for ($i=0; $i<count($_FILES['userfile']['name']);$i++)
        {
           
$data .= "--$boundary\r\n";
            if (
$_FILES['userfile']['name'][$i] != '')
            {
               
$content_file = join("", file($_FILES['userfile']['tmp_name'][$i]));
               
$data.="Content-Disposition: file; name=\"userfile[$i]\"; filename=\"".$_FILES['userfile']['name'][$i]."\"\r\n";
               
$data .= "Content-Type: ".$_FILES['userfile']['type'][$i]."\r\n\r\n";
               
$data .= "".$content_file."\r\n";
               
$data .="--$boundary\r\n";
            }
        }
       
$data .="--$boundary--\r\n";

       
$header .= "Content-length: " . strlen($data) . "\r\n\r\n";
       
$fp = fsockopen($remote_server, 80);
?>
admin at lab-9 dot com
21-Jul-2008 05:32
When you try to POST/GET requests via HTTPS over SSL/TLS you should notice this:

<?php
// preconditions
$port = 80 | 443
$host
= "www.example.com";
$method = "POST" | "GET";
$contenttype = "text/html" | "text/plain" | "text/xml" | ...;
$data = "<something>";

// script
if($port == 443)
     
$sslhost = "ssl://".$host;
else
     
$sslhost = $host;
$fp = fsockopen($sslhost, $port);
fputs($fp, "$method $path HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\n");
fputs($fp, "Content-type: $contenttype\r\n");
fputs($fp, "Content-length: ".strlen($data)."\r\n");
fputs($fp, "Connection: close\r\n");
fputs($fp, "\r\n");
?>

The server usually does not understand the HTTP-header "Host: XXX" if you provide it with the trailing "ssl://" used by fsockopen(); If you do it anyway you probably get a HTTP 400 back as response. :-)
dot dot dot dot dot alexander at gmail dot com
08-Mar-2008 07:15
An edit to my below function for extra headers support and a bit of debugging
( array("key" => "value")  type)
 <?php

if(!function_exists("download")){
    function
download($uri, $port = 80, $extra_headers = NULL){
if(!
function_exists("stripos")){
    function
stripos($str, $needle, $offset=0){
        return
strpos(strtolower($str),strtolower($needle),$offset);
    }
/* endfunction stripos */
}/* endfunction exists stripos*/
       
if(!is_int($port))$port = 80;
        if(!
is_array($extra_headers))$extra_headers = array();
       
$uri = strtr( strval($uri), array("http://" => "", "https://" => "ssl://", "ssl://" => "ssl://", "\\" => "/", "//" => "/") );
       
        if(  (
$protocol = stripos($uri, "://") ) !== FALSE  ){
            if(  (
$domain_pos = stripos($uri, "/", ($protocol + 3)) ) !== FALSE  ){
               
$domain = substr($uri, 0, $domain_pos);
               
$file = substr($uri, $domain_pos);
            }
            else{
               
$domain = $uri;
               
$file = "/";
            }
        }
        else{
            if(  (
$domain_pos = stripos($uri, "/") ) !== FALSE  ){
               
$domain = substr($uri, 0, $domain_pos);
               
$file = substr($uri, $domain_pos);
            }
            else{
               
$domain = $uri;
               
$file = "/";
            }
        }
       
       
$fp = fsockopen($domain, $port, $errno, $errstr, 30);
        if(!
$fp){
            return
FALSE;
        }
        else{
           
$out = "GET " . $file . " HTTP/1.1\r\n";
           
$out .= "Host: " . $domain . "\r\n";
            foreach(
$extra_headers as $nm => $vl ){
   
$out .= strtr( strval($nm), array( "\r" => "", "\n" => "", ": " => "", ":" => "") ) . ": " . strtr( strval($vl), array( "\r" => "", "\n" => "", ": " => "", ":" => "") ) . "\r\n";
            }
           
$out .= "Connection: Close\r\n\r\n";
           
           
$response = "";
           
fwrite($fp, $out);
            while (!
feof($fp)) {
               
$response .= fgets($fp, 128);
            }
           
fclose($fp);
           
            global
$http_response_header;
           
$http_response_header = array();
            if( 
stripos($response, "\r\n\r\n") !== FALSE  ){
               
$hc = explode("\r\n\r\n"$response);
               
$headers = explode("\r\n"$hc[0]);
               
                if(!
is_array($headers))$headers = array();
                foreach(
$headers as $key => $header){
                   
$a = "";
                   
$b = "";
                    if( 
stripos($header, ":") !== FALSE  ){
                        list(
$a, $b) = explode(":", $header);
                       
$http_response_header[trim($a)] = trim($b);
                    }
                }
                return
end($hc);
            }
            else if( 
stripos($response, "\r\n") !== FALSE  ){
               
$headers = explode("\r\n"$response);
               
                if(!
is_array($headers))$headers = array();
                foreach(
$headers as $key => $header){
                    if( 
$key < ( count($headers) - 1 )  ){
                       
$a = "";
                       
$b = "";
                        if( 
stripos($header, ":") !== FALSE  ){
                            list(
$a, $b) = explode(":", $header);
                           
$http_response_header[trim($a)] = trim($b);
                        }
                    }
                }
                return
end($headers);
            }
            else{
                return
$response;
            }
        }
    }
/*endfunction download*/
}/*endif no function download*/
?>
huli0401 at gmail dot com
27-Dec-2007 09:12
<?php
// Check for new version
   
$current_version = explode('.', '1.0.00');
   
$minor_revision = (int) $current_version[2];

   
$errno = 0;
   
$errstr = $version_info = '';

    if (
$fsock = fsockopen("www.exanmple.eu", 80, $errno, $errstr, 30))
    {
        @
fputs($fsock, "GET /ver.txt HTTP/1.1\r\n");
        @
fputs($fsock, "HOST: www.example.eu\r\n");
        @
fputs($fsock, "Connection: close\r\n\r\n");

       
$get_info = false;
        while (!@
feof($fsock))
        {
            if (
$get_info)
            {
               
$version_info .= @fread($fsock, 1024);
            }
            else
            {
                if (@
fgets($fsock, 1024) == "\r\n")
                {
                   
$get_info = true;
                }
            }
        }
        @
fclose($fsock);

       
$version_info = explode("\n", $version_info);
       
$latest_head_revision = (int) $version_info[0];
       
$latest_minor_revision = (int) $version_info[2];
       
$latest_version = (int) $version_info[0] . '.' . (int) $version_info[1] . '.' . (int) $version_info[2];

        if (
$latest_head_revision == 2 && $minor_revision == $latest_minor_revision)
        {
           
$version_info = '<p style="color:green">OK</p>';
        }
        else
        {
           
$version_info = '<p style="color:red">neaktualne';
           
$version_info .= '<br />'Latest_version_info' . $latest_version) . ' ' . sprintf(Current_version_info'. '1.0.00') . '</p>';
        }
    }
    else
    {
        if (
$errstr)
        {
           
$version_info = '<p style="color:red">' . sprintf(Connect_socket_error) . '</p>';
        }
        else
        {
           
$version_info = '<p>'Socket_functions_disabled'</p>';
        }
    }
   
   
$version_info .= '<p>'Mailing_list_subscribe_reminder'</p>';

echo
$version_info;
?>
landerretche at free dot fr
05-Dec-2007 02:59
Make a ping test with PHP

The problem with fsockopen is you have to known the destination port.

A real ping function could be :

<?php
function php_ping($url) {
 
$addr=parse_url($url);
 
$host=$addr['host'];
 
exec("ping -c 1 -w 1 $host", $list);
  if (
strpos($list[4],"1 received")>0) {
    return
true ;
  }
  return
false;
}
?>

But if your router refuse the ping ... the result will be always false > you may test both (fsockopen and ping)
dali at dali dot net dot nz
13-Nov-2007 05:13
After several days of trying to get telnet going from php 5.2, i've come up with http://www.dali.net.nz/Telnet.class.php.txt

based on the one found at http://cvs.adfinis.ch/cvs.php/phpStreamcast/telnet.class.php

example usage:
<?php
$telnet
= new Telnet('telnethost.example.com');

$telnet->login('username', 'password');
echo
$telnet->exec('ifconfig') . "\n";
echo
$telnet->exec('ls -lh') . "\n";
$telnet->disconnect();
?>
anarchy
04-Sep-2007 06:34
I don't know why it's not mentioned here (or am I missing something), but the DEFAULT stream timeout is set according to default_socket_timeout in your php.ini file.  Took forever for me to dig that up....
bradland at umich dot edu
23-Jul-2007 09:32
I was having trouble doing an https in fopen and with fsockopen where the address had ssl://.  I was getting error code 114 in the log.  After much research i found that there was some ssl conflict trouble with MySQL 5.0.20-5.0.33.  It had some functions that were interfering with openssl that showed up in the php install.

http://bugs.mysql.com/bug.php?id=21930
http://bugs.mysql.com/bug.php?id=19289
warezthebeef at gmail dot com
17-Jul-2007 04:37
I ran into a problem where I needed to make an fsockopen() style connection from one specific ip address on a server with multiple ip aliases. Unfortunately fsockopen() does not allow the specification of a source address making it unsuitable. I could not find any other solutions elsewhere so here is mine for those with php 5.1.0 or greater.

<?php
// connect to the internet using the '192.168.0.100' IP
$opts = array('socket' => array('bindto' => '192.168.0.100:0'));

$context = stream_context_create($opts);

$fp = stream_socket_client("tcp://www.example.com:80", $errno, $errstr, 30, STREAM_CLIENT_CONNECT, $context);
?>

Now $fp can be used like a resource handle returned by a vanilla fsockopen() call!
aska at unit-mse dot jp
03-Jul-2007 06:58
easy get UIDL.
A code is better than the feof.

<?php

$fp
= fsockopen($host, 110, $errno, $errstr, 5);
if (
$fp > 0) {
   
fread($fp,1024);
   
fputs($fp, "USER $user\r\n");
   
fread($fp,1024);
   
fputs($fp, "PASS $pass\r\n");
   
fread($fp,1024);
   
fputs($fp, "UIDL\r\n");
   
fgets($fp,1024);
    do {
       
$line = rtrim(fgets($fp, 1024));
        if (
$line == '.') break;
        list(,
$UIDL) = split(' ', $line, 2);
        echo
$UIDL;
    } while (
$line != '.');
   
   
fputs($fp, "QUIT\r\n");
}
fclose($fp);

?>
Alexander Wegener
26-May-2007 07:29
To check if a Url is Online (with http and https)
Using @fgets to hide Warning when using SSL
(Bug: "Warning: function.fgets SSL: fatal protocol error", http://bugs.php.net/bug.php?id=23220)

<?php

   
function isOnline($url) {
        if (!
$url_info = parse_url($url)) {
            return
false;   
        }
       
        switch (
$url_info['scheme']) {
            case
'https':
               
$scheme = 'ssl://';
               
$port = 443;
                break;
            case
'http':
            default:
               
$scheme = '';
               
$port = 80;   
        }
       
       
$data = "";
       
$fid = @fsockopen($scheme . $url_info['host'], $port, $errno, $errstr, 30);
        if (
$fid) {
           
fputs($fid, 'HEAD ' . (isset($url_info['path'])? $url_info['path']: '/') . (isset($url_info['query'])? '?' . $url_info['query']: '') . " HTTP/1.0\r\n" .
                       
"Connection: close\r\n" .
                       
'Host: ' . $url_info['host'] . "\r\n\r\n");   
            while (!
feof($fid)) {
               
$data .= @fgets($fid, 128);
            }
           
fclose($fid);
            return !empty(
$data);
        } else {
            return
false;
        }
    }

?>
02-Mar-2007 07: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
01-Mar-2007 08:17
[EDIT by danbrown AT php DOT net: This note contains a big-fixed version of the user function decode_body().  Fix by (martjean77 at hot dot sapm dot mail dot com) [sic].]

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 ) );
  }
  else {
   
$str = $tmp;
  }
  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
29-Jan-2007 07:52
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:
<?php
chkServer
("MyDC", "389");
?>

for a webserver:
<?php
chkServer
("MyWebSvr", "80");
?>

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

<?php
// 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
           
}
        } 
    }
}
?>
v13+phpnet at it dot teithe dot gr
24-Jan-2007 03: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);
}
?>
jk at ricochetsolutions dot com
19-Dec-2006 07: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
04-Dec-2006 08: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);
    }

?>
albertohf at hotmail dot com
03-Aug-2006 09: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...

<?php
   
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