Problema con Curl e CURLOPT_FOLLOWLOCATION

furbettokk

Nuovo Utente
29 Giu 2009
11
0
0
Ciao a tutti
ho una classe (non fatta da me) che uso per recuperare dei dati da una pagina web
PHP:
class CurlBrowser {
        function __construct() {
                $this->ckfile = tempnam ("/tmp", "SismicCookie");
        }
        function __destruct() {
                echo file_get_contents($this->ckfile);
                @unlink($this->ckfile);
        }
        function http_get($url, $outfile = null) {
                return $this->http_request($url, 'GET', null, $outfile);
        }
        function http_post($url, $data = array(), $outfile = null) {
                return $this->http_request($url, 'POST', $data, $outfile);
        }
        function http_request($url, $type, $data = null, $outfile = null) {
                $ch = curl_init($url);
                $outfileHandle = 0;

                if (!empty($outfile)) {
                        $outfileHandle = fopen($outfile,'w');
                        curl_setopt($ch, CURLOPT_FILE, $outfileHandle);
                }
                else
                        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

                if (strtoupper($type) == 'POST') {
                        curl_setopt($ch, CURLOPT_POST, true);
                        curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
                }

                curl_setopt($ch, CURLOPT_COOKIEFILE, $this->ckfile);
                curl_setopt($ch, CURLOPT_COOKIEJAR, $this->ckfile);

                curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
                curl_setopt($ch, CURLOPT_MAXREDIRS, 20);

                $out = curl_exec($ch);
                curl_close($ch);
                if ($outfileHandle!==0)
                        fclose($outfileHandle);
                return $out;
        }
}

e la uso nello script richiamandola come da esempio sotto:

PHP:
$browser=new CurlBrowser();

$browser->http_post(
	'http://www.xxx.it',
	array("Login"=>"Entra", "login_pwd"=>$password, "login_email"=>$email)
);

			
$browser->http_post(
	'http://www.xxx.it',
	array(
		'date_from'=>$date_from,
		'date_to'=>$date_to,
		'town'=>'nessuno',
		'search'=>'Cerca'
	)
);


$csv_file = $browser->http_get('http://www.xxx.it');

tutto funzionava alla perfezione, finchè non ho cambiato provider
il nuovo spazio ha open_basedir attivata (per sicurezza) e safe_mode disattivato.

a causa del open_basedir attiva la seguente riga della classe va in errore:
PHP:
//RIGA 129 è la seguente
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);

e l'errore è:
Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be
activated when safe_mode is enabled or an open_basedir is set in
/home/xyz/public_html/xyz/include/function.php on line 129

di questo errore se ne parla ampiamente su php.net (http://us2.php.net/manual/en/function.curl-setopt.php#102121)

ho chiesto al provider se è possibile (non ci speravo ;) ) disattivare open_basedir , ma ovviamente mi hanno detto di no (hanno già disattivato il safe_mode che era on di default)

mi hanno detto che una soluzione è presente qui:

http://simone.cabrino.it/blog/php-errore-curlopt_followlocation/

in sostanza viene suggerita una funzione per ovviare al problema.
questa:
PHP:
function curl_redir_exec($ch) {
static $curl_loops = -1;
static $curl_max_loops = 10;
if ($curl_loops++ >= $curl_max_loops) {
$curl_loops = 0;
return false;
}
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);

list($header, $content) = explode(chr(10).chr(13).chr(10), $data);

$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);

if ($http_code == 301 || $http_code == 302) {
$matches = array();
$matches = explode(chr(10),$header);
foreach( $matches as $value) {
$pos = strpos($value, "Location:");
if ($pos === 0) {
list($variabile,$url) = explode(" ",$value);
}
}
$url = parse_url(trim($url));
if (!$url) { //couldn't process the url to redirect to
$data = array($curl_loops,curl_getinfo($ch),$data, curl_error($ch));
return $data;
}
$last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
if (!isset($url['scheme']))
$url['scheme'] = $last_url['scheme'];
if (!isset($url['host']))
$url['host'] = $last_url['host'];
if (!isset($url['path']))
$url['path'] = $last_url['path'];
$new_url = $url['scheme'] . '://' . $url['host'] . $url['path'] . (isset($url['query'])?'?'.$url['query']:'');
curl_setopt($ch, CURLOPT_URL, $new_url);
return curl_redir_exec($ch);
} else {
$data = array($curl_loops,curl_getinfo($ch),$data, curl_error($ch));
return $data;
}
}
e la spiegazione dice:

La funzione curl_exec_redir($ch) ritorna un’array a 4 dimensioni, contenente il numero di loop (redirect) effettuati [posizione 0], le informazioni sull’ultima interrogazione al server di destinazione [posizione 1], i dati (header e corpo della pagina) dell’ultima chiamata [posizione 2] e eventuali codici o stati d’errore [posizione 3].

adesso, vorrei provare ad usarla, ma già non avevo capito come agicva Curl, figuriamoci se ho capito come/dove usare la funzione.

Non è che mi dareste una piccola mano ?

