2010-03-16 15 views
0

J'ai 2 scripts courts. Le premier, un script awk, traite un gros fichier et imprime dans un tube nommé 'myfifo.dat'. La seconde, un script Perl, exécute une commande LOAD DATA LOCAL INFILE 'myfifo.dat'.... Ces deux scripts fonctionnent quand ils sont exécutés localement comme ceci:Blocage de tuyau nommé avec personne utilisateur

lee.awk big.file & 
lee.pl 

Cependant, quand je l'appelle ces scripts à partir d'une page Web de PHP, les blocs de canal nommé:

$awk="/path/to/lee.awk {$_FILES['uploadfile']['tmp_name']} &"; 
$sql="/path/to/lee.pl"; 

if(!exec($awk,$return,$err)) throw new ZException(print_r($err,true)); //blocks here 
if(!exec($sql,$return,$err)) throw new ZException(print_r($err,true)); 

Si je modifie le awk et les scripts Perl afin qu'ils écrivent et lisent dans un fichier normal, tout fonctionne bien à partir de PHP. Les autorisations sur le fifo et le fichier normal sont 666 (à des fins de test). Ces opérations s'exécutent beaucoup plus rapidement à travers un tuyau nommé, donc je préfère en utiliser un. Des idées pour le débloquer?

ps. Dans le cas où vous vous demandez pourquoi je vais à toute cette aggravation, voir this SO question.

Répondre

1

Comme vous le savez probablement, lorsque vous ouvrez un tube nommé pour l'écriture, vous allez bloquer jusqu'à ce que quelqu'un d'autre l'ouvre pour la lecture. Je suppose que c'est pourquoi vous avez le "&" à la fin de la ligne de commande dans le 1er appel exec().

Mais PHP respecte-t-il cette syntaxe? Je ne suis pas un expert PHP, mais si ce n'est pas la bonne méthode pour que PHP exec() retourne avant que l'enfant ait fini d'exécuter, les deux appels exec() seront sérialisés et cela expliquerait totalement ce comportement de blocage.

+0

Je n'ai aucune connaissance spécifique pour le problème posé, mais mes tripes me disent, que c'est une voie de recherche prometteuse. +1 – Boldewyn