par
Ripat » 26 déc. 2005, 10:17
Ok merci je vais essailler le timeout sur le fopen
Je ne connais pas du tout le CURL ni le regex...

Tu sais, n'importe qui peut trouver facilement l'adresse IP qui se cache derrière la "redirection" par frameset.
Mais bon, allez, c'est Noël après tout
Ma fonction monFileGetContents fait exactement ce que fait file_get_contents sur des fichiers distants mais avec un timeout sur le socket ET la lecture du fichier. Elle est même (beaucoup) plus rapide que file_get_contents.
function monFileGetContents($adresse, $timeout = 10){
$url = parse_url($adresse);
$url['port'] = isset($url['port']) ? $url['port'] : '80';
$url['scheme'] = isset($url['scheme']) ? strtoupper($url['scheme']) : 'HTTP';
$fp = fsockopen($url['host'], $url['port'], $errno, $errstr, $timeout);
if (!$fp) {
echo "ERREUR: $errno - $errstr<br />\n";
} else {
$header = 'GET '.$url['path'].' '.$url['scheme']."/1.1\r\n";
$header .= 'Host: '.$url['host']."\r\n";
$header .= "User-Agent: monPHP Script\r\n";
$header .= "Connection: Close\r\n\r\n";
fputs($fp, $header);
stream_set_timeout($fp, $timeout);
$page = fread($fp, 2000);
$stream = stream_get_meta_data($fp);
fclose($fp);
if ($stream['timed_out']) {
echo "Le délai de réponse de la page <b>".$adresse.
'</b> a dépassé le timeout de <b>'.$timeout.'</b> sec.';
return false;
}else{
/* //Pour debugging: echo des headers
echo '<pre>'.$header;
echo substr($page, 0, strpos($page, "\r\n\r\n"));
echo '</pre>';
*/
// séparation du header
$page = substr($page, strpos($page, "\r\n\r\n"));
$page = trim($page);
return $page;
}
}
}
// ouverture de la page demandée
$page = monFileGetContents("http://www.nukeclan.org/NCversion.txt", 5);
// pour voir le contenu du frameset décommenter la ligne suivante
// echo htmlentities($page);
// détection de la "redirection" html par frameset
preg_match('#Please go to: <a href="([^"]*)">#', $page, $out);
$redirection = $out[1];
// simple file_get_contents sur la redirection
$NCverout = file_get_contents($redirection);
echo $NCverout;
Mais, encore une fois, ce serait plus simple d'utiliser directement l'IP dans un fopen ou file_get_contents. Tu allègera sensiblement le code.
Si tu veux ajouter le confort d'un timeout sur le flux, utilise ma fonction monFileGetContents mais directement sur l'adresse IP du fichier.
[quote="cadav0r"]Ok merci je vais essailler le timeout sur le fopen
Je ne connais pas du tout le CURL ni le regex... :roll:[/quote]
Tu sais, n'importe qui peut trouver facilement l'adresse IP qui se cache derrière la "redirection" par frameset.
Mais bon, allez, c'est Noël après tout :wink:
Ma fonction monFileGetContents fait exactement ce que fait file_get_contents sur des fichiers distants mais avec un timeout sur le socket ET la lecture du fichier. Elle est même (beaucoup) plus rapide que file_get_contents.
[php]function monFileGetContents($adresse, $timeout = 10){
$url = parse_url($adresse);
$url['port'] = isset($url['port']) ? $url['port'] : '80';
$url['scheme'] = isset($url['scheme']) ? strtoupper($url['scheme']) : 'HTTP';
$fp = fsockopen($url['host'], $url['port'], $errno, $errstr, $timeout);
if (!$fp) {
echo "ERREUR: $errno - $errstr<br />\n";
} else {
$header = 'GET '.$url['path'].' '.$url['scheme']."/1.1\r\n";
$header .= 'Host: '.$url['host']."\r\n";
$header .= "User-Agent: monPHP Script\r\n";
$header .= "Connection: Close\r\n\r\n";
fputs($fp, $header);
stream_set_timeout($fp, $timeout);
$page = fread($fp, 2000);
$stream = stream_get_meta_data($fp);
fclose($fp);
if ($stream['timed_out']) {
echo "Le délai de réponse de la page <b>".$adresse.
'</b> a dépassé le timeout de <b>'.$timeout.'</b> sec.';
return false;
}else{
/* //Pour debugging: echo des headers
echo '<pre>'.$header;
echo substr($page, 0, strpos($page, "\r\n\r\n"));
echo '</pre>';
*/
// séparation du header
$page = substr($page, strpos($page, "\r\n\r\n"));
$page = trim($page);
return $page;
}
}
}
// ouverture de la page demandée
$page = monFileGetContents("http://www.nukeclan.org/NCversion.txt", 5);
// pour voir le contenu du frameset décommenter la ligne suivante
// echo htmlentities($page);
// détection de la "redirection" html par frameset
preg_match('#Please go to: <a href="([^"]*)">#', $page, $out);
$redirection = $out[1];
// simple file_get_contents sur la redirection
$NCverout = file_get_contents($redirection);
echo $NCverout;
[/php]
Mais, encore une fois, ce serait plus simple d'utiliser directement l'IP dans un fopen ou file_get_contents. Tu allègera sensiblement le code.
Si tu veux ajouter le confort d'un timeout sur le flux, utilise ma fonction monFileGetContents mais directement sur l'adresse IP du fichier.