(lascio inoltre sia il problema che eventuale soluzione qui, caso mai qualcun' altro avesse lo stesso problema)

Grazie

Web.
 

Eliox

Utente Attivo
25 Feb 2005
4.390
3
0
Hai provato a passare alla funzione il valore di ritorno di curl_init()?
 

furbettokk

Nuovo Utente
29 Giu 2009
11
0
0
Hai provato a passare alla funzione il valore di ritorno di curl_init()?

non ho provato perchè come ho detto non so quello che sta facendo curl, e quindi prima di procedere vorrei un suggerimento e qualche aiuto a capire
come detto sto iniziando da poco con PHP, quindi ho cominciato a studiare/provare cose un po' più facili
;)

se ho capito bene, data la funzione che mmi hanno suggerito

function curl_redir_exec($ch) {
.....
qui c'è tutta la funzione consigliata
.....
}


tu mi suggerisci, all' interno della mia classe

class CurlBrowser {
}

di sostituire la riga:
$ch = curl_init($url);
con la riga:
$ch = curl_redir_exec(curl_init($url));


ho capito bene ?
 

furbettokk

Nuovo Utente
29 Giu 2009
11
0
0
Risolto
lascio qui la soluzione, nel caso serevisse ad altri

ho integrato la funzione nello script

ho modificato la classe, cambiando la riga
$out = curl_exec($ch);
in :
$out = curl_redir_exec($ch);

ho modificato lo script, nella riga in cui memorizza i risultati in una variabile.
questo eprchè adesso non ottengo più la pagina, ma un array
il contenuto della pagina (quello che mi interessa) è nell' indice 2

quindi ho cambiato la riga
$csv_file = $browser->http_get('http://www.xxx.it');
in
$csv_iside_array = $browser->http_get('http://iside.rm.ingv.it/iside/download?export=1&type=csv&data=EVENTS');

e qindi aggiunto:

$csv_iside = $csv_iside_array[2];

Web
 
Discussioni simili
Autore Titolo Forum Risposte Data
L Problema con recupero dati in PHP cURL e JAVA con server PHP 1
J problema con apache2+php ed invio file con cURL Apache 2
J Problema invio file con cURL php su server verso server PHP 1
O Principiante: problema con funzione CURL ###URGENTE### PHP 1
M Problema con Try Catch PHP 0
Sergio Unia Problema con gli eventi del mouse su una data table: Javascript 2
T PROBLEMA CON SESSIONI PHP 3
T ALTRO PROBLEMA CON ARRAY PHP PHP 1
T PROBLEMA CON ARRAY PHP 8
L problema con query select PHP 2
R Problema query con ricerca id numerico PHP 2
F Problema con risposta PHP 0
S problema con recupero dati tabella mysql PHP 2
Z Problema con il mio tp-l i nk Reti LAN e Wireless 1
L Problema RAM con Tomcat 8 Apache 0
napuleone problema con sort e asort PHP 4
Z Problema con INT MySQL PHP 1
Z Problema database MySQL con XAMPP PHP 0
M Problema con controllo form in real time jQuery 6
Z Problema di sincronizzazione PAYPAL con PHP PHP 1
G Problema con Get page PHP 4
P Problema con require once PHP 6
P Problema con i package Java 1
A Problema login con Safari PHP 14
F INDESIGN: problema esportazione esecutivo per la stampa con foto B/N Webdesign e Grafica 1
S problema con css bootstrap3 HTML e CSS 4
M .load() problema con caricamenti dinamici di js Javascript 0
G Problema ------- con Query PHP 1
G Problema con Query PHP 1
T problema con select dinamica con jquery Javascript 0
S Problema con spazi bianchi HTML e CSS 5
A PROBLEMA: insert mysqli con dati Tagsinput Presentati al Forum 0
Tommy03 Problema con z-index HTML e CSS 3
M Problema inserimento parole con apostrofo nel db PHP 5
C Problema con dati meteo xml XML 1
S Problema con infrarossi videocamera IP Cam e Videosorveglianza 1
V Problema con librerie allegro5 c++ C/C++ 1
M Problema con php per calcolo costo percentuale PHP 7
S Problema con mysqli_num_rows PHP 18
grgfede Problema javascript con aruba Javascript 1
M Problema con visibility e radio button Javascript 2
Marti1! Problema con casella mail cancellata Posta Elettronica 3
L [PHP] Problema con Telegram PHP 1
tomorc [HTML] Problema con scroll bar (risolto) HTML e CSS 0
S Strano problema con i title su Google SEO e Posizionamento 3
P [ASP.Net] Problema ERR_INCOMPLETE_CHUNKED_ENCODING 206 (Partial Content) con Font ASP.NET 4
P [HTML] Problema ERR_INCOMPLETE_CHUNKED_ENCODING 206 (Partial Content) con Font HTML e CSS 1
N [Apache] problema con estensione php Apache 0
C [PHP] Problema con download file PHP 0
M [PHP] Problema con preg_match PHP 1

Discussioni simili