J'essaie de diffuser / pipe un fichier sur le navigateur de l'utilisateur via HTTP de FTP. C'est-à-dire que j'essaie d'imprimer le contenu d'un fichier sur un serveur FTP.
C'est ce que j'ai jusqu'à présent: p> avec cette approche, je ne peux envoyer que de petits fichiers au navigateur de l'utilisateur. Pour les fichiers plus importants, rien n'est imprimé et je reçois une erreur fatale (lisible des journaux Apache): P> Erreur fatale PHP: Taille de la mémoire autorisée de 16777216 octets épuisés (essayé d'allouer 15994881 octets) dans /xxx/ftpconnection.php à la ligne 200 p>
blockQuote> J'ai essayé de remplacer Comment télécharger efficacement à partir de FTP tout en envoyant ces données au navigateur en même temps? p> Remarque: je ne voudrais pas utiliser $ ceci- > FTP-> Get CODE> ressemble à ceci: p>
php: // sortie code> avec
php: // stdout code> sans succès (rien ne semble être envoyé au navigateur). p>
file_get_contents ('FTP: // utilisateur: passe @ host: port / chemin / chemin / vers / fichier '); code> ou similaire. em> p> p> P>
6 Réponses :
On dirait que vous devez désactiver la mémoire tampon de sortie pour cette page, sinon PHP essaiera de l'adapter à toute la mémoire.
Un moyen facile de faire est quelque chose comme: p>
while (ob_end_clean()) { ; # do nothing }
J'ai dû utiliser tandis que (ob_get_length ()) ob_end_clean (); code> au lieu de la faire fonctionner. Cependant, je reçois toujours l'erreur fatale décrite dans l'OP.
(Je n'ai jamais rencontré ce problème moi-même, donc c'est juste une supposition sauvage; mais peut-être ...) em> peut-être changer la taille du tampon de sortie pour le "fichier" Vous écrivez pour pouvoir aider? p> Pour cela, voir par exemple: p> avec ceci, votre code doit utiliser un Stream non tamponné - cela pourrait vous aider ... p> p> stream_set_write_buffer code>
. p>
Essayez: Je trouve avec beaucoup d'opérations de fichier, il est intéressant de laisser la fonctionnalité du système d'exploitation sous-jacente s'en occuper pour vous. P> P>
Y a-t-il un moyen d'échapper au nom d'utilisateur et mot de passe afin qu'ils contiennent des caractères tels que @ code> ou
/ code> Ça va lire correctement?
Une recherche rapide apportée PHP's's's's's's's's's's's's's"http://at.php.net/flush" Rel="nofollow Noreferrer"> Flush . P>
Cet article pourrait également présenter un intérêt: http: //www.net2ftp .org / forums / viewtopic.php? id = 3774 p>
trouvé une solution!
Créer une paire de socket (tuyau anonyme?). Utilisez la fonction non bloquante testé pour être < Strong> rapide fort> (facilement 10 Mo sur une connexion de 100 Mbps), il n'y a donc pas beaucoup d'i / O. p> Assurez-vous d'effacer les tampons de sortie. Les cadres tamponnent couramment votre sortie. Em> p> ftp_nb_fget code> pour écrire sur une extrémité du tuyau et
echo code> l'autre extrémité du tuyau. P>
+1 pour une réponse vraiment bonne. Pour ceux qui se demandent pour toutes les constantes de stream_socket_pair code>, regardez ici: php.net/manual/fr/stream.constants.php
Je sais que c'est vieux, mais certains peuvent encore penser que c'est utile.
J'ai essayé votre solution sur un environnement Windows, et cela a fonctionné presque em> parfaitement: p> $ctx = stream_context_create();
stream_context_set_params($ctx, array('notification' =>
function($code, $sev, $message, $msgcode, $bytes, $length) {
switch ($code) {
case STREAM_NOTIFY_CONNECT:
// Connection estabilished
break;
case STREAM_NOTIFY_FILE_SIZE_IS:
// Getting file size
break;
case STREAM_NOTIFY_PROGRESS:
// Some bytes were transferred
break;
default: break;
}
}));
@readfile("ftp://$user:$pass@$host/$filename", false, $ctx);
Je serais vraiment intéressé par cette réponse aussi!