Problem mit Download auf Server... (fsockopen())

eXus49

Grünschnabel
Hallo,
folgender Code macht mir zu schaffen:

PHP:
$vid = fsockopen("youtube.com", 80, $errno, $errstr, 30);
$content ="";

if (!$vid){
	echo "$errstr ($errno)<br><br>";}
else {
	echo $reallink[1]."<br>".$reallink[0];
	$out = "GET /get_video?video_id=jf2Xh1TGAVU HTTP/1.1\r\n";
    $out .= "Host: ash-v7.ash.youtube.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
	

	$headers = get_headers("http://$reallink[0]$reallink[1]", 1);
            if ((array_key_exists("Content-Length", $headers))){
			fwrite($size, $headers["Content-Length"]);
			echo $headers["Content-Length"];}
			else {
			fwrite($size, "ERROR");
			echo "ERROR beim FileSize lesen";}
	fclose($size);
	
	fwrite($vid, $out);
	while (!feof($vid)) {
		$content .= fgets($vid, 128);
        
    }

Soweit sollte eigentlich alles korrekt festgelegt sein (hoffe ich) und die datei http://ash-v7.ash.youtube.com/get_video?video_id=jf2Xh1TGAVU lässt sich mit dem Firefox auch perfekt runterladen, trotzdem bekomme ich vom Server immer ein "HTTP/1.1 404 Not Found" zurück.

HTTP-Headers vom Firefox:
Code:
GET /get_video?video_id=jf2Xh1TGAVU HTTP/1.1
Host: ash-v7.ash.youtube.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11 FirePHP/0.0.5.22
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5, text/firephp
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Cookie: VISITOR_INFO1_LIVE=a2maBz3R6l4; GEO=0c4a95b1d90a11320020ef44f00765f7cxMAAABERSxiZSxiZXJsaW4sLCwsLC0x; LOCALE_PREFERENCE=86d1d09eefe6b79b4068000ce05518a4dAUAAABlbl9VUw==; watched_video_id_list=08259689b8fe2cbf12cd23de42337afeWwQAAABzCwAAAGpmMlhoMVRHQVZVcwsAAABZbUh6aWR1d0JnSXMLAAAAMWNoSXBiYTR5UTRzCwAAAFAyYXNJYmJTOWFR; use_hitbox=72c46ff6cbcdb7c5585c36411b6b334edAEAAAAw; rvt=10a14d77b6e20ba546bf4c31727c53f0dAEAAABM

Und der Resonse vom Firefox:
Code:
HTTP/1.x 200 OK
Connection: close
Expires: Mon, 03 Dec 2007 00:04:55 GMT
Cache-Control: max-age=3600
Content-Type: video/flv
Etag: "-823263401"
Last-Modified: Thu, 09 Aug 2007 09:44:54 GMT
Content-Length: 14117877
Date: Sun, 02 Dec 2007 23:04:55 GMT
Server: lighttpd/1.4.18

Kann mir einer von euch sagen warum das nicht klappt Ich finde den Fehler schon seit viele Stunden nicht...

MfG,
eXus49
 
Als relativ einfache Alternative zur eigenen Implementation des HTTP-Protokolls moechte ich einfach mal meine HTTP-Klasse vorschlagen. Die aktuellste Version bekommst Du in meiner PHP Class Collection.

Damit kannst Du Dir dann auch den Einsatz von get_headers() sparen und, falls noetig, einen User-Agent angeben.
 
Ja aber es muss doch auch mit der "regulären" methode en... so wäre mir das eigentlich schon lieber, da ich vorerst keine neuen klassen oder sowas nutzen will.. außerdem bin ich noch sehr unerfahren und ich finde sowas etwas komplizierteres ist eigentlich ganz gut!
 
Naja, weit von dieser "regulaeren" Methode entfernt ist meine Klasse nicht.
Sie nutzt fsockopen() um die Verbindung aufzubauen und anschliessend fwrite() und fread() fuer die Datenuebertragung.
Das einzig "komplizierte" dabei ist eben die Implementation des HTTP-Protokolls, vor allem wenn man mehr will als lediglich Seiten abrufen; z.B. Werte-Uebergabe oder gar Datei-Uploads per POST.

Aber zurueck zum Thema:
Ich hab mal kurz getestet und bin zu folgendem Ergebnis gekommen:
http://youtube.com/get_video?video_id=jf2Xh1TGAVU -> klappt nicht, 404
http://ash-v7.ash.youtube.com/get_video?video_id=jf2Xh1TGAVU -> klappt

Entsprechend duerfte das Problem bei Dir schlichtweg da liegen dass Du die Verbindung zu youtube.com aufbaust, und nicht zu dem Server den Du im Host-Feld angibst.
Wenn Du also Deinen Aufruf von fsockopen() so anpasst dass Du nicht mit youtube.com sondern mit ash-v7.ash.youtube.com verbindest solltest Du zumindest einen Schritt weiter sein, oder es funktioniert gleich. Ob es dann aber gleich klappen wird kann ich Dir nicht sagen da ich mir den Rest des Codes nicht genau angesehen habe.
 
Zurück