Hallo,
bei der file-funktion lässt sich ja keine timeout zeit einstellen.
jetzt hab ich auf http://de.php.net/manual/de/function.file.php was gefunden, was mit socket arbeitet. das problem ist nur das da keine weiterleitungen functionieren.
gibt es eine also eine function die man z.b. nach 10sekunden abbrechen lassen kann und die sich so wie file verhält?
greetz,
woot
das problem ist nur das da keine weiterleitungen functionieren. soll heißen?
ich bekomme dann z.b. so eine ausgabe:
HTTP/1.0 301 Moved Permanently Location: ###url### Set-Cookie: PREF=ID=5dad2bc9bdce8698:TM=11384
63341:LM=1138463341:S=g1rcr_XpDZ7aaYUL; expires=Sun, 17-Jan-2038 19:
14:07 GMT; path=/; domain=.###domain### Content-Type
: text/html Server: GWS/2.1 Content-Length: 298 Date: Sat, 28 Jan 2006 15:49:01 GMT Connection: Keep-Alive
301 Moved
The document has moved here.
müsste man dann auswerten...
o.O?!
ich suche eine function, die das selbe macht, wie die file-funktion. allerdings soll sich diese funktion mit einem timelimit versehen lassen.
ghostgambler
28-01-2006, 18:22
von php.net/fopen
Simple class to fetch a HTTP URL. Supports "Location:"-redirections. Useful for servers with allow_url_fopen=false. Works with SSL-secured hosts.
<?php
#usage:
$r = new HTTPRequest('http://www.php.net');
echo $r->DownloadToString();
class HTTPRequest
{
var $_fp; // HTTP socket
var $_url; // full URL
var $_host; // HTTP host
var $_protocol; // protocol (HTTP/HTTPS)
var $_uri; // request URI
var $_port; // port
// scan url
function _scan_url()
{
$req = $this->_url;
$pos = strpos($req, '://');
$this->_protocol = strtolower(substr($req, 0, $pos));
$req = substr($req, $pos+3);
$pos = strpos($req, '/');
if($pos === false)
$pos = strlen($req);
$host = substr($req, 0, $pos);
if(strpos($host, ':') !== false)
{
list($this->_host, $this->_port) = explode(':', $host);
}
else
{
$this->_host = $host;
$this->_port = ($this->_protocol == 'https') ? 443 : 80;
}
$this->_uri = substr($req, $pos);
if($this->_uri == '')
$this->_uri = '/';
}
// constructor
function HTTPRequest($url)
{
$this->_url = $url;
$this->_scan_url();
}
// download URL to string
function DownloadToString()
{
$crlf = "\r\n";
// generate request
$req = 'GET ' . $this->_uri . ' HTTP/1.0' . $crlf
. 'Host: ' . $this->_host . $crlf
. $crlf;
// fetch
$this->_fp = fsockopen(($this->_protocol == 'https' ? 'ssl://'
: '') . $this->_host, $this->_port);
fwrite($this->_fp, $req);
while(is_resource($this->_fp) && $this->_fp && !feof($this->_fp))
$response .= fread($this->_fp, 1024);
fclose($this->_fp);
// split header and body
$pos = strpos($response, $crlf . $crlf);
if($pos === false)
return($response);
$header = substr($response, 0, $pos);
$body = substr($response, $pos + 2 * strlen($crlf));
// parse headers
$headers = array();
$lines = explode($crlf, $header);
foreach($lines as $line)
if(($pos = strpos($line, ':')) !== false)
$headers[strtolower(trim(substr($line, 0, $pos)))] =
trim(substr($line, $pos+1));
// redirection?
if(isset($headers['location']))
{
$http = new HTTPRequest($headers['location']);
return($http->DownloadToString($http));
}
else
{
return($body);
}
}
}
?>
mussu nur dein timeout bei fsockopen einfügen