2010-12-14 49 views
1

J'ai essayé de mettre en place un moteur de recherche très basique utilisant les modules Whoosh en python appelés depuis PHP. Je l'ai fait fonctionner jusqu'à ce que j'ai mis à jour les modules pour certaines fonctionnalités supplémentaires dont j'avais besoin. À quel point un bogue étrange semblait apparaître. Toute instruction d'impression après la ligne "searcher = ixtemp.searcher()" n'est pas reçue par le script PHP.Problème d'envoi de données entre PHP et Python

Le script de recherche de python est appelé à partir de PHP et le premier résultat est affiché avec les commandes suivantes

exec("python print.py",$output,$ret_code); 

echo $output[0]; 

Le script python -

from whoosh.index import open_dir 

ixtemp = open_dir("index") 

searcher = ixtemp.searcher() 

results = searcher.find("content", u""+"test") 

for k in results: 
    print k['filename'] 

L'exécution du PHP donne maintenant l'erreur suivante -

Remarque: Offset non défini: 0 à /opt/lampp/htdocs/new/search.php on ligne 17

Le script python fonctionne lorsque je l'exécute tout seul. Après une petite enquête, il semble que toutes les instructions d'impression avant la ligne "searcher = ixtemp.searcher()" peuvent être lues par le PHP, mais toutes ne sont pas reçues par le script PHP. J'ai aussi essayé les fonctions popen() et proc_open, mais elles ont le même problème.

Des idées sur ce qu'est le problème ou comment je peux le contourner?

Merci

Répondre

0

J'ai manqué des idées et j'ai décidé de chmod 777 le répertoire ... et ... cela a fonctionné. Je ne suis pas sûr de savoir pourquoi, car les données pourraient toujours être envoyées au-dessus de la fonction searcher().

Peut-être que lors de l'initialisation de la recherche, la méthode essayait de modifier les fichiers d'index protégés?

Mais cela ne pouvait pas être le problème en soi, car il travaillait toujours avec l'interpréteur.

Il doit donc avoir été le fichier PHP. Il semble avoir été la protection contre indirectement en modifiant les fichiers d'index.

0

Deux choses. Êtes-vous sûr que le script se termine? Il pourrait être suspendu à l'appel du chercheur(). Deuxièmement, je suppose que searcher() pourrait rediriger stdout. Je suppose que votre script ne se termine pas, ou qu'il arrive à expiration ou quelque chose comme ça.

EDIT On dirait que ce code dépend du répertoire de travail actuel. Vous mentionnez ci-dessous que cela fonctionne bien dans l'interprète - dans le même wd que le serveur web met en place?

+0

Bonjour, le script prend moins d'une seconde à exécuter et fonctionne parfaitement à l'intérieur de l'interpréteur. Aussi et imprimer les instructions avant que "searcher = ixtemp.searcher()" fonctionne. – usertest

+0

Comment savoir si stdout était en cours de redirection? Et comment pourrais-je arrêter ça? Merci – usertest

+0

Salut, oui les deux scripts sont au même endroit et les données se déplacent entre eux tant que ce n'est pas après "searcher = ixtemp.searcher()", donc cela ne peut pas être un problème avec le répertoire de travail. – usertest

0

Êtes-vous sûr que le script s'exécute du tout?

Vérifiez le $ return_code.

Il est possible qu'il ne trouve pas votre script print.py ou peut-être même le fichier python.exe.

+0

Salut, oui il s'exécute et comme je l'ai dit l'instruction d'impression envoie des données, mais seulement si c'est avant "searcher = ixtemp.searcher()" – usertest

+0

Ah! Dans ce cas, il a probablement du mal à localiser le répertoire "index"! –

+0

Je ne pense pas que cela puisse être parce que le fichier PHP n'a pas besoin de savoir où se trouve le répertoire index, seul le script python doit le savoir et afficher les résultats traités. Et le python fonctionne bien l'interprète. En outre, cela n'expliquerait pas pourquoi aucune sortie ne peut être envoyée après la ligne mentionnée ci-dessus. – usertest