Discordance de longueur de contenu PHP avec le script de livraison de contenu personnalisé

Bonne journée tout le monde,

Lors du développement d’un site Web de loisir, j’ai rencontré le problème suivant. Pour empêcher les utilisateurs non autorisés d’accéder à des fichiers image sur le serveur, définissez le dossier contenant les images sur nginx. Cela fonctionne bien, mais lorsque j’utilise le script PHP suivant pour accéder aux fichiers image du dossier, Chrome refuse de les charger de manière aléatoire en indiquant l’erreur suivante: ‘net :: ERR_CONTENT_LENGTH_MISMATCH’. Avec le hasard, je veux dire que les images se chargent parfois très bien. J’ai essayé de vider le tampon de sortie avant et après l’appel readfile () mais rien ne semble résoudre le problème. Merci d’avance de m’aider!

PS: Si vous souhaitez voir plus de fichiers de code source / configuration, faites le moi savoir.

Le script PHP:

<?php if(!empty($_GET['tconst'])) { //Included login script contains this method if(login_check($mysqlisecure)) { $tconst = preg_replace( '#[^.\w]#', '', $_GET['tconst'] ); $file = "{$_SERVER['DOCUMENT_ROOT']}/content/posters/{$tconst}.jpg"; if (file_exists($file)) { $filesize = filesize($file); header('Expires: '.gmdate('D, d MYH:i:s \G\M\T', time() + (60 * 60 * 24))); header("Content-Type: image/jpeg"); header("Content-Length: ".$filesize); readfile($file); } } } exit(); 

    C’était finalement un problème plus profond que les seuls scripts PHP. Lors du chargement consécutif d’images, PHP5-fpm crée un cache à partir duquel il peut probablement traiter les requêtes plus rapidement. Le problème ici était que le dossier de cache était généré lors du test des fichiers de configuration pour que nginx fonctionne en tant que root. Lorsque je suis passé à ‘production’, PHP5-fpm et nginx ne pouvaient pas accéder en lecture / écriture à ce dossier avec user: www-data . Lorsqu’une demande de téléchargement d’image a été répétée plusieurs fois, PHP5-fpm a tenté d’accéder aux dossiers du cache, mais n’a pas pu et n’a donc pas terminé la requête, renvoyant ainsi seulement 65 536 octets au client. La solution simple consistait à supprimer le dossier cache situé dans /etc/nginx/watchcgi_temp , laisser PHP5-fpm le régénérer et tout fonctionnait.

    La lecture des fichiers journaux nginx m’a vraiment aidé cette fois

    au lieu de taille de fichier ($ fichier); utiliser filesize ($ fileLocation) .same pour readfile ($ fileLocation); Cela a fonctionné pour moi.

      header('Content-Length: '.filesize($fileLocation)); ob_clean(); flush(); readfile($fileLocation);