Get file contents when Connection is keep-alive

php

Solution

Keep-alive connections

Normally, if a connection isn't set as `keep-alive`, once PHP terminates the current script, the remaining output buffer gets forwarded to the web-server, which in turn forwards the data to the client. Then the web-server closes its connection to the client (browser).

If you request

Connection: keep-alive

the server does just this: It keeps the connection open, even if a reply has completely finished. Thus, the mentioned behavior is just fine. Furthermore, e.g. `feof()` won't return FALSE - since more data might arrive eventually.

Note, that you can re-use the keep-alive connection within your currently running PHP script. But once your PHP script finishes, the keep-alive connection will be disconnected.

Thus, you can't reuse the keep-alive connection using your next PHP script instance.

Case 1 - Amount of data known before request

If you know the amount of data beforehand, you might read just that amount of data `$expectedAmountOfDataInBytes` and then close the connection:

$expectedAmountOfDataInBytes = 2023;

$handle = fopen( "http://www.stackoverflow.com/", "r" );

if ( ! is_resource( $handle )) {
    echo 'sorry';
    exit;
}

while(  ( ! feof( $handle ) )
     && ( 0 < $expectedAmountOfDataInBytes-- )
     ) {

    $contents .= fread( $handle, 1 );

}

fclose($handle);

Case 2 - Amount of data unknown before request

In case you don't know the amount of data beforehand, you need to submit a HTTP request

GET /infotext.html HTTP/1.1
Host: www.example.net

and parse an answer like so:

HTTP/1.1 200 OK
Server: Apache/1.3.29 (Unix) PHP/4.3.4
Content-Length: 4 
Content-Language: de (nach RFC 3282 sowie RFC 1766)
Connection: close
Content-Type: text/html

ABCD

Find in the PHP Manuals a simple HTTP client based on sockets I/O.

Problem

I need to get the contents of a remote file, but with sending a few headers, and one of them is the "Connection: keep-alive" header... so I tried it with a simple call to file_get_contents(), like this: ``` <?php $sfheaders="Cache-Control:max-age=0 Connection:keep-alive"; $opts = array( 'http' => array( 'method' => "GET", 'header' => $sfheaders ) ); $context = stream_context_create($opts); $url="http://somedomain.com/to.php"; $file = file_get_contents($url, false, $context); ?> ``` ... the code works, but it takes 15 seconds for file_get_contents to get the data! It looks like file_get_contents() finishes after the connection closes, but I want it to finish after the data is transferred. It is faster if I remove the keep-alive header but this time I need to get the data while the connection is kept alive. I guess that is not possible with file_get_contents, so .... is there a way to do it with cURL or with something else? Edit: Let me be more accurate, the "Connection:keep-alive" header must be send to the specific server I am trying to access because it checks for that header, and if it is not send, then there is no data send to me! Got it?

Original source