file() et serveur distant

Consultez la formation au REFERENCEMENT naturel Google de WebRankInfo / Ranking Metrics

jeroen
WRInaute passionné
WRInaute passionné
 
Messages: 2461
Inscription: 30 Aoû 2002

file() et serveur distant

Message le Sam Avr 16, 2005 11:45

Bonjour à tous !
J'utilise la fonction php file() pour récupérer un flux rss distant et je rencontre un problème : lorsque le serveur distant ne répond pas, le script bloque ...
j'utilise :
Code: Tout sélectionner
if (($content=@file($url)) !== FALSE)
{
traitement...
}


est que c'est correct, et est ce qu'il y a une meilleure solution ??
la page qui pose problème : xxx
Merci de votre aide...

[edit] 404
Dernière édition par jeroen le Dim Nov 09, 2008 22:25, édité 1 fois.

fredsoft
WRInaute discret
WRInaute discret
 
Messages: 242
Inscription: 26 Jan 2003

Message le Sam Avr 16, 2005 12:28

normal il faut jamais faire de file sur un serveur distant si comme nous l'option allow_url_fopen est a 0 dans php.ini tu peux pas
donc tu oublie , les files, les fope et tu utilises curl ou les sockets

jeroen
WRInaute passionné
WRInaute passionné
 
Messages: 2461
Inscription: 30 Aoû 2002

Message le Sam Avr 16, 2005 12:34

Sauf que ça marchait trés bien avant...
ça marche comment les sockets ?

Invité
 

Message le Sam Avr 16, 2005 14:38

Voila un extrait du code que j'utilise pour mon spider afin de crawler des sites (gestion encoding chuncked et redirection 301, 302)

Code: Tout sélectionner
define("SE_CHARSET", "iso-8859-1");
define("SE_USER_AGENT","sebot/1.0 (+http://www.monsite.com/)");
define("SE_VERSION","1.0");
define("SE_CRLF","\r\n");

$page = array (
   'site_id' => '',
   'url'     => '',
   'status'  => '',
   'redir'   => '',
   'rewrite' => 0,
   'level'   => 0,
   'index'  => true,
   'follow'  => true,
   'last-modified' => '',
   'content-type'  => '',
   'content'       => ''
);

function fnParseURL($url) {
   $parse = array();
   if(eregi("^([a-z]*)(://([^/]+))?/?(.*)$", $url, $regs)) {
      $parse['scheme'] = $regs[1];
      $parse['host']   = $regs[3];
      $parse['fpath']  = "/".$regs[4];

      unset($regs);   
      ereg("^([^\?]*)(.*)$", $parse['fpath'], $regs);
      $parse['path'] = $regs[1];
      $parse['query'] = $regs[2];

      unset($regs);
      ereg("^(.*/)([^/]*)$", $parse['path'], $regs);
      $parse['path'] = $regs[1];
      $parse['file'] = $regs[2];
   } else {
      $parse = false;
   }
   return $parse;
}

