| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

08-11-2010, 09:34
|
|
mainclain
Registrierter Benutzer
|
|
Registriert seit: Dec 2006
Beiträge: 57
|
|
Videostreams über download.php
Hallo,
habe bisher nichts dazu gefunden und hänge da schon seit Tagen dran fest :/
Also mein Problem:
Ich habe eine Internetseite auf der ich einige Videos laufen lasse. Damit unbefugte sie nicht einfach downloaden können, lass ich den download über eine download.php laufen.
Diese überprüft ob derjenige eingeloggt ist und gibt dann die Datei raus.
So der Videostream ansich geht auch, es wird alles korrekt angezeigt Sound ist auch da, das Problem ist: Die Internet-Seite hängt danach.
Wenn ich also mein Video starte (und dieses somit läd) kann ich auf keine andere Seite mehr gehen. (unendlich laden)
Leider hat alles was ich bisher versucht habe nichts geholfen
PHP-Code:
header("HTTP/1.1 200 OK");
header('Last-Modified: ' . date('r', $stat['mtime']));
header("Etag: \"".$etag."\"");
header("Content-Disposition: attachment; filename=\"".$filename[1]."\"");
header("Accept-Ranges: bytes");
header("Connection: Keep-Alive");
header("Keep-Alive: timeout=5, max=83");
header("Content-Type: ".mime_content_type($file));
readfile($file);
Dann hatte ich noch von php.net
PHP-Code:
function smartReadFile($location, $filename, $mimeType='application/octet-stream')
{
if(!file_exists($location))
{
header ("HTTP/1.0 404 Not Found");
return;
}
$size=filesize($location);
$time=date('r',filemtime($location));
$fm=@fopen($location,'rb');
if(!$fm)
{
header ("HTTP/1.0 505 Internal server error");
return;
}
$begin=0;
$end=$size;
if(isset($_SERVER['HTTP_RANGE']))
{
if(preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches))
{
$begin=intval($matches[0]);
if(!empty($matches[1]))
$end=intval($matches[1]);
}
}
if($begin>0||$end<$size)
header('HTTP/1.0 206 Partial Content');
else
header('HTTP/1.0 200 OK');
header("Content-Type: $mimeType");
header('Cache-Control: public, must-revalidate, max-age=0');
header('Pragma: no-cache');
header('Accept-Ranges: bytes');
header('Content-Length:'.($end-$begin));
header("Content-Range: bytes $begin-$end/$size");
header("Content-Disposition: inline; filename=$filename");
header("Content-Transfer-Encoding: binary\n");
header("Last-Modified: $time");
header('Connection: close');
$cur=$begin;
fseek($fm,$begin,0);
while(!feof($fm)&&$cur<$end&&(connection_status()==0))
{ print fread($fm,min(1024*16,$end-$cur));
$cur+=1024*16;
}
}
Diese Code gefunden. Das Problem hier: Opera und Safari scheinen das HTTP/1.0 206 Partial Content zu benutzen, also eine HTTP_RANGE zu schicken, Firefox und IE leider nicht (Zumindest so wies mir vorkommt).
Mit diesem Code geht das verlinken zumindest bei Opera und Safari.
Weiß langsam nicht mehr weiter, googeln und Boardsuche haben mich leider auch nicht viel weiter gebracht.
Hoffe ihr habt da eine Idee.
|

08-11-2010, 09:44
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Hallo,
das Problem bei deinem Code ist, dass du dem Browser mitteilst, er könne den Download portionieren, also auch später wiederaufnehmen (Accept-Ranges-Header). Wenn er sich darauf verlässt, was er ja durchaus darf, schiebst du ihm aber wieder die komplette Datei unter und das dann eben mehrmals.
Entweder du setzt diesen Header auf "none" (partial content nicht unterstützt) und lässt ihn einmal die komplette Datei saugen oder du nimmst den unteren Code (empfohlen!) und unterstützt damit partial content korrekt. Ob das der Browser dann in Anspruch nimmt, musst du ihm überlassen.
Gruß,
Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

08-11-2010, 09:48
|
|
mainclain
Registrierter Benutzer
|
|
Registriert seit: Dec 2006
Beiträge: 57
|
|
Okay, wie schon geschrieben, auch beim Unterem Code gibts Probleme mit Firefox und Internetexplorer.
Müsste ich daran noch etwas ändern?
Bzw. sollte ich beim Unteren Code
PHP-Code:
header('Accept-Ranges: bytes');
header('Content-Length:'.($end-$begin));
header("Content-Range: bytes $begin-$end/$size");
Nur mit reinnehmen wenn auch partial content angefragt, also HTTP_RANGE gesetzt ist?
|

08-11-2010, 09:56
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Der Code an sich sieht richtig aus, getestet habe ich ihn aber nicht. Auch rausnehmen musst du diese Header für komplette Abfragen nicht. Kannst du die Ursache für die Probleme im Firefox vielleicht noch näher erläutern? Vielleicht auch mal mit deinem Code für den Aufruf der smartReadFile-Funktion?
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

08-11-2010, 10:07
|
|
mainclain
Registrierter Benutzer
|
|
Registriert seit: Dec 2006
Beiträge: 57
|
|
Hmm, erläutern... schwierig xD
Also ich gehe auf meine seite, und fange an das Video zu laden. (Wirklich erst nach dem ich aufs Video geklickt hab) Danach versuche ich auf einen weiteren Link zu gehen beispielsweise
von index.php zu list.php und dann läd er ins unendliche, also ladebalken bei Firefox kommt unten, aber es tut sich nichts sondern bleibt immer leer.
Ein kleiner Fehler im Code ist mir noch aufgefallen
PHP-Code:
if(preg_match('/bytes=\h*(\d+)-(\d*)[\D.*]?/i', $_SERVER['HTTP_RANGE'], $matches)) { $begin=intval($matches[0]); if(!empty($matches[1])) $end=intval($matches[1]); }
Da müsste matches[1] begin und matches[2] ende sein oder?
Index 0 steht ja eigentlich immer für den gesamten Ausdruck.
Mal sehn ob sich dadurch was verändert.
Edit: Okay ändert sich nichts :/
Der aufruf an sich:
PHP-Code:
smartReadFile($filepath, basename($filepath), mime_content_type($filepath));
Geändert von mainclain (08-11-2010 um 10:11 Uhr)
|

08-11-2010, 10:17
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Ja, du hast recht in Bezug auf die Indizes des $matches-Arrays. Du testest ja bestimmt auf einem lokalen Webserver. Lässt der eventuell nur eine Verbindung gleichzeitig zu? Schau mal in der httpd.conf nach ThreadsPerChild und MaxRequestsPerChild.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

08-11-2010, 10:48
|
|
mainclain
Registrierter Benutzer
|
|
Registriert seit: Dec 2006
Beiträge: 57
|
|
ThreadsPerChild:250
MaxRequestsPerChild:0
Was genau bedeutet eine Verbindung? Ich kann ja auch gleichzeitig mit 2 Browsern drauf - Als IE lad ich beispielsweise das Video, FF spring ich auf der seite umher
|

08-11-2010, 11:00
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Mh, dann fällt mir erstmal auch nichts mehr ein, außer dass vielleicht ein Firefox-Add-On da irgendwie dazwischen funkt. Du kannst ja alle mal temporär deaktivieren oder den Firefox über den Safe-Mode-Link starten.
Edit: Achso, außerdem kannst du versuchen, mal Connection: close zu senden, statt keep-alive und den Keep-Alive-Header ganz rausnehmen.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt? 
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke! 
|

08-11-2010, 11:02
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
|

08-11-2010, 11:22
|
|
mainclain
Registrierter Benutzer
|
|
Registriert seit: Dec 2006
Beiträge: 57
|
|
Die Links hatte ich mir auch schon rausgesucht, trotzdem danke dafür ^.^
Wegen dem Connection: Close - Wird doch bei der 2. Funktion standartmäßig gesendet.
PHP-Code:
header('Connection: close');
Auch Addons ausstellen hat leider nicht geklappt :/ (Bei IE hab ich ja sowieso keine xD)
Mit dem Firefox addon Live HTTP headers wird folgendes als Response gegeben:
Code:
HTTP/1.0 200 OK
Date: Mon, 08 Nov 2010 10:19:02 GMT
Server: Apache/2.2.8 (Ubuntu) PHP/5.3.3-0.dotdeb.1 with Suhosin-Patch mod_ssl/2.2.8 OpenSSL/0.9.8g
X-Powered-By: PHP/5.3.3-0.dotdeb.1
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: public, must-revalidate, max-age=0
Pragma: no-cache
Accept-Ranges: bytes
Content-Length: 778637051
Content-Range: bytes 0-778637051/778637051
Content-Disposition: inline; filename=video.flv
Content-Transfer-Encoding: binary
Last-Modified: Wed, 03 Nov 2010 23:46:46 +0100
Connection: close
Content-Type: video/x-flv
Geändert von mainclain (08-11-2010 um 11:27 Uhr)
|

08-11-2010, 14:32
|
|
mainclain
Registrierter Benutzer
|
|
Registriert seit: Dec 2006
Beiträge: 57
|
|
Noch kurz eine Sache: Wenn ich statt auf eine php seite nach dem Laden des Videos auf eine HTML seite gehe, scheint alles ordnunggemäß zu funktionieren :/
Kann es an den PHP-Einstellungen liegen? Das das PHP script erst ausgeführt wird wenn das andere (download.php) beendet wurde? (Nur komisch das es parallel mit mehreren Browsern klappt)
Achja am Player liegts sicher auch nicht xD Hab flowplayer und JWPlayer ausprobiert, beide gingen nicht.
Geändert von mainclain (08-11-2010 um 14:35 Uhr)
|

08-11-2010, 14:55
|
wahsaga
 Moderator
|
|
Registriert seit: Sep 2001
Beiträge: 24.486
|
|
Zitat:
Zitat von mainclain
Damit unbefugte sie nicht einfach downloaden können, lass ich den download über eine download.php laufen.
Diese überprüft ob derjenige eingeloggt ist
|
Und das machst du wie genau - über Sessions vielleicht?
Falls ja, dann ist der Fall klar - die geöffnete Session-Datei ist gelockt, andere Scripte, die ebenfalls die Session nutzen, können nicht darauf zugreifen, so lange das andere Script noch läuft.
Lösung: Nach dem Prüfen der Zugriffsberechtigung, vor dem Ausliefern der Video-Daten, session_write_close aufrufen.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
|

08-11-2010, 15:02
|
|
mainclain
Registrierter Benutzer
|
|
Registriert seit: Dec 2006
Beiträge: 57
|
|
Werde ich mal probieren, danke ^.^
Allerdings gibts den Fehler auch wenn ich einfach auf eine Seite linke wie:
test.php
-> <?php echo "test"; ?>
bei einer
test.html
ist der Fehler aber nicht, kanns trotzdem dran liegen?
Das mit Session closen werd ich trotzdem mal versuchen, danke ^.^
Edit: Haha danke, genau das war die Lösung.
Naa super, vielen viel dank, hab gar nicht dran gedacht, das die Sessions das Problem sein könnte ^.^
Auch an alle anderen, vielen Dank für eure bemühungen
Geändert von mainclain (08-11-2010 um 15:12 Uhr)
|

10-11-2010, 20:24
|
|
mainclain
Registrierter Benutzer
|
|
Registriert seit: Dec 2006
Beiträge: 57
|
|
Nun hab ich doch noch ein Problem.
Ich hab mein Video als mp4 gespeichert, leider kann ich dieses nicht abspielen.
Nun dachte ich liegts an meinen player, hab nun mit mein iphone getestet und einen einfachen Link eingebaut.
Direkter Link zum Video: anzeige klappt; über die download.php gehts nicht - er sagt Video kann nicht angezeigt werden.
Jemand eine Ahnung woran es liegen könnte?
Beim PC kann ich über den download link das ganze Aufrufen, über den Player aber auch nicht :/
Ich habs bis jetzt leider nicht hinbekommen 
Nun hab ich allerdings eine Möglichkeit gefunden die nicht ganz so gut ist.
Da das Problem nur bei Iphone auftrat, habe ich eine extra funktion für iphone erstellt.
Hierbei wird jedes mal aufruf meiner Seite die IP überprüft und in eine .htaccess datei geschrieben, wenn noch nicht vorhanden. (Nur bei IPHONE, bzw. Mobile Versionen)
So hat der iphone nutzer vollen zugriff auf den Files ordner.
Das ganze ergänze ich nun noch mit einer Datenbank verbindung, inder ich die Zeiten schreibe und lösche nach einer bestimmten zeit die ip wieder aus der htaccess hinaus.
Geändert von mainclain (12-11-2010 um 22:42 Uhr)
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|