[PHP] multitasking / multithreading en PHP ?

multitasking / multithreading en PHP ? [PHP] - PHP - Programmation

Marsh Posté le 15-04-2013 à 17:45:40    

Bonjour,
 
Je n'ai pas une très grande expérience en PHP et je me trouve confronté à un problème.
 
J'utilise @home un serveur avec pour principale fonctionnalité celle de NAS.
J'utilisais, pour pouvoir accéder à mes fichiers de n'importe où, un serveur Apache avec l'option Indexes activé et une gestion basic d'identification à base de .htaccess.
Voulant améliorer un peu la chose je me suis lancé dans un petit script PHP exécuté par Apache avec de l'URL Rewriting qui gère l'identification, puis me permet de naviguer dans mes dossiers / fichiers pour finir par les télécharger.
 
Pour ce faire j'utilise ce morceau de code :


$file = "/chemin/vers/mon/fichier";
$name = "nom_du_fichier";
 
$finfo = finfo_open();
$file_info = finfo_file($finfo, $file, FILEINFO_MIME);
finfo_close($finfo);
header("Content-Type: " . $file_info);
header("Content-Length: " . filesize($file));
header("Content-disposition: attachment; filename=\"" . $name . "\"" );
readfile($file);
exit;


Cela fonctionne bien, les fichiers se téléchargent sans soucis, et sans erreurs.
 
Sauf que PHP étant visiblement monotâche, quand je suis en train de télécharger un fichier, je ne peux plus rien faire d'autre (naviguer dans les dossiers, lancer un second téléchargement en parallèle, etc.) comme le permet Apache et son option Indexes...
 
Y a t-il un moyen simple de palier à ce problème sans avoir recours à la gestion des Threads dans PHP ?
Une option Apache peut être ?
 
Merci par avance à vos réponses :)


Message édité par zeblods le 15-04-2013 à 17:53:28
Reply

Marsh Posté le 15-04-2013 à 17:45:40   

Reply

Marsh Posté le 15-04-2013 à 18:40:37    

Je pense avoir une piste.
 
Le problème semble venir d'un lock à cause de la gestion de session de php via des fichiers.
-> http://php.net/manual/fr/function. [...] andler.php
 

Citation :

It is important to understand that PHP's default file-based session handling LOCKS the session file, inherently allowing ONLY ONE thread handling any given session at a time.


 
Donc quand on utilise les sessions PHP par défaut, à partir du moment ou l'on a "session_start();" une seule requète peut être traitée à la fois...
 
Je viens d'essayé mon code, en désactivant la gestion des sessions, et ça fonctionne en parallèle sans problème !
 
Je vais creuser dans cette direction.
 
 
[EDIT]
 
Il suffit en fait d'intercaller un "session_write_close();" avant le "readfile($file);" pour que tout fonctionne en parallèle sans soucis.  :sarcastic:


Message édité par zeblods le 15-04-2013 à 18:43:41
Reply

Marsh Posté le 16-04-2013 à 00:17:59    

J'ai eu le même problème le jour où j'ai voulu réaliser un formulaire de multi-upload d'images (genre 100 à la fois).
 
J'avais AJAXifié et asynchronisé à mort mon code, mais rien à faire, mon serveur n'uploadait un fichier à la fois.
 
C'est alors que je me suis créé une classe Session ouverte en readonly par défaut : non seulement mes uploads se sont faits en parallèle, mais en plus cette approche s'est révélée 400x plus performante que la session de base en PHP.
 
J'ai été sidéré de voir à quelle point le mécanisme de base était contre-performant. C'est probablement l'un des plus beaux ratés de PHP.


---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 20-04-2013 à 00:09:10    

CyberDenix a écrit :

J'ai eu le même problème le jour où j'ai voulu réaliser un formulaire de multi-upload d'images (genre 100 à la fois).

 

J'avais AJAXifié et asynchronisé à mort mon code, mais rien à faire, mon serveur n'uploadait un fichier à la fois.

 

C'est alors que je me suis créé une classe Session ouverte en readonly par défaut : non seulement mes uploads se sont faits en parallèle, mais en plus cette approche s'est révélée 400x plus performante que la session de base en PHP.

 

J'ai été sidéré de voir à quelle point le mécanisme de base était contre-performant. C'est probablement l'un des plus beaux ratés de PHP.


Hello

 

Ca m'intéresse par curiosité, tu as un exemple de code  ?


---------------
NewsletTux - outil de mailing list en PHP MySQL
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed