2012-12-05 8 views
5

Natknąłem się na fenomen, którego nie potrafię sobie wytłumaczyć.popen i poclose pod serwerem zend

Używam popen do wykonania php, a następnie wykonanie skryptu php w ten sposób, i PClose, aby to zamknąć. Jak na razie wszystko w porządku. Wpadłem na poważne kłopoty, ponieważ skrypt, w którym go użyłem, nie został wykonany, a zamiast tego po 3 próbach z rzędu rozbiłem serwer zend (żadna strona już się nie otworzyła). Dowiedziałem się, że powodem jest to, że użyłem niewłaściwego katalogu dla php.exe. Przykład:

if (pclose(popen("C:\wrongDir\php\php.exe C:\Zend\Apache2\htdocs\myApp\public\mytest.php 57 > C:\Logs\1\0\jobOut.log 2> C:\Logs\1\0\jobErr.log"))>-1) 
{ 
..... 
} 

Oprócz „wrongDir” wszystkich innych katalogów były prawidłowe .... popen nawet tworzone pliki jobOut i jobErr (które były puste). (uwaga: PHP nie znajduje się w ścieżce wyszukiwania, dlatego nie znaleziono go bez poprawnej ścieżki)

Mimo że teraz rozwiązałem problem ... Mam pytanie, czy jest to normalne zachowanie, lub jeśli zrobiłem coś złego (może nawet ustawienia serwera).Z tego, co przeczytałem w podręczniku o obu poleceniach, brzmiało dla mnie, że w moim przypadku powinienem był mieć wartość zwracaną -1 lub 0, a nie problem, który wpadł mi z procesem, a potem serwer zwisający).

Dzięki.

Odpowiedz

1

Wygląda na to, że pclose() nie zwraca statusu wyjścia procesu, ale raczej jego możliwości zamknięcia procesu.

Aby uzyskać 'kodu' wykorzystanie procesu terminacji pcntl_wifexited() i pcntl_wexitstatus()

http://php.net/manual/en/function.pclose.php
http://php.net/manual/en/function.pcntl-wexitstatus.php

+0

Ciekawe chociaż jedno pytanie, by tam pozostać. Dlaczego się tam zawiesza (w ten sposób proces potomny się zawiesza, chociaż jeśli wpiszesz to samo polecenie w linii poleceń, to kończy się błędem i ponownie wejdę do wiersza poleceń ... nie będę się tam rozłączał.) Tak więc część mojego pytania byłoby to normalne zachowanie lub jeśli jest to możliwy błąd konfiguracji, ponieważ gdy wykonuję errrującą komendę przez php proces potomny pozostaje aktywny przez czas nieokreślony) Tak więc, jako że proces wciąż "działa", nie powinien generować tam kod wyjścia. – Thomas

+0

Zastanawiam się, czy zagnieżdżanie popen/pclose powoduje problemy. Czy nadal się psuje, jeśli podzielisz to na kilka linii? – ethrbunny

+0

Więc nie mogłem przetestować go na serwerze zend (ten nie jest obecnie dostępny), ale byłem w stanie przetestować nieco na xampp. Problem nie jest spowodowany bezpośrednio przez popen/pclose! Jest bardziej spowodowane przez sam serwer, jak się wydaje. Kiedy nieistniejący exe jest nazywany komunikatem o błędzie otwiera się alertbox na serwerze (wykonanym przez serwer WWW sam w sobie .... w ten sposób na serwerze Zend nie widziałem go, ale na mojej lokalnej maszynie z lokalnym serwerem WWW teraz). A to oznaczało, że proces się zakończył, więc się nie zamknął. Dla pcntl_wifexited() czy poprawiam tam, że będę musiał przerobić, aby używać pcntl_fork dla wielu proc? – Thomas

Powiązane problemy