2010-10-07 18 views
1

J'ai lutté une demi-journée et est arrivé à la conclusion que cela ne peut pas être fait. J'ai jeté mes scripts php et l'ai réécrit en perl et cela a fonctionné dès le début comme je le voulais. Pourtant, je veux savoir si une telle tâche triviale peut être faite correctement en PHP. La question: J'ai arbitrairement long (en taille et temps) le téléchargement de fichiers (via données brutes POST) et j'ai simplement besoin de l'enregistrer dans un fichier avec PHP. La façon dont cela fonctionne avec PHP est qu'il traite complètement les données postées, les enregistre dans un fichier et ensuite l'exécution de mon script commence (le téléchargement de mon fichier dure 30 minutes). Même si j'ai essayé de fopen ("php:/stdin" ou php: // input) ça fonctionnait encore de manière retardée. Ce dont j'ai vraiment besoin, c'est de pouvoir traiter séquentiellement les données postées entrantes en blocs. J'ai essayé: 1) modphp, 2) php-cgi, 3) php-cli exécuté comme un exécutable cgi. Même si php-cgi est destiné à être utilisé comme un cgi, il prétraite les données publiées (de sorte que $ _POST devient disponible) et ne fonctionne pas de la même manière que le momphp standard. La version CLI fonctionne comme un script cgi ne fonctionne pas, car elle ne peut pas lire depuis php: // stdin ou php: // input du tout! Quoi que j'ai essayé, rien n'a fonctionné pour moi et je suis arrivé à la conclusion que cela ne peut pas être fait avec PHP ... ou peut-il?Gérer HTTP POST avec PHP

merci

Répondre

0

Bien sûr, PHP peut le faire. Les fichiers téléchargés sont stockés dans un répertoire temporaire jusqu'à ce que le script PHP puisse interagir avec eux. Les informations nécessaires pour le faire sont dans le tableau $_FILES.

$field_name = 'file'; # from the HTML form control 

$move_result = move_uploaded_file(
    $_FILES[$field_name]['tmp_name'], 
    $real_destfile 
); 

if ($move_result) { 
    print "successfully uploaded file (originally called '$_FILES[$field_name]['name']' to $real_destfile"; 
} else { 
    print "failed to receive uploaded file."; 
} 
+0

Ce n'est pas ce que le PO demande. Il veut accéder au fichier/exécuter son script AVANT que son long processus de téléchargement se termine. – nico

0

Il semble que vous souhaitiez diffuser des données. Pour ce faire, vous devez configurer une socket qui est prête à recevoir des données en tant que flux .. par exemple, remplacer le serveur web Apache.

Votre problème n'est pas la langue, c'est le serveur web. le serveur web écoute le port 80, puis fait ce qu'il fait. Par exemple, écrivez les données de poste dans un fichier, puis lancez le script php.

Vous pouvez créer un programme de port personnalisé comme vous l'avez fait avec Pearl. vous pouvez aussi faire la même chose avec PHP, et écouter le port 80, en utilisant un script php basé sur une ligne de commande, plutôt que celui qui est niché dans Apache. Mais PHP n'est pas le meilleur langage pour le faire avec .. Je suggère Python.

Il y a un surcoût lié aux communications HTTP, il est possible qu'un protocole plus léger vous soit utile, cela peut réduire votre temps de téléchargement. Si votre téléchargement prend trop de temps, vous pouvez le faire dans une méthode AJAX, et le laisser continuer pendant que votre application client est encore active. l'application client AJAX pourrait également faire le travail de le diviser en morceaux.

+0

Oui, je diffuse des données. La raison pour laquelle je ne veux pas utiliser $ _FILES est qu'il ne fonctionne pas bien avec les uploads BIG et LONG (dont la diffusion vers le serveur ressemble à PHP). La ligne de commande PHP est la pire des idées, sérieusement je ne peux pas croire à quel point c'était grave! J'aime beaucoup php, mais quand j'ai essayé de l'utiliser en mode CLI, j'ai réalisé que c'était un tas de merde: il y avait trop d'erreurs et je ne pouvais pas voir les logs. J'ai fini par écrire un script perl cgi. C'est mieux que d'ouvrir une socket: apache appelle le script cgi et transmet toutes les commandes de socket au programme cgi. – Pavel

+0

Je ne connais pas Python du tout, donc ce n'est pas ma solution. J'ai trouvé comment le faire (via cgi-perl) et je sais à peu près tout ce que tcp-listeners a fait pour le faire, mais je veux vraiment savoir si cela peut être fait avec php en manipulant des entrées/post-données brutes. C'est très inutile d'avoir une entrée php: // qui peut faire croire qu'elle permet un accès direct au flux d'entrée. – Pavel