Slide 1

Slide 1 text

PHP na Tela Escura Aplicações Poderosas em Linha de Comando Prof. Rafael Jaques @rafajaques 15º Fórum Internacional de Software Livre #FISL15 09/05/2014

Slide 2

Slide 2 text

"O que é nascido de Deus vence o mundo; e esta é a vitória que vence o mundo: a nossa fé."
 1 João 5:4

Slide 3

Slide 3 text

www.php-rs.org

Slide 4

Slide 4 text

Trouxe seu computador?

Slide 5

Slide 5 text

Experimente junto!

Slide 6

Slide 6 text

Se você usa Windows, por gentileza, desligue seu computador agora.

Slide 7

Slide 7 text

Os arquivos de exemplo podem ser baixados em:! ! www.phpit.com.br/palestras/ telaescura/exemplos.tar.gz

Slide 8

Slide 8 text

Por que usar CLI? Processamento de dados! Processos de longa duração! Instaladores de aplicações! Ferramentas / Utilidades

Slide 9

Slide 9 text

Tem como fazer CLI com outras ferramentas? Óbvio que sim!! Existem linguagens extremamente poderosas como Perl e Python que podem muitas vezes ter um desempenho melhor. Tudo é questão de saber balancear.

Slide 10

Slide 10 text

Por que então com PHP? Facilidade de uso! Reutilização de código! Familiaridade! Utilização de componentes pré- existentes

Slide 11

Slide 11 text

Exemplos de ferramentas Composer! PHPUnit! phpDocumentor! Phing! Zend Framework! Joomla! PHPlot! rephlux

Slide 12

Slide 12 text

Introdução ao PHP-CLI

Slide 13

Slide 13 text

Experimental no PHP 4.2.0! Como SAPI no PHP >= 4.3.0

Slide 14

Slide 14 text

Hello world

Slide 15

Slide 15 text

$ php helloworld.php! Hello World!

Slide 16

Slide 16 text

CODE TIME!! ! exemplo1.php

Slide 17

Slide 17 text

She

Slide 18

Slide 18 text

$ chmod +x helloworld.php! $ ./helloworld.php! Hello World! #!/usr/bin/php

Slide 19

Slide 19 text

O local do PHP pode variar dependendo do sistema $ which php! /usr/bin/php

Slide 20

Slide 20 text

Imprimindo na tela

Slide 21

Slide 21 text

print e echo funcionam, mas
 não são a melhor abordagem

Slide 22

Slide 22 text

Utilize streams

Slide 23

Slide 23 text

php://stdin (leitura) STDIN! php://stdout (escrita) STDOUT! php://stderr (escrita) STDERR Streams do PHP

Slide 24

Slide 24 text

CODE TIME!! ! exemplo2.php

Slide 25

Slide 25 text

E a quebra de linha? Não é HTML!
não serve! \n? \r? \r\n?! Nada disso! Use PHP_EOL.

Slide 26

Slide 26 text

Entrada do usuário

Slide 27

Slide 27 text

Ler a entrada fgets()! fread()! fscanf()! fgetc()

Slide 28

Slide 28 text

CODE TIME!! ! exemplo3.php

Slide 29

Slide 29 text

Obtendo dados do sistema

Slide 30

Slide 30 text

$_SERVER $_POST $_GET

Slide 31

Slide 31 text

Array! (! [SHELL] => /bin/bash! [TERM] => xterm-256color! [SVN_EDITOR] => vim! [USER] => rafajaques! [LANG] => pt_BR.UTF-8! [HOME] => /Users/rafajaques! [_] => /usr/bin/php! [PHP_SELF] => exemplo.php! [SCRIPT_NAME] => exemplo.php! [DOCUMENT_ROOT] => ! [argv] => Array! (! [0] => exemplo.php! )! [argc] => 1! )! $_SERVER

Slide 32

Slide 32 text

$argc Contagem de argumentos $argv Valores dos argumentos

