2009-08-13 20 views
7

Od wewnątrz programu PHP chcę znać lokalizację pliku binarnego wykonującego go. Perl ma w tym celu $^X. Czy istnieje odpowiednik w PHP?Jak znaleźć aktualnie działający plik wykonywalny PHP?

Jest tak, że może wykonać proces potomny PHP używając samego siebie (zamiast twardego kodu ścieżki lub zakładać, że "php" jest poprawny).

UPDATE

  1. używam lighttpd + FastCGI, nie Apache + mod_php. Więc tak, istnieje binarny PHP.
  2. eval/include nie jest rozwiązaniem, ponieważ spawnuję serwer, który musi żyć dalej niż żądanie.

Czego próbowałem i nie działa:

  • $_SERVER['_'] wygląda to, co chcę z linii poleceń, ale jego faktycznie od zmiennej środowiskowej ustalonym przez powłoki ostatni wykonany program. Po uruchomieniu z serwera WWW jest to plik binarny serwera WWW.
  • which php nie będzie działać, ponieważ plik binarny PHP nie ma gwarancji, że jest taki sam jak w serwerze WWW PATH.

Z góry dziękuję.

Odpowiedz

14

PHP_BINDIR stała daje katalog, w którym binarne php jest

+1

Najbliższa rzecz, jaką słyszałem, dzięki. – Schwern

+0

Mimo to niektórzy ludzie głosują na mnie, prawdopodobnie dlatego, że nie testowali tego :) Cieszę się, że mogę pomóc. – Lepidosteus

+1

Używam tego w mojej konsoli iphp. Był dla mnie niezawodny. – apinstein

2

Tak, $_SERVER['_'] o czym mówisz lub o ile jest blisko. Powodem, dla którego uzyskujesz plik binarny serwera WWW, gdy jest uruchamiany z Internetu, jest to, że /usr/bin/php nie ma nic wspólnego z wykonywaniem serwera WWW; to, co działa, to osobny SAPI. Nie ma nic z internetowej instancji PHP, która wskazywałaby na /usr/bin/php, ponieważ nie ma żadnego powodu, aby istniała.

+0

Bez powodu ... z wyjątkiem tego, o którym mowa w moim pytaniu. – Schwern

+0

@schwern: ale jeśli plik wykonywalny jest serwerem internetowym, a php jest właśnie używany jako biblioteka, dlaczego istnieje powód wskazania pliku binarnego PHP, jeśli nie jest on używany. Różnica polega na tym, w jaki sposób serwery internetowe używają perla, ponieważ w większości przypadków interfejs to CGI, co oznacza uruchamianie pliku wykonywalnego perla (są wyjątki). Powiedziałbym, że najlepszym wyborem jest ciąg konfiguracji lub użycie eval(), jeśli jest to wystarczająco dobre dla twoich potrzeb. – Fredrik

+0

@Schwern: Jeśli * usunąłeś * '/ usr/bin/php', twój serwer WWW nadal będzie przetwarzał pliki PHP. Nie wiem, jak ci powiedzieć, dlaczego nie ma * technicznego * powodu dla połączenia między nimi bardziej wyraźnie. – chaos

0

zależności od sposobu php jest zainstalowany nie można znaleźć pliku wykonywalnego PHP. jeśli php działa jako moduł dla serwera WWW takiego jak moduł Apache, to nie ma binarnego połączenia. możesz zajrzeć do php_info(), wyświetla wszystko. może również ścieżkę do php. w ramach tej ścieżki możesz założyć plik binarny PHP.

ale dlaczego chcesz wywołać dodatkowy proces? można wykonywać inne pliki php za pomocą polecenia include lub eval. nie ma powodu, aby spawnować nowy proces.

+0

Być może chcę odrodzić serwer? – Schwern

+0

+1 po prostu dlatego, że nie widzę powodu, dla którego miałbym być -1 – Fredrik

-2

co: <?php exec("which php"); ?>

Ale to Unix/Linux tylko: D

+1

Nie ma absolutnie żadnej gwarancji, że binarny PHP, który uruchomił program jest taki sam jak binarny PHP na twojej ścieżce. W mojej sytuacji jest to wyraźnie nie tak. – Schwern

1

PHP_BINDIR stała jest prawdopodobnie najłatwiejsze w użyciu; The Next Best Thing mogłem wymyślić jest w zasadzie ponownego tworzenia tej ścieżki bindir od ustawienia extension_dir konfiguracji:

$phpbin = preg_replace("@/lib(64)?/.*[email protected]", "/bin/php", ini_get("extension_dir")); 

Ma regex w nim, więc czuje się bardziej jak swój ojczysty Perl, ale w przeciwnym razie (!) nie jest szczególnie optymalny.

1

W PHP5.4 można użyć PHP_BINARY stała, to nie będzie działać poprzez mod_php lub podobne, ale będą za pośrednictwem CGI itp

dla wcześniejszych wersji PHP readlink('/proc/self/exe'); prawdopodobnie będzie w porządku, to nie będzie ponownie działa przez mod_php.

-1

Szukałem pliku wykonywalnego php7 na moim Macu (OSX El Capitan) w celu skonfigurowania i zainstalowania xdebug (potrzebne do znalezienia odpowiedniej wersji phpize do uruchomienia). Żadne z rozwiązań znalazłem pracował dla mnie, więc po prostu skończyło się, szukając go:

find/-name php -print 

Wiedziałem (z phpinfo()), że został uruchomiony php7, więc udało mi się wywnioskować prawidłowego katalogu z opcje przedstawione przez find.

+0

Dzięki, ale to nie odpowiada na pytanie. Program nie może zinterpretować listy jak ludzka puszka. Człowiek po prostu zgaduje, który jest właściwy (źródło wielu godzin frustracji). A to tylko szuka plików o nazwie "php", a uruchomiony tłumacz może być nazwany cokolwiek. – Schwern

Powiązane problemy