J'ai un problème assez particulier. J'ai un site web qui fonctionne sur un serveur ubuntu sous Apache2.4. Le site est écrit en PHP et utilise MySQL comme base de données. J'ai réalisé "stockage de fichiers" pour les petits fichiers dans la base de données MySQL comme longblobs.Le serveur/site Web Apache2 ne répond plus pendant le téléchargement
Lorsque je veux télécharger un fichier blob/fichier à partir de la base de données MySQL, j'ouvre une connexion PDO à la base de données.
$sql = $pdoData->prepare("SELECT * FROM fileblob WHERE ID = ?");
$sql->execute(array($blobID));
$row = $sql->fetch();
$content = $row['data'];
via "echo $ content" Je transmets ensuite le fichier au navigateur. Tout cela fonctionne parfaitement. Toutefois. Pendant le téléchargement, l'ensemble du site ne répond plus, chaque nouvelle requête est expirée. Le téléchargement se poursuit correctement.
Lorsque le téléchargement atteint 4 Mo, le site Web redémarre, mais très lentement. Quand c'est fini, le site est complètement de retour à la normale.
La base de données MySQL utilise un back-end InnoDB, a un maximum de 500 connexions simultanées, etc.
Pendant le temps du téléchargement, il n'y a que 6 connexions SQL ouvertes. L'utilisation du disque est au maximum d'environ 20%, l'utilisation du processeur inférieure à 10% Apache est également configuré pour gérer 1k connexions simultanées (10 threads avec 100 enfants au maximum). Le serveur est connecté via une ligne 1Mbps non mesurée. Je ne peux pas penser à un goulot d'étranglement matériel.
Qu'est-ce qui me manque? Je suis heureux de répondre à toutes les questions ...
Quelle est votre réglage de mise en mémoire tampon de sortie? Utilisez-vous des sessions PHP dans vos scripts? – CBroe
@CBroe Oui, j'utilise des sessions PHP littéralement partout. Le tampon de sortie est réglé sur 4096 – user3829915
_ "Le tampon de sortie est réglé sur 4096" _ - bien cela pourrait expliquer pourquoi vous voyez l'effet changer autour de 4MB ... essayez de le désactiver pour cette requête/partie du script. En outre, utilisez session_write_close dès que vous avez terminé la session. Dans le cas contraire, le verrouillage de fichier sur le fichier de données de session peut également maintenir les requêtes simultanées "suspendues". – CBroe