11
votes

Stream FTP Télécharger pour sortir

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: xxx

$ ceci- > FTP-> Get ressemble à ceci: xxx

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):

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

J'ai essayé de remplacer php: // sortie avec php: // stdout sans succès (rien ne semble être envoyé au navigateur).

Comment télécharger efficacement à partir de FTP tout en envoyant ces données au navigateur en même temps?

Remarque: je ne voudrais pas utiliser file_get_contents ('FTP: // utilisateur: passe @ host: port / chemin / chemin / vers / fichier '); ou similaire.


1 commentaires

Je serais vraiment intéressé par cette réponse aussi!


6 Réponses :


1
votes

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
}


1 commentaires

J'ai dû utiliser tandis que (ob_get_length ()) ob_end_clean (); au lieu de la faire fonctionner. Cependant, je reçois toujours l'erreur fatale décrite dans l'OP.



0
votes

(Je n'ai jamais rencontré ce problème moi-même, donc c'est juste une supposition sauvage; mais peut-être ...)

peut-être changer la taille du tampon de sortie pour le "fichier" Vous écrivez pour pouvoir aider?

Pour cela, voir stream_set_write_buffer .

par exemple: xxx

avec ceci, votre code doit utiliser un Stream non tamponné - cela pourrait vous aider ...


0 commentaires

6
votes

Essayez: XXX

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.


1 commentaires

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 @ ou / Ça va lire correctement?



0
votes

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 .

Cet article pourrait également présenter un intérêt: http: //www.net2ftp .org / forums / viewtopic.php? id = 3774


0 commentaires

8
votes

trouvé une solution!

Créer une paire de socket (tuyau anonyme?). Utilisez la fonction non bloquante ftp_nb_fget pour écrire sur une extrémité du tuyau et echo l'autre extrémité du tuyau.

testé pour être < Strong> rapide (facilement 10 Mo sur une connexion de 100 Mbps), il n'y a donc pas beaucoup d'i / O.

Assurez-vous d'effacer les tampons de sortie. Les cadres tamponnent couramment votre sortie. xxx


1 commentaires

+1 pour une réponse vraiment bonne. Pour ceux qui se demandent pour toutes les constantes de stream_socket_pair , regardez ici: php.net/manual/fr/stream.constants.php



1
votes

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);


0 commentaires