TS: PHP URL open

Beitrag lesen

Hallo und guten Abend,

      $sys = 'wget --user-agent=' . escapeshellarg($userAgent) . ' --referer=' . escapeshellarg($referer) . ' -d -O ' . escapeshellarg($tmpfile) . ' ' . escapeshellarg( $url ) . ' &2>1';

Das zählt nicht als "klappt mit PHP". Das muss ohne Umwege über Systembefehle gehen.

meistens funktionieren die fsockopen()-Funktionen noch, auch wenn die fopen()-Wrapper für html & Co. ausgeschaltet sind. Und damit kann man dann (fast!) ganz gezielt auf den entfernten Socket und seine Möglichkeiten zugreifen.

Beispiel head_request():

function head_request($url, $status_only=false, $parsed=true)
{
    ### checks, if an url exists. 
    ### if no scheme is provided, 'http://' will be assumed
    ### if not "$parsed", raw headers shell be returned, 
    ###     otherwise an array shell be produced
    ###
    ### Used own Constants: TIMEOUT_SOCK_OPEN, TIMEOUT_STREAM_READ
    defined('TIMEOUT_SOCK_OPEN') or define('TIMEOUT_SOCK_OPEN', 1);
    defined('TIMEOUT_STREAM_READ') or define('TIMEOUT_STREAM_READ', 2);
    
    $url = trim($url);
    $_url_parts = parse_url($url);

    if (!isset($_url_parts['scheme'])) $url = 'http://' . $url;

    $_url_parts = parse_url($url);
    
#    * scheme - e.g. http
#    * host
#    * port
#    * user
#    * pass
#    * path
#    * query - after the question mark ?
#    * fragment - after the hashmark #

    if (!isset($_url_parts['host'])) return false;

    $fp = @fsockopen($_url_parts['host'], 80, $errno, $errstr, TIMEOUT_SOCK_OPEN);

    if (!$fp) return false;

    stream_set_timeout($fp, TIMEOUT_STREAM_READ);
	
   	$path = '/';
	if (isset($_url_parts['path'])) {$path = $_url_parts['path'];}
	
    $out = "HEAD $path HTTP/1.1\r\n";
    $out .= "Host: " . $_url_parts['host'] . "\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    
    $res = '';
    
    while (!feof($fp)) 
    {
        $res .= fgets($fp, 128);
    }
    
    $_info = stream_get_meta_data($fp);
    fclose($fp);

    if ($_info['timed_out']) return false;
    
    $res = str_replace(array('   ', '  '), ' ', $res);
    $_lines = explode("\r\n", $res);

#       return $_lines;
    
    foreach ($_lines as $key => $value)
    {
        if (strlen($value) == 0) 
        {
            unset($_lines[$key]);
            continue;
        }
        
        $_help[$key] = explode(': ', $value);

        if (!isset($_help[$key][1]))
        {
            $_out['status'] = explode(' ', trim($_help[$key][0]));
        }
        else
        {
            $_out[strtolower($_help[$key][0])] = explode(' ', trim($_help[$key][1]));
        }   
    }

    if (!isset($_out['status'][1])) return false;
    if ($status_only) return $_out['status'][1];
    if (!$parsed) return $res;
    
    return $_out;   
}

Nur das Vorhandensein einer (entfernten) HTTP-Ressource feststellen...
Auf ähnliche Weise kann man sie natürlich auch komplett auslesen.

Grüße
TS

--
es wachse der Freifunk
http://freifunk-oberharz.de