meta tag dinaamici e apache si blocca

Stato
Discussione chiusa ad ulteriori risposte.

black_devil

Utente Silver
10 Giugno 2007
75
13
3
76
Come da titilo volevo creare il tag "keywords" dinamico a seconda del contenuto della pagina, per fare ciò facevo questo:

PHP:
...
$meta = shuffle(explode(" ",strip_tags(file_get_contents("http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']))));
    $i=0;
    if(count($meta)>30)
    {
	  foreach($meta as $value)
	  {
		if($i>=20)
		    break;
		if(strlen($value)>4)
		{
		    $arr[$i] = $value;
		    $i++;
		}
	  }
	  echo('<meta name="keywords" content="'.implode(", ",$arr).' />'."\n");
    }
    else echo('<meta name="keywords" content="programming, C, pascal, nessuno, php, server, linux, html, php, css, nopaste, hacking, italiano" />'."\n");

...

questo script è inserito in una funzione che viene inserita in tutte le pagine.
Ma sta di fatti che non appena carico questo script sul server e provo a ricaricare la pagina per vedere se funziona. Non carica la pagina e non carica piu nessuna pagina. E mi tocca riavviare apache.
Find the errors xD grazie ;)
 
beh...dovrei testarlo..comunque un'osservazione la farei,
con
Codice:
file_get_contents("http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'])
tu leggi l'output di PHP_SELF, ossia di una copia della pagina stessa che a sua volta tentera' di leggere un'altra copia di se stessa e cosi via..
... questo non porta ad un procedimento ricorsivo senza fine in cui nessuna pagina viene completamente eseguita e quindi senza che nessuna copia restituisca niente???
 
ma con file_get_contents dato su una pagina in php che ha in output del codice html, non dovrebbe leggermi l'html? non penso che legga il codice php
 
file_get_contents è una funzione "strana", se gli dai un url ti restituisce l'html, se gli dai una path (di un file esistente si intende) restituisce il contenuto del file, ergo nel tuo caso darà l'html
 
lepa ha detto:
This function is similar to file(), except that file_get_contents() returns the file in a string, starting at the specified offset up to maxlen bytes. On failure, file_get_contents() will return FALSE.

ok ma
PHP:
shuffle(explode(" ",strip_tags(file_get_contents("http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']))));

file_get_contents restituisce una stringa
strip_tags prende la stringa e anche lui restituisce una stringa
questa stringa viene trasformata in un array ad ogni " " (spazio) trovato
questo array viene mischiato casualmente.
Non dovrebbe sbagliare
 
Allora, per restituirti l'HTML il server deve interpretare php e si crea un meccanismo ricorsivo.
se anche usando http:// file_get_contents ti da il codice php e non l'html interpretando il php tu prova ad aprire senza http://
prova
Codice:
echo file_get_contents(substr($_SERVER['PHP_SELF'],strrpos($_SERVER['PHP_SELF'],'/')+1));
 
ho provato com'hai detto tu, niente da fare.
Se richiamo il contenuto della pagina in cui si trova l'utente non c'è storia. Non lo fa.
ho provato anche con la funzione file() ma stesso esito.
facendo anche solo cosi:
PHP:
 $homepage = file("http://".$_SERVER['HTTP_HOST'].$_SERVER["PHP_SELF"]);
foreach ($homepage as $val)
    echo '<font color="red">'.$val.'</font><br />';
(non fare caso al tag font deprecato piu che me ma vabeh xD)

E l'esito è uguale, ovvero. Va in loop infinito e si impalla.
 
Oh, dio mio.
ShuraBozz ha detto:
file_get_contents è una funzione "strana", se gli dai un url ti restituisce l'html, se gli dai una path (di un file esistente si intende) restituisce il contenuto del file, ergo nel tuo caso darà l'html
Non c'é niente di strano. Se accede ad un file in locale, su cui ha i permessi di lettura, legge i file.
Se è un file remoto lo legge via socket, e ovviamente il server lo esegue prima di passarlo al client.

In sostanza, Black_Devil, il problema è che tu la richiami via URL.
Quindi succede che tu Utente1 richiami la pagina, questa per eseguirsi richiama se stessa, che richiama a sua volta se stessa, è così via.
Il tutto è una cascata infinita (e non un loop infinito, Turing si rivolta nella tomba se vi legge) di richieste non completate che in locale ti impallano perchè evidentemente non hai settato alcun timeout di Apache, su Altervista succede, probabilmente, che la richiesta va in timeout e tutte le altre di consuguenza fanno la stessa fine, a cascata. E c'é anche qualche altro controllo, verosimilmente.

La soluzione è richiamarla tramite path, ma leggi anche il codice php in quel caso. Per aiutarti meglio spiega esattamente a che serve questo leggere se stessi.
 
certo!
Io devo leggere il codice html generato dalla pagina php
perché voglio fare una sorta di "tag" dinamici, che a seconda della pagina cambiano di volta in volta a seconda del contenuto della pagina in cui richiamo il codice.
E' una funzione un po' spoglia ed inefficace (quella postata in prima pagina) ma era per provare e poi migliorarla.
 
Black_Devil ha detto:
certo!
Io devo leggere il codice html generato dalla pagina php
perché voglio fare una sorta di "tag" dinamici, che a seconda della pagina cambiano di volta in volta a seconda del contenuto della pagina in cui richiamo il codice.
E' una funzione un po' spoglia ed inefficace (quella postata in prima pagina) ma era per provare e poi migliorarla.
Mah, se i dati sono dinamici da una base di dati collegati direttamente a quella. Altrimenti fai così:
Prevedi un flag "nometa" che dice alla pagina di non generare i metatag.
Farai poi così:
PHP:
<?php
if(isset($_REQUEST['nometa'])) {
    // Carica la pagina per ottenerei meta tag, così:
    file_get_contents("http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?nometa");
}
?>
In questo modo, se la pagina viene caricata dallo script non caricherà di nuovo se stessa ma solo il contenuto.
 
una soluzione potrebbe essere questa...

Codice:
<!DOCTYPE....
<head>
<?
genera_tag
include ("page")
?>

e page ci dovrebbe essere fatta così

Codice:
(il resto dell' head)
</head>
ecc. ecc.

edit: non avevo ancora visto la risposta di sydarex, che mi sembra migliore come soluzione.
 
sydarex ha detto:
Black_Devil ha detto:
certo!
Io devo leggere il codice html generato dalla pagina php
perché voglio fare una sorta di "tag" dinamici, che a seconda della pagina cambiano di volta in volta a seconda del contenuto della pagina in cui richiamo il codice.
E' una funzione un po' spoglia ed inefficace (quella postata in prima pagina) ma era per provare e poi migliorarla.
Mah, se i dati sono dinamici da una base di dati collegati direttamente a quella. Altrimenti fai così:
Prevedi un flag "nometa" che dice alla pagina di non generare i metatag.
Farai poi così:
PHP:
<?php
if(isset($_REQUEST['nometa'])) {
    // Carica la pagina per ottenerei meta tag, così:
    file_get_contents("http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?nometa");
}
?>
In questo modo, se la pagina viene caricata dallo script non caricherà di nuovo se stessa ma solo il contenuto.

dunque in questo modo per generare i meta tag alla pagina deve essere passato il valore nometa

per esempio http://indirizzo.it/?nometa
questo farebbe attivare la funzione.
Peccato che sia ricorsiva lo stesso in questo modo perche gli diciamo di prendere il contenuto se è settato il valore nometa e questo a sua volta a sua volta ecc..
non bisogna farla così?
PHP:
<?php
if(isset(!$_REQUEST['nometa'])) {
    // Carica la pagina per ottenerei meta tag, così:
    file_get_contents("http://".$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF']."?nometa");
}
?>
 
Hai ragione, sbagliato codice.
Solo invece di if(isset(!$_REQUEST['nometa'])) è if(!isset($_REQUEST['nometa'])). Il NOT lo devi mettere al valore di ritorno della funzione.
 
forse non ho capito che devi fare..
ma perchè prima di outputare il contenuto di una pagina non te lo salvi in una var e poi fai quel che devi fare per generare le keywords?
 
Stato
Discussione chiusa ad ulteriori risposte.