Newsgroup: it.comp.www.php
Titolo: problema con fsockopen()

ciao a tutti,
faccio una piccola premessa, ho bisogno di salvare delle pagine da
internet per poi analizzarne il contenuto.
ho fatto vari tentativi:
1)
$open
=file_get_contents('
http://v3.espacenet.com/results?sf=a&FIRST=1&CY=ep&LG=en&DB=EPODOC&TI=plastic&AB=&PN=&AP=&PR=&PD=&PA=&IN=&EC=&IC=&=&=&=&=&='
);
echo $open;
NESSUN RISULTATO
2)
$fp = fsockopen
("
http://v3.espacenet.com/results?sf=a&FIRST=1&CY=ep&LG=en&DB=EPODOC&TI=plastic&AB=&PN=&AP=&PR=&PD=&PA=&IN=&EC=&IC=&=&=&=&=&=
",
80, $errno, $errstr, 30);
if (!$fp) {
   echo "$errstr ($errno)<br>\n";
} else {
   echo "ok";   }
   fclose ($fp);
}
mi da questo errore:
Warning: fsockopen(): php_network_getaddresses: gethostbyname failed in
c:\program
files\easyphp1-7\www\patent\download1.1\download\download.php on line
23
avete idea del perche'? ho ipotizzato che forse non viene usata la
porta 80..grazie dell'aiuto
cips

 avete idea del perche'?
Perche' non hai letto il manuale.
Guarda gli esempi 
http://www.php.net/fsockopen
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

:)
grazie della risposta..
allora nel frattempo mi sono riletto il manuale e..
$fp = fsockopen("
v3.espacenet.com
", 80, $errno, $errstr, 60);
if (!$fp)
	{
	echo "qui£";
	echo "$errstr ($errno)<br />\n";
	}
else
	{
	echo "aperto";
      while (!feof($fp)) {
       echo "<br>1:",fgets($fp,4096);
   }
   fclose($fp);
}
mi sono accorto di un errore di sintassi :_
e scusa ma sono veramente nel marasma, allora apre la pagina, ora
rimane il problema di leggerne il contenuto.
con la funzione fgets..
ho provato ad aumentare il tempo di offset ma ho questo:
Fatal error: Maximum execution time of 30 seconds exceeded in
c:\program
files\easyphp1-7\www\patent\download1.1\download\download1.php on line
12
e' possibile che in qualche modo sia protetto il sito?anche perche' ho
provato ad usare anche questo:
$lines = file('
http://v3.espacenet.com/'
);
// Loop through our array, show HTML source as HTML source; and line
numbers too.
foreach ($lines as $line_num => $line) {
   echo "Line #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br
/>\n";
}
e mi torna una pagina vuota.
:°°°°°°°

 allora nel frattempo mi sono riletto il manuale e..
e lo hai riletto male.
[mi quoto]
Guarda gli esempi 
http://www.php.net/fsockopen
[/mi quoto]


un aiuto in piu'??
allora ho preso l'esempio:
<?php
$fp = fsockopen ("
www.php.net
", 80, $errno, $errstr, 30);
if (!$fp) {
   echo "$errstr ($errno)<br>\n";
} else {
   fputs ($fp, "GET / HTTP/1.0\r\nHost: 
www.php.net
\r\n\r\n");
   while (!feof($fp)) {
       echo fgets ($fp,128);
   }
   fclose ($fp);
}
?>
e funziona perfettamente...
ora io non riesco a capire perche' usando 
v3.espacenet.com
 non vada.
comunque ilrisultato e':
espacenet HP : HTTP/1.1 200 OK D?te: Tue, 04 Oct 2005 07:42:48 GMT
Server: IBM_HTTP_Server/2.0.47.1-PQ94086 Ap?c?e/2.0.47 (Unix)
L?st-Modified: Mon, 22 Aug 2005 16:15:28 GMT ET?g: "41e4-d8-fcd?c800"
Accept-R?nges: bytes Content-Lengt?: 216 Connection: close
Content-Type: text/?tml
leggendo in giro ho letto che forse c'e' forse la causa e' una sorta di
 protezione (autenticazione del proxy?!??!?!?!!?)
vaben i consigli sono ben accetti.
cos'e' che mi sfugge nel manuale???
ulteriore tentativo con file_getcontents:
questo e' il risultato:
<!DOCTYPE £tml public "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html;
c£arset=iso-8859-1">
<META HTTP-EQUIV="refresh" CONTENT="0;URL=/home">
</HEAD>
</HTML>
praticamente mi fa a finire in una fantomatica /localhost/home che
ovviamente non esiste.
 :____________

 ovviamente non esiste.
Certo che non esiste, DEVI essere tua ad interpretare il meta refresh e
richiedere la pagina corretta di conseguenza.
-- 
I am what I am, I do what I can


richiedere la pagina corretta di conseguenza.
per il redirect mi va bene che sia cosi' cerca la home che risiede sul
server. ma mi serviva solo per provare a "collegarmi" con quella
pagina. ed e' gia' tanto che sono "riuscito" a leggere quei dati ( con
redirect)
comunque devo passare dei parametri es:
v3.espacenet.com/results?sf=a&FIRST=1&CY=ep&LG=en&DB=EPODOC..
..
l'unica differenza che riesco a vedere e v3. invece di www.
ho provato ad usare anche fopen:
$host="
http://www.paginebianche.it/execute.cgi?btt=1&tl=2&tr=101&tc=&cb=&tq=2&qs=polizia&qsn=&dv=&ind=&nc=
";
$host="
http://v3.espacenet.com/results?sf=a&FIRST=1&CY=ep&LG=en&DB=EPODOC&TI=plastic+and+bicycle&AB=&PN=&AP=&PR=&PD=&PA=&IN=&EC=&IC=&=&=&=&=&=
";
$handle = fopen($host, "rb");
$contents = "";
do {
    $data = fread($handle, 128);
    if (strlen($data) == 0) {
        break;
    }
    $contents .= $data;
} while (true);
echo $contents;
fclose($handle);
con il primo host (pagine bianche) nessun problema mi torna la pagina,
con il mio ( :S )  non torna nulla.
e proprio qui:
$data = fread($handle, 128);
    if (strlen($data) == 0) {
        break;
    }
che esce dal ciclo.
mha...

 l'unica differenza che riesco a vedere e v3. invece di www.
Sicuro? Controlla meglio, confronta riga per riga i due script.


>Sicuro? Controlla meglio, confronta riga per riga i due script.
ti sei messo d'impegno per farmi impazzire :/ ?
alura:
questo di seguito e' l'esempio che ho trovato sul manuale:
<?php
$fp = fsockopen ("
www.php.net
", 80, $errno, $errstr, 30);
if (!$fp) {
   echo "$errstr ($errno)<br>\n";
} else {
   fputs ($fp, "GET / HTTP/1.0\r\nHost: 
www.php.net
\r\n\r\n");
   while (!feof($fp)) {
       echo fgets ($fp,128);
   }
   fclose ($fp);
}
?>
personalizzato in maniera molto stupida come segue:
<?php
//$host="
www.repubblica.it
";
//$host="
v3.espacenet.com/results?sf=a&FIRST=1&CY=ep&LG=en&DB=EPODOC&TI=plastic+and+bicycle&AB=&PN=&AP=&PR=&PD=&PA=&IN=&EC=&IC=&=&=&=&=&=
";
$host="
http://www.paginebianche.it/execute.cgi?btt=1&tl=2&tr=101&tc=&cb=&tq=2&qs=polizia&qsn=&dv=&ind=&nc=
";
$fp = fsockopen ($host, 80, $errno, $errstr, 30);
if (!$fp) {
   echo "$errstr ($errno)<br>\n";
} else {
   fputs ($fp, "GET / HTTP/1.10r\nHost: " . $host . "\r\n\r\n");
   while (!feof($fp)) {
       echo fgets ($fp,128);
   }
   fclose ($fp);
}
?>
a parte sostituire l'host non ho cambiato nulla, ma qui nascono altri
problemi e cioe' che non riesco a passare i parametri (con fopen nel
caso di pagine bianche sono riuscito).
con repubblica tutto ok.
<mode marasma=on>
sono nel marasma piu' completo
</mode marasma>
a meno che il mio errore non sia concettuale e cioe' che questa
funzione non faccia al caso mio...o anche che per passare dei parametri
devo usare funzioni particolari tipo urlencode e simili.
ma ancora perche' nel caso della fopen non legge dati?(con
v3.espacenet.com/result?.
.. mentre con pagine biache il tutto funziona)

 personalizzato in maniera molto stupida come segue:
Tra 
www.php.net
 e 
http://www.php.net/
 secondo te quale e' la differenza?


>Tra 
www.php.net
 e 
http://www.php.net/
 secondo te quale e' la differenza?
se ti riferisci a questo, ho tolto http:// quasi da subito (errore
stupido di distrazione)
altra idea..e se ci fosse qualche controllo (es: javascript) che se non
riconosce chiamata dal browser non mi manda dati?
hai visto il codice dove uso fopen?
a fra poco..
<mode ironia=OFF>
e comunque grazie per il supporto 
</mode ironia>

 stupido di distrazione)
http://www.php.net/
 e' un URL, 
www.php.net
 e' un host.
Se una funzione chiede un host come paramentro, non puoi passargli un
URL.


URL
si ma io passo un host:
<?php
$host="
v3.espacenet.com/results?sf=a&FIRST=1&CY=ep&LG=en&DB=EPODOC&TI=plastic+and+bicycle&AB=&PN=&AP=&PR=&PD=&PA=&IN=&EC=&IC=&=&=&=&=&=
";
$fp = fsockopen ($host, 80, $errno, $errstr, 30);
if (!$fp) {
   echo "$errstr ($errno)<br>\n";
} else {
   fputs ($fp, "GET / HTTP/1.1\r\nHost: " . $host . "\r\n\r\n");
   while (!feof($fp)) {
       echo fgets ($fp,128);
   } 
   fclose ($fp); 
} 
?> 
o sto ancora sbagliando?

 plastic+and+bicycle&AB=&PN=&AP=&PR=&PD=&PA=&IN=&EC=&IC=&=&=&=&=&=";
E secondo te quello e' un host? Sei sicuro di sapere che cosa sia un
host? 
v3.espacenet.com
 e' un host, quello che passi tu e' un url senza
protocollo.


protocollo.
alura ricapitoliamo
v3.espacenet.com
 e' un host?giusto?
mhmhmh 
forse ci sono aspe' che faccio una prova.
a fra poco.

 
Qui mi pare che il problema di fondo sia una mancanza della conoscenza
del protocollo HTTP: in questo caso, se ho ben capito l'intenzione, una
conoscenza di base č fondamentale. Per questo ti mando questi due link
dove puoi trovare le informazioni che ti servono e qualche altro link a
qualcosa di piů dettagliato:
http://it.wikipedia.org/wiki/HTTP
http://www.boscarol.com/pages/internet/011-http.html
Dopo questi articoli rileggiti i messaggi di Setec e vedrai che ti
saranno piů chiari ;)
-- 
Stéphane Bisinger
Webmas... well...

 :S
