This post comes from the first version of this blog.
Please send me an email if anything needs an update. Thanks!

Pracując z wieloma technologiami codziennie zachwycamy się możliwościami różnego rodzaju oprogramowania. Kolejne wersje funkcji, bibliotek, frameworków to bezsprzecznie nasz żywioł, w którym słychać tylko głosy mówiące: “a widziałeś, co nowego wprowadzono w wersji 2.0?”. Oczywiście rozwój pojedynczych narzędzi jest ważny, aczkolwiek należy mieć na uwadze fakt, iż najpiękniejsza w tym wszystkim jest harmonia, którą osiąga dopiero zbiór różnych elementów świata oprogramowania, który współpracuje ze sobą. W dzisiejszym wpisie chciałbym zaprezentować prosty sposób na zachęcenie do współpracy języka PHP z powłoką bash.

Windows, PHP, Cygwin, bash: Wykonywanie poleceń w konsoli.

Dzisiejszy wstęp do wpisu, chyba przyznacie mi rację, ma dosyć "podniosły" charakter. Szczerze mówiąc nie wiem, co mnie skłoniło do takiej refleksji, bo siedziałem kilka godzin w pracy nad jednym problemem, którego nadal nie rozwiązałem, a w związku z tym na pewno nie mam "podniosłego" humoru.

Wracając do tematu wpisu, wypadałoby wyjaśnić, co też dzisiaj sobie wymyśliłem. Otóż, jak wie każdy w miarę obeznany w temacie programista, system Windows nie należy do tych, które starają się użytkownikowi ułatwić życie. Szczególnie, jeśli tenże zechce sobie trochę z rzeczonym systemem “pokombinować”, co w pracy “pisarza kodu” jest właściwie na porządku dziennym - tutaj należałoby właściwie wytknąć celowe utrudnianie życia tym co bardziej zaawansowanym jednostkom. Kwestię tego, dlaczego go nadal używam pominę milczeniem. ;]

Ponownie abstrahując od tematu samego systemu operacyjnego, należy zauważyć, że nie zawsze problemy projektu rozwiązujemy pisząc odpowiedni kod. Czasem wygodniej, a nawet lepiej jest wykorzystać narzędzia, jakie oferuje nam konsola. Ze względu na fakt, że konsolowe programy dostępne pod Windowsem są cokolwiek “średnie”, musimy zaopatrzyć się w Cygwina. Instalując go otwieramy sobie bramę do raju programisty - środowiska z pełnoprawną powłoką systemową oferowaną przez basha lub dowolny inny klon sh.

Powiedziałem już o Windowsie, Cygwinie i bashu, więc pewnie zastanawiacie się teraz, gdzie się podział PHP? Spokojnie, już śpieszę z wyjaśnieniami - otóż PHP będzie głównym czynnikiem inicjującym cały proces komunikacji. Aby za pomocą skryptu w tym języku uzyskać dostęp do funkcji oferowanych przez konsolę, musimy wykorzystać funkcję shell_exec(). Przykładowe wywołanie może wyglądać następująco:

1
2
3
4
<?php
$command = '/cygdrive/c/cygwin/bin/convert.exe --version';
$result = shell_exec('C:\cygwin\bin\bash.exe --login -c "'.$command.'"');
echo $result;

Ścieżki podane w tym przykładzie to kwestia wtórna - każdy wie, że powinien zmienić je na odpowiednie. ;] Ważne, abyśmy zauważyli kilka rzeczy:

Po pierwsze, wywołując basha, przekazujemy do niego parametr –login, dzięki któremu zostaje zainicjalizowane całe środowisko uruchomieniowe. Dlatego będziemy mogli używać różnych narzędzi wpisując dokładnie te same polecenia, które wpisalibyśmy normalnie w “czarne okienko”.

Po drugie, możemy wykorzystać ścieżki w stylu Linuksa, a więc zarówno zmapowane partycje dysku twardego dostępne w drzewie /cygdrive/*, jak też typowo linuksowe katalogi /bin, /etc, itd. Dzięki temu będziemy mogli zaprogramować bardziej przenośny kod, który zadziała także w systemach opartych o architekturę Linuksa.

Po trzecie, w zmiennej $result znajdzie się wynik działania polecenia przekazanego do shell_exec() [zmienna $command], a więc możemy go wykorzystać do wczytania do skryptu danych wygenerowanych przez uruchomione programy - np. wynik działania narzędzia grep.

Mam nadzieję, że dzisiejszy wpis przyda Wam się w projektowaniu jeszcze bardziej zaawansowanych i przenośnych rozwiązań. Do zobaczenia w kolejnym wpisie!