Slide 33

Slide 33 text

$argc = 6! $argv = Array! (! [0] => ./exemplo.php! [1] => -a! [2] => -u! [3] => usuario! [4] => -p! [5] => --teste! ) ./exemplo.php -a -u usuario -p --teste

Slide 34

Slide 34 text

getopt() Capturando parâmetros com

Slide 35

Slide 35 text

CODE TIME!! ! exemplo4.php

Slide 36

Slide 36 text

readline Melhorando a experiência com

Slide 37

Slide 37 text

Quê que faz isso? Entrada interativa! Autocompletar! Histórico de comandos! E mais uma paulada de coisa…

Slide 38

Slide 38 text

CODE TIME!! ! exemplo5.php

Slide 39

Slide 39 text

Chamadas para o sistema

Slide 40

Slide 40 text

shell_exec( ) ou `chamada` Resultado em uma string exec( ) Retorna só a última linha passthru( ) Envia o resultado para a saída padrão

Slide 41

Slide 41 text

CODE TIME!! ! exemplo6.php

Slide 42

Slide 42 text

Obtendo informações! do Terminal

Slide 43

Slide 43 text

Utilize comandos do sistema tput é uma ferramenta importante! tput lines - altura do terminal! tput cols - largura do terminal! man tput

Slide 44

Slide 44 text

Descobrir se o stream está sendo redirecionado $piped = !posix_isatty(STDOUT);

Slide 45

Slide 45 text

CODE TIME!! ! exemplo7.php

Slide 46

Slide 46 text

Controlando o! terminal

Slide 47

Slide 47 text

Control Codes A maioria dos control codes possui o prefixo ! Posicionar o cursor! Aplicar cores! Apagar! Fazer barulho! Mover a rolagem! Muitas outras coisas http://www.termsys.demon.co.uk/vtansi.htm

Slide 48

Slide 48 text

! em hexadecimal é! \033

Slide 49

Slide 49 text

Control Codes Posicionamento do cursor Pra cima \033[{CONTAGEM}A Pra baixo \033[{CONTAGEM}B Avançar \033[{CONTAGEM}C Retroceder \033[{CONTAGEM}D Forçar posição \033[{LINHA};{COL}f Salvar posição \0337 Restaurar posição \0338

Slide 50

Slide 50 text

Control Codes Apagando Apagar tela \033[2J Apagar linha atual \033[2K Apagar a linha de cima \033[1J Apagar a linha de baixo \033[J Para o início da linha \033[1K Para o final da linha \033[K

Slide 51

Slide 51 text

Control Codes Estilo de letra Reset All 0 Brilho (Negrito) 1 Dim 2 Sublinhado 3 Piscante 4 Invertido 5 Escondido 6 \033[{atributos separados por ;}m

Slide 52

Slide 52 text

Control Codes Cores Cor Letra Fundo Preto 30 40 Vermelho 31 41 Verde 32 42 Amarelo 33 43 Azul 34 44 Magenta 35 45 Ciano 36 46 Branco 37 47 \033[{atributos separados por ;}m

Slide 53

Slide 53 text

\033[0m Não se esqueça de restaurar a formatação original do terminal!

Slide 54

Slide 54 text

\007 Aproveite para tocar o sino quando necessário! :)

Slide 55

Slide 55 text

Bifurcando processos

Slide 56

Slide 56 text

Extensão PCNTL Não vem por padrão Precisa de --enable-pcntl

Slide 57

Slide 57 text

Principais funções PCNTL pcntl_exec( )! pcntl_fork( )! pcntl_waitpid( )! pcntl_signal( )

Slide 58

Slide 58 text

CODE TIME!! ! exemplo8.php

Slide 59

Slide 59 text

Daemons

Slide 60

Slide 60 text

Cronjobs

Slide 61

Slide 61 text

# * * * * * comando! # ! ! ! ! !! # " " " " "! # " " " " "! # " " " " #$$$$$ dia da semana (0 - 6) (0=domingo)! # " " " #$$$$$$$$$$ mês (1 - 12)! # " " #$$$$$$$$$$$$$$$ dia do mês (1 - 31)! # " #$$$$$$$$$$$$$$$$$$$$ hora (0 - 23)! # #$$$$$$$$$$$$$$$$$$$$$$$$$ minuto (0 - 59) crontab -e

Slide 62

Slide 62 text

Meu artigo sobre processos de longa duração http://www.phpit.com.br/artigos/ trabalhando-processos-longa- duracao-php.phpit! ou! http://is.gd/processos_longos_php

Slide 63

Slide 63 text

Mais exemplos

Slide 64

Slide 64 text

CODE TIME!! ! Exemplos! de 9 a 13

Slide 65

Slide 65 text

E agora? Onde mais eu estudo?

Slide 66

Slide 66 text

Ferramentas/Frameworks de PHP-CLI • http://etopian.com/software/php-cli-framework/ • http://silly.brainchildprojects.org/ • https://github.com/jlogsdon/php-cli-tools • Pear Console • NCurses

Slide 67

Slide 67 text

Referências • http://www.php.net/manual/pt_BR/features.commandline.php • http://www.sitepoint.com/php-command-line-1/ • http://www.php-cli.com/ • http://www.openlogic.com/wazi/bid/188037/Building-Command- Line-Applications-with-PHP • http://silly.brainchildprojects.org/ • http://www.slideshare.net/donatJ1/beautiful-phpcli-scripts • http://oliversmith.io/technology/2011/10/07/speeding-up-php-using- process-forking-for-image-resizing/

Slide 68

Slide 68 text

Obrigado! Rafael Jaques! phpit.com.br! [email protected]! @rafajaques - @_phpit! slideshare.net/rafajaques

Slide 69

Slide 69 text

Dúvidas?

Slide 70

Slide 70 text

Imagens • http://s42.photobucket.com/user/MikeL1/media/IMG_1495-1.jpg.html • http://www.berkanaonline.com/wp-content/uploads/2014/02/punching-computer-1600x900.jpg • http://dgst101.umwblogs.org/files/2013/08/hello-toast.jpg • https://www.flickr.com/photos/ajmexico/3281139507/ • https://www.flickr.com/photos/maltman23/8073321442 • https://www.flickr.com/photos/shabdaly/3981496754 • http://1.bp.blogspot.com/_LEPZ-o9VCPk/S785W0cEZBI/AAAAAAAARbo/-LYixcV_d34/s1600/ET+computer+kid+happy +surprised.jpg • http://www.endlessimpact.com/wp-content/uploads/2010/08/computer-woman.jpg • http://www.mirror-image.com/wp-content/uploads/BroadcastRadioIcon2.jpg • https://www.flickr.com/photos/small_realm/11189801623 • http://kenvibez.com/wp-content/uploads/2014/02/Allan-Gichigi%E2%80%99s-image-titled-%E2%80%9CCapture-Kenya %E2%80%9D-was-taken-at-Lake-Victoria-and-perfectly-captures-a-fisherman-casting-his-net.jpg • http://images.skeedz.com/wallpaper/1418.jpg • http://3.bp.blogspot.com/_VbI3E80F3iA/RulcxI87xFI/AAAAAAAAABs/s6-8lIAbh3o/s1600-h/IMG_2340.JPG • http://firstworldfacts.com/wp-content/uploads/2013/09/Calling-for-Her-at-Many-Times-in-a-Day.jpg • http://upload.wikimedia.org/wikipedia/commons/e/e1/Atari_XE_joystick.jpg • http://leighloueygung.com/wp-content/uploads/2013/11/fork_in_the_road.jpg • http://www.muehle-glashuette.de/uploads/tx_ivwatch/M1-25-43-CZ_1024x768_01.png