file() et serveur distant

  • Auteur de la discussion Auteur de la discussion jeroen
  • Date de début Date de début
WRInaute passionné
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
 
WRInaute discret
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
 
A
Anonymous
Guest
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.
 
Nouveau WRInaute
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...
 
Discussions similaires
Haut