be' grazie dell'aiuto, mi sono chiarito un po' le idee.
e sono riuscito a cavarci fuori qualcosa..un po' di studio (e ripasso )
fa proprio bene.
hmhmm posso con un altro quesito?

 
Uhm la cosa buffa di questa domanda č che č essa stessa un quesito...
Certo che puoi, siam qui per questo, al massimo non rispondiamo :P


bien.
allora risolto e capito la questione dell'host.
e quindi in questo momento ho mandato una richiesta al server porta 80
a 
v3.espacenet.com
e ora devo richiedere che mi serve, cioe'
results?sf=a&FIRST=1&CY=ep&LG=en&DB=EPODOC&TI=plastic+and+bicycle&AB=&PN=&AP=&PR=&PD=2005&PA=&IN=&EC=&IC=&=&=&=&=&=
e questa richiesta la faccio attraverso fputs ?
e qual'e' la sintassi giusta?
$request="results?sf=a&FIRST=1&CY=ep&LG=en&DB=EPODOC&TI=plastic+and+bicycle&AB=&PN=&AP=&PR=&PD=2005&PA=&IN=&EC=&IC=&=&=&=&=&=
";
$header="GET ". $request . "/ HTTP/1.1\r\nHost:
v3.espacenet.com
\r\n\r\n<br><br>";
fputs ($fp, $header);

 
Hai provato? ;)
Riguarda la sintassi sul manuale, confronta quel che hai scritto tu con
quel che ci trovi, specie nei commenti. Vedrai che la trovi da solo la
risposta che cerchi :D


ormai stremato..
$StringHttpPost="sf=a&FIRST=1&CY=ep&LG=en&DB=EPODOC&TI=plastic+and+bicycle";
$len=strlen($StringHttpPost);
//echo $len;
$p="GET /results HTTP/1.0\r\n";
$p.="host: 
v3.espacenet.com
\r\n";
//$p.="Content-type: application/x-www-form-urlencoded\r\n";
//$p.="Content-length: $len\r\n\r\n";
$p.="$StringHttpPost\r\n";
$p.="\r\n";
ma ovviamente non va:
:<p>Your browser sent a request that this server could not
understand.<br />
1:Request header field is missing ':' separator.<br />
belin ! :_
nel mentre faro' ancora un po' di prove.
//$p.="Content-length: $len\r\n\r\n";
questa e' fondamentale??
non la capisco calcola la lunghezza della stringa da spedire, per il
server che riceve la richiesta e' importante?

ulteriore variante l'ho trovata qui:
http://www.faqts.com/knowledge_base/view.phtml/aid/12039/fid/51
e vengono spediti i dati in maniera diversa :S

ci sono riuscito...
:D:D:D:D:D