Serveur d’images / médias fonctionnant avec Postgres

J’ai récemment eu un serveur nginx + php-fpm qui diffusait des images comme celles-ci:

header('Content-Type: image/png'); echo file_get_contents('example_image.png'); exit(); 

Ce que je suis venu à réaliser, que l’image soit mise en cache ou non, il ya eu un énorme impact sur le serveur. L’utilisation du processeur était extrêmement élevée, 100% avec un nombre minimal de connexions. J’ai donc commencé à décharger les images sur un CDN et il y avait une amélioration immédiate des performances, mais dans certains cas, je dois toujours utiliser l’image via un serveur, ce qui m’a amené à l’idée d’un serveur image / média.

Ma question est la suivante: existe-t-il un type de serveur spécifique que je devrais utiliser? Celui qui peut communiquer avec une firebase database pour trouver l’emplacement de l’image et le servir? Type de système de fichiers? Ou est-il préférable de continuer à lancer une autre instance de nginx + php-fpm et de créer une structure de type cdn où:

 media.example.com 

ne pointe que vers ce serveur, il n’y a donc pas d’impact sur les performances du serveur Web?

Votre problème est que vous traitez votre image comme une chaîne plutôt qu’un stream. Il n’y a absolument pas besoin de tout charger en php en utilisant file_get_contents() et en procédant à l’ echo du désordre. Recherchez des éléments tels que readfile() et les fonctionnalités LOB liées au PG:

 header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename='.basename($file)); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: must-revalidate'); header('Pragma: public'); header('Content-Length: ' . filesize($file)); ob_clean(); flush(); readfile($file); exit; 

http://php.net/manual/en/function.readfile.php

 $db = new PDO('pgsql:dbname=test host=localhost', $user, $pass); $db->setAtsortingbute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->beginTransaction(); $stmt = $db->prepare("select oid from BLOBS where ident = ?"); $stmt->execute(array($some_id)); $stmt->bindColumn('oid', $oid, PDO::PARAM_STR); $stmt->fetch(PDO::FETCH_BOUND); $stream = $db->pgsqlLOBOpen($oid, 'r'); header("Content-type: application/octet-stream"); fpassthru($stream); 

http://php.net/manual/en/pdo.pgsqllobopen.php

Dans le même ordre d’idées, examinez les en-têtes associés au contrôle de cache. Il n’est pas nécessaire de renvoyer une image qui se trouve déjà dans le cache du navigateur. Essayez d’envoyer le message 304 Non modifié lorsque cela est possible:

Faire en sorte que la page PHP renvoie “304 non modifié” si elle n’a pas été modifiée

À quoi servent les images? Parce que je dirais que si vous ne faites que servir des images en PHP, utilisez un simple écho avec HTML?

 echo ""; 

ou si vous voulez l’afficher à partir d’une variable, ou autre, ajoutez simplement “” à l’intérieur du “” après le SRC IMG = (comme ça)

 echo ""; 

Cela ne devrait pas vraiment avoir beaucoup d’impact sur votre serveur en affichant une image? Mais bon, je ne suis pas un expert.