Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    emulare get_headers in php4.x

    Ciao a tutti.

    Ho necessità di leggere gli header HTTP inviati da un sito internet; spulciando il manuale ho trovato la funzione get_headers : fa esattamente quello che mi serve, però è solo per PHP5.

    Finchè sull'hosting ci sarà installato PHP4, mi devo arrangiare. Come mi si faceva notare in un altro thread, tra i commenti alla funzione ci sono dei codici che emulano la funzione se non esiste.
    Ho fatto un taglia e cuci per recuperare di quel codice i pezzi migliori, e questo è il risultato:

    Codice PHP:
    if(!function_exists('get_headers')) {
       function 
    get_headers($url,$format=0) {
           
    $url_info=parse_url($url);
           
    $port = isset($url_info['port']) ? $url_info['port'] : 80;
           
    $fp=fsockopen($url_info['host'], $port$errno$errstr30);
           if(
    $fp) {
               
    $head "HEAD ".@$url_info['path']."?".@$url_info['query'];
               
    $head .= " HTTP/1.1\r\nHost: ".@$url_info['host']."\r\n\r\n";
               
    fputs($fp$head);
               while(!
    feof($fp)) {
                   if(
    $header=trim(fgets($fp1024))) {
                       if(
    $format == 1) {
                           
    $h2 explode(':',$header);
                           
    // the first element is the http header type, such as HTTP/1.1 200 OK,
                           // it doesn't have a separate name, so we have to check for it.
                           
    if($h2[0] == $header) {
                               
    $headers['status'] = $header;
                           }
                            else {   
                            
    $foo implode':'$h2 );
                            
    $foo preg_replace'/[a-zA-Z- ]*: /'''$foo );
                            
    $headers[strtolower($h2[0])] = trim$foo );
                            }
                       }
                       else {
                           
    $headers[] = $header;
                       }
                   }
               }
               return 
    $headers;
           }
           else {
               return 
    false;
           }
           
    fclose($fp);
       }

    Funziona bene sui siti "normali", per esempio:

    $url = "http://www.html.it";
    print_r(get_headers($url, 1));

    ottengo:

    Array ( [status] => HTTP/1.1 200 OK [date] => Tue, 18 Oct 2005 11:48:59 GMT [server] => Apache [x-powered-by] => PHP/4.1.2 [content-type] => text/html; charset=iso-8859-1 )

    Ovvero quello che penso ottenga un PHPista usando la funzione get_headers del php5.

    Quello che non funziona sono le richieste ai siti che utilizzano i redirect tramite header: tutti i 301, 302 mi riportano un errore 400 (bad request).

    Qualcuno ha idea di come si possa aggiustare questo?

    Grazie dell'attenzione e buona giornata a tutti

  2. #2

  3. #3
    implementando a pieno il protocollo

    cmq puoi provare a usare le CURL
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  4. #4
    Originariamente inviato da daniele_dll
    implementando a pieno il protocollo
    ...ovvero devo aspettare che l'hoster installi PHP5? Ho capito bene?

    Originariamente inviato da daniele_dll
    cmq puoi provare a usare le CURL
    Ora studio il manuale.
    Ma tu intendi sostituire cURL a fsockopen(), e laciare il resto dello script così com'è?

  5. #5
    no dicevo che devi implementarlo a pieno il protocollo HTTP ^^

    no ... te devi usare le CURL e basta ... dagli un occhio e ti assicuro che capisci subito quello che ti dico :P
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  6. #6
    Originariamente inviato da daniele_dll
    no dicevo che devi implementarlo a pieno il protocollo HTTP ^^
    Scusami, ma proprio non riesco a capire cosa intendi....
    cosa vuol dire implementare il protocollo http? devo farlo nello script, in apache, in php?

    per cURL... ora guardo subito, grazie

  7. #7

    cURL

    Dunque... vediamo... ho capito più o meno come funziona cURL, e ho scritto la mia funzioncina per ottenere gli HEADER HTTP in un array...

    Codice PHP:
    $ch curl_init(); // create cURL handle (ch)
    if (!$ch) {
       die(
    "Couldn't initialize a cURL handle");
    }
    // set some cURL options
    $ret curl_setopt($chCURLOPT_URL,            "http://www.godaddy.com");
    $ret curl_setopt($chCURLOPT_HEADER,        1);
    $ret curl_setopt($chCURLOPT_FOLLOWLOCATION1);
    $ret curl_setopt($chCURLOPT_RETURNTRANSFER1);
    $ret curl_setopt($chCURLOPT_TIMEOUT,        30);

    // execute
    $ret curl_exec($ch);

    if (empty(
    $ret)) {
       
    // some kind of an error happened
       
    die(curl_error($ch));
       
    curl_close($ch); // close cURL handler
    } else {
       
    $info curl_getinfo($ch);
       
    curl_close($ch); // close cURL handler


    }

    print_r ($info); 
    funzionare, funziona, ma....
    è giusta secondo voi? ci sono buchi/errori?

  8. #8
    mi sembra tutto +/- ok ... cmq le CURL non le uso + di tanto
    The fastest Redis alternative ... cachegrand! https://github.com/danielealbano/cachegrand

  9. #9

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.