2009-12-18 4 views
1

J'ai écrit une classe toPdf en PHP qui a la possibilité de la diffuser dans le navigateur. Si le fichier n'est pas marqué comme sauvegardable, je dois effectuer un nettoyage après l'avoir diffusé. Puisque ce n'est pas possible, je me demande s'il y a un moyen de lire le fichier dans une variable, effectuer mon nettoyage, envoyer les en-têtes, puis démarrer le fichier à la vapeur?Diffusion de contenu variable en PHP

Merci!

+0

Allez Kyle; faites-le. Nous en avons besoin hier. ;) – keithjgrant

+0

Pourquoi y a-t-il un fichier en premier lieu? C'est à dire. n'est pas possible de garder toutes les données en mémoire sans écrire quelque chose dans un fichier? – VolkerK

+0

La génération de PDF est effectuée via la ligne de commande Unix. Cette application l'a généré en tant que fichier. – Kyle

Répondre

1

Vous pouvez faire quelque chose comme

!headers_sent() or die('something has already been sent to the client'); 

header('Content-type: application/pdf'); 
readfile($file); 
unlink($file); 

(et aussi jeter un oeil à http://docs.php.net/function.ignore_user_abort)

0

tampon de sortie Try (http://us.php.net/manual/en/book.outcontrol.php). Le seul problème que je pourrais voir se produire ici est que si vos fichiers sont extrêmement volumineux, vous créez une copie complète du fichier en mémoire (le buffer), mais ob est destiné à capturer toutes les sorties du script (sauf en-têtes), et j'espère faire l'affaire.

0

Lorsque vous enchaînez des commandes unix telles que sort data.txt | less, la commande stdout d'une commande "devient" le stdin d'une autre commande. Vous pouvez faire la même chose avec php lorsque vous appelez un autre processus. Mais dans votre cas, vous voulez les données de stdout d'un processus et l'envoyer à stdout php (l'envoyer au client).
La façon la plus simple est d'utiliser passthru()

header('Content-type: application/pdf'); 
passthru('yourcommand -o -'); 

Mais puisque vous devez définir l'en-tête application/pdf avant que les commandes envoie une sortie de la gestion des erreurs peut être difficile . Le client attend un document PDF et si vous envoyez autre chose, par ex. un message d'erreur en texte brut, le résultat sera ... confus.
Néanmoins, vous pouvez récupérer les données de la commande stdout de votre commande, mais sans que php colle automatiquement la stdout à la sortie stdout de php. voir popen() et/ou proc_open(). Vous obtiendrez une poignée que vous pourrez lire (presque comme une poignée de fichier) et obtiendrez la sortie de l'application vers stdout (avec proc_open vous obtenez également le flux stderr) sans aucun fichier physique.