function seGetUrl(&$page) {
   if($page['rewrite'] > 2) return("701");
   
   $url = ($page['rewrite'] > 0)? $page['redir']: $page['url'];
   $location = fnParseURL($url);

   $fp = fsockopen($location['host'], 80);
   if(!$fp) return "700";

   $http_request  =
      "GET ".$location['fpath']." HTTP/1.1".SE_CRLF
      ."Host: ".$location['host'].SE_CRLF
      ."Connection: close".SE_CRLF
      ."Accept: */*".SE_CRLF
      ."Accept-Charset: ".SE_CHARSET.SE_CRLF
      ."Accept-Encoding: identity".SE_CRLF
      ."User-Agent: ".SE_USER_AGENT.SE_CRLF.SE_CRLF;
   fputs($fp, $http_request);

   $http_header  = array();
   $http_content = "";

   $response = fgets($fp, 1024);
   $http_header['http-status'] = $response;
   while(($response != "\r\n") && !feof($fp)) {
      if(ereg("^ *([^ :]+) *: *([^\r\n]+)", $response, $regs)) {
         $http_header[strtolower($regs[1])] = $regs[2];
      }
      $response = fgets($fp, 1024);
   }
   
   $complete = false;
   if(isset($http_header['transfer-encoding'])) {
      if($http_header['transfer-encoding'] == "chunked") {
         $content_length = 0;

         $response = fgets($fp, 1024);
         $chunk_size = -1;
         if(ereg("([A-Fa-f0-9]+) *[;]? *([^\r\n ]*) *", $response, $regs)) {
            $chunk_size = intval(base_convert($regs[1], 16, 10));
            $chunk_ext  = $regs[2];
         }            

         while($chunk_size > 0) {
            while($chunk_size && !feof($fp)) {
               $response = fread($fp, $chunk_size);
               if($response_len = strlen($response)) {
                  $http_content .= $response;
                  $content_length += $response_len;
                  $chunk_size -= $response_len;
               }
            }
            $response = fgets($fp, 1024); // CRLF
            $response = fgets($fp, 1024);

            $chunk_size = -1;
            if(ereg("([A-Fa-f0-9]+)", $response, $regs)) {
               $chunk_size = intval(base_convert($regs[1], 16, 10));
            }
         }

         if($chunk_size != -1) {
            // chunk footer - Append entity-header to existing header fields
            $response = fgets($fp, 1024);
            while(($response != "\r\n") && !feof($fp)) {
               if(ereg("^ *([^ :]+) *: *([^\r\n]+)", $response, $regs)) {
                  $http_header[$regs[1]] = $regs[2];
               }
               $response = fgets($fp, 1024);
            }
            
            $http_header['content-length'] = $content_length;
            unset($http_header['transfer-encoding']);
            $complete = true;
         }
      }
   } else {
      if(isset($http_header['content-length'])) {
         $content_length = intval($http_header['content-length']);

         while($content_length && !feof($fp)) {
            $response = fread($fp, $content_length);
            if($response_len = strlen($response)) {
               $http_content .= $response;
               $content_length -= $response_len;
            }
         }
         $complete = true;
      }
   }
   fclose($fp);

   if(!$complete) return "700";
   
   if(ereg("HTTP/[^ ]+ ([0-9]{3})", $http_header['http-status'], $regs)) {
      $status = $regs[1];
      if($page['rewrite'] == 0) $page['status'] = $status;

      if($status == "200") {
         $page['content'] = $http_content;

         if(isset($http_header['last-modified'])) {
            $page['last-modified'] = fnParseIsoDate($http_header['last-modified']);
         }
         if(isset($http_header['content-type'])) {
            if(eregi("([^; ]+)", $http_header['content-type'], $regs)) {
               $page['content-type'] = $regs[1];
            }
         }
      }
      elseif(($status == "301") || ($status == "302")) {
         if(isset($http_header['location'])) {
            $redir = fnParseURL($http_header['location']);
            if(!empty($redir['scheme'])) {
               $redir['scheme'] = $location['scheme'];
            }
            if(!empty($redir['host'])) {
               $redir['host'] = $location['host'];
            }
            if(!ereg("^/", $redir['fpath'])) {
               $redir['fpath'] = $location['path'].$redir['fpath'];
            }
            
            $page['redir'] = $redir['scheme']."://".$redir['host'].$redir['fpath'];
            $page['rewrite']++;
            $status = seGetUrl($page);
         }
      } else {
         $page['status'] = $status;
      }
      return $status;
   }

   return "700";
}

$page['url'] = "http://ton_url";
$code = seGetUrl($page);
if($code == "200") {
   ... /* ton code */
}


peut pratiquement être repris tel quel.

Nico5
Nouveau WRInaute
Nouveau WRInaute
 
Messages: 39
Inscription: 12 Juin 2003

Message le Lun Juil 10, 2006 17:08

Bonjour

J'ai le même problème.
J'ai essayé de modifier mon htaccess en mettant
php_value allow_url_fopen on

mais quand je regarde le phpinfo, la commande était déjà à On :
allow_url_fopen On On

Je continue à chercher...


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Formation recommandée sur ce thème :

Formation REFERENCEMENT naturel Google : apprenez une méthode efficace pour optimiser à fond le référencement naturel dans Google de façon durable... Formation animée par Olivier Duffez et Fabien Facériès, experts en référencement naturel.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité