8721 sujets

Développement web côté serveur, CMS

Bonjour,
j'avais déjà posté un message à propos d'un problème de lecture de fichiers audio/video en streaming depuis un script PHP. Ce problème là est résolu, mais il a engendré un autre problème.
Je m'explique, le but au départ était de lire des fichiers audio ou vidéo avec une balise html5 classique mais depuis un script PHP. Cela fonctionne à présent, l'ennui c'est que cette fonctionnalité est en fait inclus dans un plus grand projet qui nécessite l'exécution de plusieurs scripts en même temps. Or, le script qui lit les fichiers audio/video semble totalement occuper le serveur puisque aucun autre script ne peut s'exécuter en même temps.
Pour que vous saisissiez vraiment en quoi cela est très embêtant, voilà le projet complet:

upload/43453-GS2.jpg

upload/43453-GS.jpg

Chaque applications fait intervenir une multitude de scripts PHP, donc si l'un d'eux bloque tous les autres, ça perd un peu de son intérêt. (Dans le dernier screen, j'ai du ouvrir la fenêtre de lecture video en dernier car on ne peut rien exécuter d'autre une fois qu'elle est ouverte)

Voilà le fragment du script qui lit les fichiers audio/video (sachez que ce script passe par une réécriture http, et que donc les données GET ainsi que les sessions sont vérifiées en amont):
if(isset($_GET['path'])) $path=$_GET['path'];
if(isset($path)) {
	if(is_readable($path)) {
		if(is_file($path)) {
			header_remove();
			header('Content-Type: '.mime_content_type($path));
			header('Accept-Ranges: 0-'.$length);
			if(isset($_SERVER['HTTP_RANGE'])) $range=$_SERVER['HTTP_RANGE'];
			elseif($apache=apache_request_headers()) {
				$headers=array();
				foreach($apache as $header=>$val) $headers[strtolower($header)]=$val;
				if(isset($headers['range'])) $range=$headers['range'];
				else $range=false;
			}
			else $range=false;
			if(isset($range)) {
				$fp=@fopen($path,'rb');
				$size=filesize($path);
				$length=$size;
				$start=0;
				$end=$size-1;
				$c_start=$start;
				$c_end=$end;
				list(,$range)=explode('=',$range,2);
				if(strpos($range,',')!==false) {
					header('HTTP/1.1 416 Requested Range Not Satisfiable');
					header('Content-Range: bytes '.$start.'-'.$end.'/'.$size);
					exit;
				}
				if($range0=='-') $c_start=$size-substr($range,1);
				else {
					$range=explode('-',$range);
					$c_start=$range[0];
					$c_end=(isset($range[1]) && is_numeric($range[1])) ? $range[1] : $size;
				}
				$c_end=($c_end>$end) ? $end : $c_end;
				if($c_start>$c_end || $c_start>$size-1 || $c_end>=$size) {
					header('HTTP/1.1 416 Requested Range Not Satisfiable');
					header('Content-Range: bytes '.$start.'-'.$end.'/'.$size);
					exit;
				}
				$start=$c_start;
				$end=$c_end;
				$length=$end-$start+1;
				fseek($fp,$start);
				header('HTTP/1.1 206 Partial Content');
				header('Content-Range: bytes '.$start.'-'.$end.'/'.$size);
				header('Content-Length: '.$length);
				fseek($fp,$start);
				$buffer=1024*8;
				while(!feof($fp) && ($p=ftell($fp))<=$end) {
					if($p+$buffer>$end) $buffer=$end-$p+1;
					set_time_limit(0);
					echo fread($fp,$buffer);
					flush();
				}
				fclose($fp);
			}
			else {
				header('HTTP/1.1 206 Partial Content');
				header('Content-Length:1');
				readfile($path);
			}
		}
	}
}


Qu'est-ce qui bloque ? Merci de votre aide Smiley smile
Modifié par juliendargelos (13 Jun 2014 - 17:22)
FraiseTagada99 a écrit :
C'est codé avec les pieds

Bien sympas Smiley fache
D'une part, je n'ai jamais reçu de formation, je suis encore en études secondaires. J'estime mériter un peu d'indulgence.
D'autre part, ce code est celui du topic que tu m'a conseillé !!

Le système est simple:
Il existe un script application.php auquel on indique l'application à exécuter, il vérifie qu'il y a une session et si c'est le cas, il change le dossier de travail courant pour celui où se trouve le fichier principal de l'application, ensuite il inclus le fichier principal.
Le fichier application.php n'est pas directement accessible, tout comme les fichiers d'applications. Cela passe par une réécriture grâce à laquelle "/applications/Explorateur de fichiers/main.php" devient "/application.php?file=Explorateur de fichiers/main.php"

L'architecture:
- /
| - .htaccess  [Inaccessible en http]
| - application.php [Inaccessible en http]
| - Applications/ [Inaccessible en http]
| | - .htaccess
| | - Explorateur de fichiers/
| | | - action-file.php
| | | - content.php
| | | - files-viewer.php
| | | - main-window
| | | - main.php
| | | - medias/
| | | | - actions-dark.png
| | | | - actions-light.png
| | | | - alpha.png
| | | | - arrow.png
| | | | - close.png
| | | | - files-icons/
| | | | | - application-file.png
| | | | | - archive-file.png
| | | | | - audio-file.png
| | | | | - file.png
| | | | | - folder.png
| | | | | - font-file.png
| | | | | - image-file.png
| | | | | - pdf-file.png
| | | | | - text-file.png
| | | | | - video-file.png
| | | | - generic (80%).png
| | | | - init.png
| | | | - new-file.png
| | | | - new-folder.png
| | | | - save.png
| | | | - search.png
| | | | - to-root.png
| | | | - unreadable.png
| | | | - zoom-in.png
| | | | - zoom-out.png
| | | - style.css
| | - Préférences
| | | - main.php
| | | - main-window
| | | - style.css
| | | - system.php
| | | - ui.php
| | | - users.php
| - default-path.php [Inaccessible en http]
| - functions.php [Inaccessible en http]
| - home/ [Inaccessible en http]
| | - julien/
| | | - preferences
| - index.php
| - login.php
| - logout.php
| - main.php [Inaccessible en http]
| - medias/
| | - background.png
| | - fonts/
| | | - helveticaNeue-Light.ttf
| | | - LucidaGrande.ttf
| | - graphic-server.png
| | - menu-show.png
| - passwd [Inaccessible en http]
| - signin.php [Inaccessible en http]
| - style.css
juliendargelos a écrit :

Bien sympas Smiley fache
D'une part, je n'ai jamais reçu de formation, je suis encore en études secondaires. J'estime mériter un peu d'indulgence.
D'autre part, ce code est celui du topic que tu m'a conseillé !!


Quand on te file un bout de code écrit à l'arrache en guise d'exemple, ça ne reste d'un exemple. A toi d'en faire une implémentation robuste. Ton code actuel est une simple hérésie et ne devrait pas se trouver sur une application en production.
juliendargelos a écrit :

Bien sympas Smiley fache
D'une part, je n'ai jamais reçu de formation, je suis encore en études secondaires. J'estime mériter un peu d'indulgence.
D'autre part, ce code est celui du topic que tu m'a conseillé !!


Quand on te file un bout de code écrit à l'arrache en guise d'exemple, ça ne reste d'un exemple. A toi d'en faire une implémentation robuste. Ton code actuel est une simple hérésie et ne devrait pas se trouver sur une application en production.
Quand on te file un bout de code écrit à l'arrache en guise d'exemple, ça ne reste d'un exemple. A toi d'en faire une implémentation robuste. Ton code actuel est une simple hérésie et ne devrait pas se trouver sur une application en production.

Tu es là pour m'aider ou pour me sermonner ? Dans le second cas c'est inutile de poster !
Dis-moi plutôt en quoi mon code n'est pas "une implémentation robuste". Comme je te l'ai dis je n'ai pas été formé à la programmation propre et rigoureuse (je n'est pas été formé du tout). Je ne vois pas comment il est possible de s'auto-former à partir de rien, et d'avoir les même qualités qu'un professionnel.
Modifié par juliendargelos (14 Jun 2014 - 01:48)