2009-06-16 6 views
3

Pour diverses raisons, j'ai besoin de jouer l'intermédiaire entre une requête HTTP et un fichier sur le disque. Mon approche a été de remplir les en-têtes et ensuite d'exécuter un fichier readfile ('/ path/to/file.jpg');PHP passthrough lent

Maintenant, tout fonctionne bien, sauf qu'il renvoie même une image de taille moyenne très lentement.

Quelqu'un peut-il me fournir un moyen plus efficace de diffuser le fichier au client une fois que les en-têtes ont été envoyés?

Note: il est une boîte Linux dans un environnement d'hébergement partagé si elle compte

+0

Serait bien si vous incluez le système d'exploitation que vous utilisez. –

Répondre

3

Plusieurs serveurs Web permettent à un script externe de leur dire de faire exactement cela. X-Sendfile sur Apache (avec mod_xsendfile) est un.

En un mot, tout ce que vous envoyez est en-têtes. L'en-tête spécial indique au serveur Web d'envoyer le fichier nommé en tant que corps de la réponse.

+0

Dang, je suis sur un environnement d'hébergement partagé et il ne semble pas supporter ce module. –

0

Vous pouvez commencer par la mise en œuvre conditionnelle soutien à la demande GET.

Envoyez un en-tête "Last-Modified" avec le fichier et répondez "304 Not Modified" chaque fois que le client demande le fichier avec "If-Modified-Since" et que vous voyez que le fichier n'a pas été modifié. Certaines informations de fraîcheur sensibles (via les en-têtes "Cache-Control"/"Expires") sont également conseillées pour éviter les demandes répétées pour une ressource inchangée en premier lieu. De cette façon, au moins, les performances perçues peuvent être améliorées, même si vous constatez que vous ne pouvez rien faire concernant les performances réelles.

+0

Déjà fait. Ne résout pas le problème, car en première charge, il est toujours péniblement lent. –

+0

Je vois. D'accord, je laisserai la réponse reposer ici pour les personnes arrivant par Google. – Tomalak

-2

Fondamentalement, vous voulez construire un serveur ... Ce n'est pas trivial.

Il existe un projet très prometteur d'un serveur basé sur PHP: Nanoweb.

C'est gratuit et entièrement extensible.

0

Cela devrait être plutôt rapide. Nous l'avons fait avec de grandes images sans problème. Faites-vous autre chose avant de sortir l'image qui pourrait ralentir le processus, comme le calcul de certaines métadonnées sur l'image?

Éditer: Vous devrez peut-être rincer la sortie et utiliser la puce. IE:

$fp = fopen($strFile, "rb"); 
//start buffered download 
while(!feof($fp)) 
    { 
    print(fread($fp,1024*16)); 
    flush(); 
    ob_flush(); 
    } 
fclose($fp); 
+0

non. Si tel était le problème, j'éprouverais un retard au début et ensuite une charge rapide, mais j'éprouve un débit lent tout au long sans un retard initial notable. –

+0

Si le problème est le débit, vous pouvez essayer d'utiliser fread, c'est en fait plus rapide. Reportez-vous à ce commentaire: http://us3.php.net/manual/fr/function.fpassthru.php#55001 –

+0

Je devrais mentionner que passer par php sera toujours environ 4 fois plus lent que de laisser apache le livrer. –