Skrypty CLI w PHP

Bardzo długo nie miałem okazji pisać skryptów CLI w czystym PHP. Wszystkie ostatnie commandy jakie wykonywałem zawsze były pisane w Symfony. Jednak przyszedł ten czas, że nie mogłem użyć SF i miałem dzięki temu fajny moment do odświeżenia swoich informacji na temat skryptów CLI w PHP

Jednak zacznijmy od podstaw. Skrypt CLI (Command Line Interface) jest to po prostu sposób na komunikację się z systemem przez powłokę tekstową (bash, sh itp). Czyli wpisujemy polecenie i dostajemy gotowy wynik. Idealnym przykładem są instalatory dla porównania system Linux i Windows. W systemie linux takim poleceniem może być przykładowo apt-get install [nazwaprogramu] i da to ten sam wynik co w przypadku Windowsa gdzie ściągamy program. Klikamy install.exe, przeklikujemy cały proces i zamykamy okienko instalacyjne.

Jednak my tutaj skupimy się na skryptach CLI ale troszkę prostszych. Przykładowo dodawanie nowego użytkownika przez skrypt czy wykonanie migracji w bazach danych. Także przykład życiowy. Zamiast logować się do phpMyAdmin przeklajać całe SQL i wklejać to dajmy do 10 baz klientów. Wystarczy wpisać polecenie (przykładowo) php doctrine:schema:migrate --kernel=nazwaklienta

Zacznijmy od najprostszego czyli uruchomienia skryptu w CLI. Jest to banalnie proste wystarczy wpisać w konsoli:

php path/to/script.php [args]

Jak stworzymy sobie teraz plik script.php i wrzucimy do niego echo 'test'; to w konsoli dostaniemy sam napis test.

Argumenty w skryptach php

Pierwszy sposób:

php path/to/script.php a=1 b[]=2 b[]=3

Teraz aby odczytać te dane musimy w kodzie napisać coś takiego:

parse_str(implode('&', array_slice($argv, 1)), $args);
var_dump($args);

W ten sposób dostaniemy tablicę $args z argumentami, które podaliśmy przy wywołaniu skryptu.

Drugi sposób to wykorzystanie getOpt nasz skrypt będzie wtedy taki bardziej profesjonalny:

$shortopts  = "";
$shortopts .= "f::"; 
$shortopts .= "a::";

$options = getopt($shortopts, []);
var_dump($options);

i wywołanie:

 php script.php -f1 -ass

W wyniku dostaniemy:

array(2) {
  ["f"]=>
  string(1) "1"
  ["a"]=>
  string(2) "ss"
}

jest też opcja z długimi argumentami. Wtedy w tablicy musimy umieścić pełne nazwy interesujących nas argumentów:

$shortopts = "";

$longopts = array(
    "foo:",
    "bar:",
);
$options = getopt($shortopts, $longopts);
var_dump($options);

Wywołanie:

php script.php --foo=test --bar=test2

Wynik:

array(2) {
  ["foo"]=>
  string(4) "test"
  ["bar"]=>
  string(5) "test2"
}

Mamy tutaj jeszcze te dwukropki na końcu. Jak jest jeden dwukropek to mamy wartość opcjonalną, a jak mamy dwa dwukropki to wtedy wartość jest wymagana. Jednak moim zdaniem nie działa to jak powinno, bo jak nie dodasz parametru wymaganego to nie dostajesz ani błędu ani wartości pustej i trzeba się przed tym zabezpieczać dodatkowo.

Wartość wymagana polega tutaj na tym, że musisz wpisać argument bez podanej wartości, aby dostać false przykład:

$shortopts = "f::b:";

$longopts = array(
    "foo::",
    "bar:",
);
$options = getopt($shortopts, $longopts);
var_dump($options);

Wywołanie:

php script.php -f -b

Wynik:

array(1) {
  ["f"]=>
  bool(false)
}

Kolorowanie tekstu w konsoli

Tą część tym razem pokaże jedynie jako ciekawostkę, a w następnym artykule skupimy się bardziej na samym kolorowaniu, ponieważ to jest jednak bardzo ważny temat. Dlaczego?

Ponieważ przy tworzeniu aplikacji bardzo często dostajemy bardzo duże ściany tekstu z informacjami o tym co się dzieje podczas wywoływania skryptu i ważne rzeczy typu sukces czy błąd można ominąć. A tak w prosty sposób oznaczymy kolorem odpowiedni kawałek informacji i od razu widzimy to co nas interesuje.


echo "Ten tekst będzie na \e[31mczerwono\e[0m \r\n";
echo "Ten tekst będzie na \e[32mzielono\e[0m \r\n";
echo "Ten tekst jest standardowy\r\n";

Podmiana koloru zaczyna się od: \e[ następnie mamy kod koloru i m. Następnie mamy tekst, który chcemy pokolorować i na końcu resetujemy te wartości poprzed \e[0m. Jeśli nie dodasz tego na końcu to po prostu cały dalszy tekst będzie w kolorze takim jaki podałeś wcześniej.

Kolory są podawane wg tablicy ANSI i jeśli potrzebujesz już teraz więcej kolorów to zapraszam do wyszukiwarki. Natomiast jak interesuje Ciebie obszerniej ten temat to zapraszam do obserwowania IG gdzie poinformuje o artykule na ten kolorowania tekstu w skryptach CLI.

Jak sprawdzić czy skrypt został odpalony w konsoli?

Jeżeli chcesz sprawdzić czy skrypt został odpalony przez CLI to interesuje Ciebie stała PHP_SAPI. Jeśli wykonujemy skrypty przez konsole to jej wartość będzie cli natomiast dla przeglądarki będzie to fpm-fcgi.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *