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:
<?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!
Warto przeczytać.
Trwa ładowanie…
od siebie bardziej polecam wirtualne maszyny – łatwo można kopiować pod następne testy środowisko, przenosić na inne urządzenia.
Cygwin…hmm, wolałem porzucić Windows niż się z tym użalać…
Mapy Google: korki w Polsce
Pożyjemy, zobaczymy. ;] Aktualnie za wirtualną maszynę robi mi zewnętrzny serwer, także jakoś sobie radzę. Od czasu do czasu frustracja wynikająca z programowania pod Windowsem rośnie, także trzymajmy kciuki, żeby w końcu osiągnęła poziom masy krytycznej. ;]
symfony: Błąd: „Catchable fatal error: Argument 1 passed to sfForm::bind() must be an array, string given”.
Nie chodziło mi, żeby porzucać Windows. Ale zainstalować VMware lub VirtualBox i postawić sobie Linux jako środowisko testowe/dev niż cygwin, LAMP itp.
Tym bardziej jeśli masz 2 monitory, na jeden masz matkę(Windows), a na drugim wirtualną maszynę.
Mapy Google: korki w Polsce
Wrzucenie wirtualki na oddzielny monitor to całkiem ciekawy pomysł, muszę spróbować. ;] Generalnie nie mam problemów z Windowsem [ostatnia instalacja PEAR sprawiła, że trochę musiałem się natrudzić, ale też jakoś poszło], aczkolwiek zdaję sobie sprawę z tego, że kiedyś trzeba będzie Windę rzucić, żeby zrobić coś bardziej poważnie. Na razie i tak mam zbyt dużo pracy, żeby cokolwiek mieszać w mojej aktualnej konfiguracji, także zostawiam to na bliżej niesprecyzowaną przyszłość.
symfony: Błąd: „Catchable fatal error: Argument 1 passed to sfForm::bind() must be an array, string given”.
Pingback: Windows: Otwieranie okna konsoli w danym katalogu. « Tomasz Kowalczyk