file() et serveur distant

  • Auteur de la discussion Auteur de la discussion jeroen
  • Date de début Date de début
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:
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
 
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
 
Voila un extrait du code que j'utilise pour mon spider afin de crawler des sites (gestion encoding chuncked et redirection 301, 302)

Code:
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.
 
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...
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut