file_get_contents pour fichiers distants avec timeout
Posté : 20 nov. 2005, 16:32
Suite à mon post plutôt généraliste sur le manque de timeout sur les fonctions de flux fopen(), readfile() et file_get_contents(), j'ai, sur mon élan, fait une petite fonction qui permet de capturer le contenu d'un fichier distant avec un timeout. J'ai aussi rajouté la possiblité de n'en capturer qu'une partie avec un offset et longueur paramétrables comme dans la version PHP 5 de file_get_contents.
La fonction
Toutes les erreurs produites tant par CURL que par la fonction sont envoyées en echo vers le navigateur mais une simple adaptation du code vous permettra de faire une gestion d'erreur plus appropriée à votre application.
Références:
http://php.belnet.be/manual/fr/ref.curl.php
http://php.belnet.be/manual/fr/ref.stream.php
http://curl.haxx.se/
La fonction
/*
UrlGetContentsCurl ( string url [, int timeout [, bool content [, int offset [, int maxlen]]]] )
Arguments:
string url: url avec son protocole. Par ex.
http://www.phpfrance.com/forums/index.php
http://www.rfc-editor.org/rfc/rfc2606.txt
ftp://ftp.rfc-editor.org/in-notes/rfc2606.txt
int timeout: la limite de temps.
Optionnel. Défaut: valeur de max_execution_time.
bool content: true si on veut récupérer le contenu de la page. False, la fonction renvoie
le temps de réponse de la page.
Optionnel. Défaut: true.
int offset: début de la capture de contenu, en octets.
Optionnel. Défaut: 0 (début de la page)
int maxlen: nombre d'octets à capturer à partir de offset.
Optionnel. Défaut: null (tout à partir de la position de l'offset)
Retourne:
False en cas d'échec de la connexion ou de l'ouverture de la page/fichier distant
String le contenu du fichier/page si l'argument [content] est à true
Float le temps de réponse du host et du fichier/page (si [content] est à false)
*/
function UrlGetContentsCurl(){
// traitement des arguments optionnels et des valeurs par défaut.
$arg_names = array('url', 'timeout', 'getContent', 'offset', 'maxLen');
$arg_passed = func_get_args();
$arg_nb = count($arg_passed);
if (!$arg_nb){
echo 'Il faut au moins un argument pour cette fonction';
return false;
}
$arg = array (
'url' => null,
'timeout' => ini_get('max_execution_time'),
'getContent'=> true,
'offset' => 0,
'maxLen' => null
);
foreach ($arg_passed as $k=>$v){
$arg[$arg_names[$k]] = $v;
}
// connexion CURL et retour du résultat
$ch = curl_init($arg['url']);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_RESUME_FROM, $arg['offset']);
curl_setopt($ch, CURLOPT_TIMEOUT, $arg['timeout']);
$resultat = curl_exec($ch);
$elapsed = curl_getinfo ($ch, CURLINFO_TOTAL_TIME);
$CurlErr = curl_error($ch);
curl_close($ch);
if ($CurlErr) {
echo $CurlErr;
return false;
}elseif ($arg['getContent']){
if ($arg['maxLen']){
return substr($resultat, 0, $arg['maxLen']);
}else{
return $resultat;
}
}
return $elapsed;
}
Exemples d'utilisation$url = 'http://www.rfc-editor.org/rfc/rfc2606.txt';
$timeout = 2;
$getContent = true;
$offset = 0;
$maxLen = 50;
echo UrlGetContentsCurl($url, $timeout, $getContent, $offset, $maxLen);
Retournera les 50 premiers caractères:
Code : Tout sélectionner
Network Working Group$url = 'http://www.rfc-editor.org/rfc/rfc2606.txt';
$timeout = 2;
$getContent = true;
$offset = 50;
$maxLen = 50;
echo UrlGetContentsCurl($url, $timeout, $getContent, $offset, $maxLen);
Retourne, bien entendu, les 50 caractères suivants:
Code : Tout sélectionner
D. Eastlake Request for Comments: 26$url = 'http://www.rfc-editor.org/rfc/rfc2606.txt';
$timeout = 2;
$getContent = true;
echo UrlGetContentsCurl($url, $timeout, $getContent);
//ou
echo UrlGetContentsCurl($url, $timeout);
// ou
echo UrlGetContentsCurl($url);
Retournont toute la page.$url = 'http://www.rfc-editor.org/rfc/rfc2606.txt';
$getContent = false;
echo UrlGetContentsCurl($url, $timeout,$getContent);
Retourne le temps de réponse du serveur et d'ouverture de la page (float):
Code : Tout sélectionner
0.521368026733Références:
http://php.belnet.be/manual/fr/ref.curl.php
http://php.belnet.be/manual/fr/ref.stream.php
http://curl.haxx.se/