Aplikacje konsolowe w PHP

Coldpeer

Język PHP posiada możliwość uruchamiania skryptów z linii poleceń, czyli innymi słowy - na pisanie skryptów powłoki. Podobnie jak C/C++, Perl czy Python, udostępnia standardowe strumienie, czyli kanały komunikacji między komputerem a otoczeniem (najczęściej terminalem). Należą do nich strumienie wejścia/wyjścia i błędów. Dzięki nim można pisać aplikacje konsolowe na przykład operujące na danych przyjętych od użytkownika.

Uruchomienie

Skrypty w systemach uniksowych najczęściej wystarczy odpalić poleceniem:

$ php plik.php
Jeśli chcemy uruchamiać plik jak aplikację wykonywalną, wystarczy nadać mu odpowiedni atrybut:

$ chmod +x plik.php
I w kodzie na początku dodać ścieżkę do interpretera:

#!/usr/bin/php
Wtedy odpalić możemy w ten sposób:

$ ./plik.php
W systemie Microsoft Windows należy odpalić plik php.exe/php-cgi.exe:

> c:\sciezka\php.exe plik.php
Bądź, jeśli mamy dodaną ścieżkę do interpretera PHP do zmiennej środowiskowej PATH:

> php plik.php

Standardowy strumień wyjścia

Umożliwia wypisanie danych na standardowe wyjście (ang. output). Aby tego dokonać, należy:

a) po prostu wypisać za pomocą np. echo / print / printf:

<?php
  echo 'Hello there';
?>

b) otworzyć "plik" php://stdout (tylko do zapisu):

<?php
  $stdout = fopen('php://stdout', 'w');
  fwrite($stdout, 'Hello there');
  fclose($stdout);
?>

c) skorzystać ze stałej STDOUT, która zawiera uchwyt do wspomnianego wyżej "pliku":

<?php
  fwrite(STDOUT, 'Hello there');
?>

Warto zaznaczyć, że najszybsze i najwygodniejsze jest użycie metody a).

Standardowy strumień wejścia

Umożliwia pobranie danych ze standardowego wejścia (ang. input). Aby się do niego dostać, należy:

a) otworzyć "plik" php://stdin (tylko do odczytu):

<?php
  $stdin = fopen('php://stdin', 'r');
  echo 'Napisales: ' . fgets($stdin, 1024);
  fclose($stdin);
?>

b) skorzystać ze stałej STDIN, która zawiera uchwyt do wspomnianego wyżej "pliku":

<?php
  echo 'Napisales: ' . fgets(STDIN, 1024);
?>

Standardowy strumień błędów

Umożliwia wypisywanie danych na standardowy strumień błędów (ang. error). Aby tego dokonać, należy:

a) otworzyć "plik" php://stderr (tylko do zapisu):

<?php
  $stderr = fopen('php://stderr', 'w');
  fwrite($stderr, 'Wystapil blad');
  fclose($stderr);
?>

b) skorzystać ze stałej STDERR, która zawiera uchwyt do wspomnianego wyżej "pliku":

<?php
  fwrite(STDERR, 'Wystapil blad');
?>

Wywoływanie zewnętrznych poleceń

Przy pisaniu aplikacji konsolowych przydatna może być możliwość uruchamiania zewnętrznych aplikacji. Służą do tego funkcje exec, system, passthru.

Wyjątkowy PHP

Procesy uruchamiane w systemach operacyjnych przyjmują argumenty uruchomieniowe. Np polecenie ping przyjmuje jeden parametr uruchomieniowy, którym jest host.

ping google.com

W większości cywilizowanych języków programowania, można "uruchomić" proces znając lokalizację pliku wykonywalnego i podając listę parametrów startowych. Niestety, PHP jest trochę ułomny pod tym względem, i nie można bezpośrednio uruchomić procesu z listą argumentów - można jedynie wywołać polecenie shell, które następnie zostanie zinterpretowane i przetłumaczone na argumenty wejściowe.

<?php
  exec('./aplikacja');
?>

Uruchomi program aplikacja (znajdujący się w obecnym katalogu). Jego kod może wyglądać np. tak:

#!/usr/bin/bash
rm plik_do_usuniecia

Oczywiście, można to wszystko zrobić funkcją unlink() z PHP, ale chodzi tylko o pokazanie samej idei.

Podsumowanie

Jak widać obsługa strumieni I/O nie jest skomplikowana. W systemach uniksowych króluje BASH, sh - nie znając ich możemy napisać równie szybko i prosto w PHP skrypty, które będą pomocne w codziennej pracy.

PHP

0 komentarzy