Newsgroup: it.comp.www.php
Titolo: leggere solo doctype di un documento web

per leggere tutto il contenuto di un file di solito si usa la funzione 
file_get_contents().
 
Se però si tratta di un documento html o xml, vorrei sapere si c'è un 
modo per leggere solo la prima riga, cioè soltanto il DOCTYPE.
 
E' possibile?


in pratica, prima di scaricare tutto il file, voglio capire se si tratta 
di un semplice file html, o se contiene feeds-rss.
Nel primo caso va visualizzato come una normale pagina html:
 
echo file_get_contents($url);
 
 
Anche nel secondo caso va estratto il contenuto, ma naturalmente tramite 
la funzione simplexml_load_file():
 
$channel = simplexml_load_file($url);
//visualizzazione informazioni canale
//visualizzazione feeds
//eccetera...

 //eccetera...
 
naturalmente un file html (ma anche xml) potrebbe essere stato scritto 
in modo un po' indecente (ad es. su un unica riga):
 
<DOCTYPE ...><html><head>...</head><body>...</body></html>
 
Anche in questo caso, vorrei che il tutto venisse interpretato correttamente

 <DOCTYPE ...><html><head>...</head><body>...</body></html>
 
Non usare file_get_contents, usa fopen(), e poi fread() per leggere, per 
esempio, i primi byte (dovrebbero bastarne 32, ma io farei 256 o 1024), 
poi chiudi la connessione.
 
Stai attento che le pagine XHTML strict potrebbero comunque iniziare con 
<?xml... e avere il doctype sulla seconda riga.
 
Tieni conto che comunque sul server la pagina viene generata interamente, 
quindi sii un "buon cittadino" e non farlo troppo spesso.
 
Se il server è fatto bene, teoricamente dovrebbe bastarti fare un HEAD al 
posto di un GET (per esempio con curl) e vedere il Content-type. Se e` 
text/html è una pagina web. Se e` application/xml non lo è (e potrebbe 
essere un feed)
 
Bye.

 essere un feed)
 
bisogna vedere se c'è possibilità di installare curl anche sul server 
remoto.
 
Ad ogni modo ho anche optato per questa soluzione:
 
$channel = @simplexml_load_file($url);
 
if ($channel !== FALSE){
     //è un documento xml, verrà visualizzato nel modo opportuno
 
}else{
     //viene visualizzato normalmente
     echo file_get_contents($url);
}
 
ma naturalmente se non è un xml, il file viene scaricato nuovamente 
(file_get_contents), e ciò naturalmente non va bene...
 
Vorrei sapere quindi se a limite, esiste una funzione simile a 
simplexml_load_file, ma che elabori direttamente il contenuto del file 
che verrà però scaricato dall'inizio, una sola volta, sempre tramite 
file_get_contents.

 file_get_contents.
 
Basta leggere il manuale:
 
http://it2.php.net/manual/en/function.file-get-contents.php
 
Reads entire file into a string
 
http://php.net/manual/en/function.simplexml-load-string.php
 
Interprets a string of XML into an object
 
Tieni conto che così te lo trovi in memoria due volte: una come stringa, 
e una come albero di oggetti. Sicuramente meglio che leggerlo due volte 
(alias scaricarlo due volte), ma per file molto grossi può diventare un 
problema.
 
Bye.

 problema.
 
se cmq decide di scaricare il file per intero, una volta verificato il 
DOCTYPE, si può sempre usare la medesima variabile, sovrascrivendola:
 
$file_content = simplexml_load_string($file_content);
 

 $file_content = simplexml_load_string($file_content);
 
Sì, ma questo sovrascrive (naturalmente) la variabile alla fine del 
processo, quindi, anche se per un breve istante, hai entrambe le 
strutture in memoria.
 
Nella maggior parte dei casi non è un problema, ma se chiedi un feed con 
le ultime 100.000 entry, potrebbe diventarlo. :)
 
Bye.

 le ultime 100.000 entry, potrebbe diventarlo. :)
 
ma allora scusa, c'è un modo per leggere ad esempio solo le prime 10 
entries.
Non mi sempra che simplexml_load_file abbia un apposito parametro...
Se poi conosci qualche altro sistema...
 

 poi conosci qualche altro sistema...
 
http://it1.php.net/manual/en/book.xml.php
 
 


 
ok, allora darò un occhiata.
Ad ogni modo in sostanza voglio fare questo:
 
- iniziare a scaricare il file cercando di capire se si tratta di un 
file xml, contenente degli articoli (feeds-rss).
- in caso positivo, voglio continuare a scaricare, ma ad esempio, solo 
l'anteprima degli ultimi 10 articoli (quelli più recenti)
- fine
 
Naturalmente se si tratta invece di una pagina html, continuare lo 
scaricamento fino alla fine, visualizzandola per intero

 scaricamento fino alla fine, visualizzandola per intero
Secondo me c'è un fraintendimento di fondo
Non puoi "iniziare" a scaricare il file, o meglio, tu dici al server di 
generartelo tutto e poi smetti di ascoltare dopo che il server ti ha 
mandato Nbyte
Se il server ti può dare gli ultimi 10 piuttosto che i primi 5 con id 
dispari o gli ultimi 7 che parlano di cani dipenderà dal server no?
È probabile che abbia una funzionalità simile siccome è ovvia, ma non è 
detto e non hai detto da dove li vuoi prendere sti dati
 
Il comando per "iniziare" come dici tu è HEAD (come ti ha già detto 
Alessandro), ma per mia esperienza non è affidabile se non in ristretti 
casi e solo dopo averlo attentamente testato
Come purtroppo i codici di risposta, come in realtà l'80% del protocollo 
HTTP che se rispettato avrebbe risolto il 90% dei problemi tipici che si 
affrontano durante lo sviluppo web
 
Magari col tuo servizio misterioso funziona, prova cUrl lo supporta 
(fopen e famiglia mi pare supportino solo GET e POST)
 
M
-- 
I fatti mi cosano

 (fopen e famiglia mi pare supportino solo GET e POST)
 
come avevo già detto, nel momento in cui dovrò mettere online il mio 
sito, non sono sicuro che sul server remoto ci sia installata la 
libreria cUrl

 libreria cUrl
E il fatto che su una macchina remota ci sia cUrl (che ricordiamo è una 
libreria per fare un _client_ http) che ti cambia?
Ti cambia se è installata sul server _tuo_ e cmq di solito lo è
 
Ad ogni modo cUrl ti è necessario solo per fare richieste che non siano 
GET e POST e/o per fare richieste non banali, per quelle bastano le 
funzioni base di php
 
Sostanzialmente anche in questo caso il problema è che si chiede aiuto 
dicendo come si vuol fare una cosa, non cosa si voglia fare


 dicendo come si vuol fare una cosa, non cosa si voglia fare
 
si vuole capire se il documento è un contenitore di rss.
Se lo è, si richiama l'apposito "lettore" (visualizzatore) di feeds-rss, 
che provvederà, prima di tutto, a scaricare tutto il documento, e a 
compiere le varie operazioni di visualizzazione.
 

 compiere le varie operazioni di visualizzazione.
 
praticamente voglio realizzare una sorta di rss-reader online (tipo 
GoogleReader), che però prima di mettersi all'opera, deve assicurarsi 
che l'url che gli viene dato in pasto, corrisponda effettivamente ad un 
documento xml contenente appunto dei feed-rss.
Se cosi non fosse, il mio "reader" deve compiere operazioni alternative 
(ciò non interessa)