CLI Marijan Šuflaj FER, 2018
Sadržaj Konzolno sučelje Pokretanje skripti Kontrola procesa Alarmi Alat Composer
Konzolno sučelje Omogućuje pisanje konzolnih aplikacija Postoje razlike u odnosu na web-sučelje Ne šalju se zaglavlja Ne mijenja se trenutni radni direktorij Vrijeme je izvršavanja neograničeno secure.php.net/manual/en/ features.commandline.differences.php # php -v PHP 7.2.2 (cli) (built: Feb 16 2018 23:15:49) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Xdebug v2.6.0, Copyright (c) 2002-2018, by Derick Rethans
Docker Docker slika u sebi ima i PHP konzolno sučelje # docker run \ --rm \ -v "$(pwd)"/:/app/src/ \ oipa/backend:2.0 php -v PHP 7.2.2 (cli) (built: Feb 16 2018 23:15:49) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies with Xdebug v2.6.0, Copyright (c) 2002-2018, by Derick Rethans Lakši je način ući u ljusku kontejnera i od tamo pozivati PHP preko php naredbe # docker run \ --rm \ -it \ -v "$(pwd)"/:/app/src/ \ oipa/backend:2.0 bash root@6db4fbd88ef4:/app#
Pokretanje skripti Naredba php prima preko argumenta skriptu koju je potrebno izvršiti php main.php Svi argumenti nakon imena datoteke prosljeduju se u skriptu php main.php --a=b "c d" ef $argv - argumenti prosljedeni u skriptu Prvi je element putanja da same skripte $argc - broj elemenata u $argv var_dump($argc, $argv);
Pokretanje skripte - nastavak Ime datoteke ne mora završavati na.php Pomoću #! moguće skiptu napraviti izvršivom en.wikipedia.org/wiki/shebang (Unix) #!/usr/bin/env php <?php declare(strict_types=1); var_dump(1, 2.); chmod +x executable
Opcije naredbe php Opcije prije imena skripte mijenjaju ponašanje naredbe php php -l main.php - provjerava sintaksnu ispravnost datoteke no ne izvršava ju php -d xdebug.cli color=0 main.php - promjena konfiguracijske postavke xdebug.cli color Korisno za procesiranje podataka echo -e "2\n4\n13\n26" \ php \ -B '$sum = 0;' \ -R 'echo sqrt((float) $argn), "\n"; $sum += sqrt((float) $argn);' \ -E 'echo "Sum: ", $sum, "\n";' secure.php.net/manual/en/features.commandline.options.php
Ulaz/izlaz Tri konstante koje predstavljaju tokove podataka STDIN - standardni ulaz STDOUT - standardni izlaz STDERR - izlaz za greške Moguće pristupati i preko toka tipa php php://stdin - standardni ulaz php://stdout - standardni izlaz php://stderr - izlaz za greške Načine pristupa nije moguće kombinirati echo sha1( file_get_contents('php://stdin') ), "\n"; en.wikipedia.org/wiki/standard streams
Kontrola procesa Proširenje dostupno unutar konzolnog sučelja Ne postoji u kontekstu web-poslužitelja Omogućuje funkcionalnosti poput fork i obrade signala secure.php.net/manual/en/book.pcntl.php
fork Stvara novi proces dijete Prije izlaska iz procesa roditelja treba pričekati na djecu $var = [1, 2, 3]; switch (pcntl_fork()) { case -1: var_dump('error'); exit(1); case 0: $var[] = 4; var_dump($var); exit(0); default: pcntl_wait($status); } var_dump($var);
Obrada signala Postavljanje vlastite obrade signala pomoću funkcije pcntl signal Od verzije 7.1 (napokon) postoje asinkroni signali Omogućuju se pomoću funkcije pcntl async signals pcntl_async_signals(true); pcntl_signal(sigint, function (int $signal): void { var_dump('cistim'); exit(); }); for ($d = 0, $i = 0; $i < 10000000; $i++) { $d += $i; } var_dump($d); secure.php.net/manual/en/function.pcntl-signal.php
Primjer - ispis napretka Želimo ispisivati postotak obradenih elemenata Operacije su ispisa skupe operacija Možemo nekako namjestiti nakon koliko elemenata radimo ispis Varira izmedu različitih računala i kod neuniformnog vremena trajanja obrade elemenata $i = 1; $l = 100000000; while ($i <= $l) { printf("\r%6.2lf%%", ($i++ / $l) * 100); } echo "\n";
Alarmi Implementiranje asinkronih obrada u odredenim vremenskim intervalima Postavlja se obrada za signal SIGALRM Postavljanje alarma pomoću pcntl alarm Interval se zadaje u sekundama Vrijednost 0 čisti alarm u redu čekanja
Alarmi - primjer pcntl_async_signals(true); $i = 1; $l = 100000000; $callback = function () use (&$i, $l) { printf("\r%6.2lf%%", ($i / $l) * 100); pcntl_alarm(1); }; pcntl_signal(sigalrm, $callback); pcntl_alarm(1); $callback(); while ($i <= $l) { $i++; } pcntl_alarm(0); $callback(); echo "\n";
Naredba kill Linux naredba za slanje signala procesu kill -SIGALRM <pid> - slanje signal alarma procesu s ID-em <pid> pcntl_async_signals(true); $i = 1; $l = 100000000; $callback = function () use (&$i, $l) { printf("\r%6.2lf%%", ($i / $l) * 100); }; pcntl_signal(sigalrm, $callback); $callback(); echo 'PID: ', getmypid(), "\n"; while ($i <= $l) { $i++; } $callback(); echo "\n";
Interaktivna konzola Pokretanjem php -a Puno moćnija interaktivna konzola je PsySH psysh.org Predinstalirana za potrebe vještine Naredba psysh u kontekstu kontejnera
Ugradeni web-poslužitelj Namjenjen razvojnom i testnom okruženju Ograničenih mogućnosti Samo jedan proces obraduje zahtjeve Jednostavan način za upogoniti web-poslužitelj php -S 127.0.0.1:8899 - pokreće lokalni web-poslužitelj na portu 8899 Korjenski je direktorij direktorij iz kojeg je naredba pokrenuta php -S 127.0.0.1:8899 -t /app/src/14-cli/ws/ Postavljamo korjenski direktorij na /app/src/14-cli/ws/
Alat Composer Alat za upravljanje aplikacijama i bibliotekama za PHP Globalni i lokalni način rada Pozabaviti ćemo se samo lokalnim načinom rada Unutar datoteke composer.json dan je opis ovisnosti Obično se nalazi u korjenskom direktoriju projekta Naredba se composer poziva iz direktorija gdje se nalazi datoteka composer.json Datoteka composer.lock zaključava projekt na odredene verzije biblioteka Za biblioteke se ne stavlja u VCS sustav, dok se za aplikacije stavlja getcomposer.org/doc/
Alat Composer - nastavak Predinstaliran za potrebe vještine docker pull oipa/backend:3.0 Osnovne naredbe require - ubacuje biblioteku u projekt i sprema nove vrijednosti u composer.lock update - ažurira verzije biblioteka i sprema nove vrijednosti u composer.lock install - instalira biblioteke navedene u datoteci composer.lock ili, ako datoteka ne postoji, poziva update remove - uklanja biblioteku iz projekta i sprema nove vrijednosti u composer.lock Biblioteke se instaliraju u direktorij vendor Sadrži datoteku autoload.php Repozitorij paketa na packagist.org
Alat Composer - primjer korištenja composer require mossadal/math-parser require_once DIR.'/vendor/autoload.php'; $parser = new StdMathParser(); $differentiator = new Differentiator('x'); $evaluator = new Evaluator(); /* @var ExpressionNode $f */ $f = $parser->parse('exp(2*x)-x*y'); /* @var ExpressionNode $df */ $df = $f->accept($differentiator); $evaluator->setvariables(['x' => 1, 'y' => 2]); var_dump((string) $f, (string) $df); var_dump($df->accept($evaluator));