2

Escrevendo código PHP no terminal com o PHP CLI

#PHP
Josué Silva
Josué Silva

Quem já programou em Ruby, Python ou em Node.js, sabe das utilidades de poder escrever seus códigos diretamente no terminal. Isso é muito útil quando precisamos testar alguma coisa antes de passar para o nosso projeto de forma definitiva, ou quando precisamos debugar um código que não esta funcionando como deveria e as mensagens de erros que são exibidas não são muito úteis. A partir da versão 4.3.0 o PHP suporta um novo tipo de SAPI (Server Application Programming Interface) chamado CLI. Apesar disso já fazer um bom tempo, muitas pessoas ainda acham que só dá para programar em PHP levantando um servidor web e visualizando o resultado em um navegador. Não pretendo esgotar este assunto neste artigo porque ele é muito extenso, então vou exemplificar os comandos mais usadas e que, com certeza, vão ser muito úteis quando você estiver codificando, debugando ou simplesmente testando alguma coisa.


Se quiser ver uma lista de opções de linha de comando fornecidas pelo PHP CLI é só digitar o comando php --help, php -help , php -h ou php -?no terminal e você terá uma saída como esta:


Usage: php [options] [-f]  [--] [args...]
   php [options] -r  [--] [args...]
   php [options] [-B ] -R  [-E ] [--] [args...]
   php [options] [-B ] -F  [-E ] [--] [args...]
   php [options] -S : [-t docroot] [router]
   php [options] -- [args...]
   php [options] -a

   -a               Run interactively
   -c | Look for php.ini file in this directory
   -n               No configuration (ini) files will be used
   -d foo[=bar]     Define INI entry foo with value 'bar'
   -e               Generate extended information for debbuger/profiler
   -f         Parse and execute .
   -h               This help
   -i               PHP information
   -l               Syntax check only (lint)
   -m               Show compiled in modules
   -r         Run PHP without using script tags    -B   Run PHP  before processing input lines
   -R         Run PHP  for every input line
   -F         Parse and execute  for every input line
   -E     Run PHP  after processing all input lines
   -H               Hide any passed arguments from external tools.
   -S : Run with built-in web server.
   -t      Specify document root  for built-in web server.
   -s               Output HTML syntax highlighted source.
   -v               Version number
   -w               Output source with stripped comments and whitespace.
   -z         Load Zend extension .

   args...          Arguments passed to script. Use -- args when first argument
                    starts with - or script is read form stdin

   --ini            Show configuration file names

   --rf       Show information about function .
   --rc       Show information about class .
   --re       Show information about extension .
   --rz       Show information about Zend extension .
   --ri       Show configuration for extension 


Exibindo a versão do PHP e demais informações


Se você já instalou um servidor web apache antes, seja da forma mais trabalhosa ou simplesmente instalando um daqueles pacotes com PHP, Apache e MySQL (Wamp, Lamp, Xampp, Vertrigo ou EasyPHP), provavelmente você também deve ter criado um script de uma única linha chamando a função phpinfo() só para saber se o PHP foi instalado corretamente. Essa é uma das formas de ver a versão do PHP instalada em sua máquina, a outra é através do comando php --version ou php -v (forma abreviada). Veja o exemplo:


$ php -v
PHP 7.1.24-1+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Nov 12 2018 09:23:22) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.1.24-1+ubuntu16.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies


Esse comando é muito útil quando precisamos trabalhar com algum framework que depende de uma versão específica do PHP para funcionar corretamente ou quando precisamos trabalhar em uma máquina ao qual não sabemos exatamente qual a versão do PHP ou se ele está realmente instalado. Agora se você acha que o phpinfo() ainda é mais completo pois exibe várias informações e não somente a versão do PHP, então digite o comando php -i e veja o que você obterá como resultado. São exatamente as mesmas informações que veria se rodasse o script com a famosa função phpinfo(), a diferença é que não seria necessário levantar um servidor e abrir o navegador para visualizar o resultado.


Executando scripts direto pelo terminal


Digamos que você tenha que executar um programa escrito em PHP e não quer ter todo aquele trabalho de abrir o navegador, iniciar o servidor (caso ele não esteja configurado para iniciar com o sistema), ficar clicando F5 toda vez que algo for alterado, etc. Se for um programa simples não precisa ter toda essa complexidade para executá-lo. Suponhamos que você tenha o seguinte script salvo em seu computador:


<?php
    echo "Hello World!\n";
?>


Vamos supor também que você tenha salvo o arquivo com o nome de meu_script.php. Para executar este script direto pelo terminal digite php meu_script.php.


$ php meu_script.php
Hello World!


Se você já programou em Python ou com Node antes, acredito que deve ter achado isso muito parecido com a forma como executamos programas em Python e no Node no terminal.


Passando argumentos ($argc e $argv)


Vamos deixar as coisas mais interessantes, vamos melhorar o exemplo anterior passando argumentos para o programa que será executado pelo PHP. Vamos sair do manjado “Hello World” e vamos fazer seu script lhe dar um Bom dia e dizer seu nome completo, independente de quem você seja. Claro que para isso você precisará informar seu nome ao programa. Será algo parecido com o que fazemos quando passamos parâmetros para o navegador usando o método GET. Quando usamos o navegador para executar um script PHP e precisamos passar parâmetros a ele incluimos uma query ao final da URL, como por exemplo:


http://www.site.com/?parametro1=valor1&parametro2=valor2&parametroN= valorN


No PHP CLI podemos fazer algo parecido passando argumentos logo após o nome do script.


$ php meu_script.php argumento1 argumento2 argumentoN


Para que nosso programa possa receber esses parâmetros, usamos os arrays globais $argv, que armazena os valores dos argumentos e $argc que contém a quantidade de argumentos passados. O primeiro elemento de $argv ($argv[0]) é sempre o nome do script, ou seja, $argc sempre será a quantidade de argumentos + 1. Para ficar mais claro vejamos como poderiamos melhorar o meu_script.php.


<?php
    if ( $argc < 3 )
    {
        echo "Você deve digitar: php meu_script.php [nome][sobrenome]\n";
        exit();
    }
 
    $nome = $argv[1];
    $sobrenome = $argv[2];
 
    echo "Bom dia $nome $sobrenome/n";
?>


Como podemos ver no código acima, nosso programa recebe dois parâmetros: $argv[1] e $argv[2]. Aí você me pergunta: e o $argv[0]? O $argv[0] é próprio nome do programa que neste caso é meu_script.php. Então ao executar este programa no terminal você deve digitá-lo assim:


 $ php meu_script.php John Doe


E ele retornará:


Bom dia John Doe


Observe que antes de guardar o valor dos argumentos nas variáveis $nome e $sobrenome existe um teste para verificar se existem menos de 3 argumentos (linha 2) e se houver, o programa exibe uma mensagem informando que deve ser escrito o nome e o sobrenome da pessoa (linha 4) e em seguida o programa é encerrado (linha 5). Se não houvesse esse tratamento antes, o programa geraria um erro caso não fosse informado os parâmetros de forma correta.


Executando o código diretamente através da linha de comando


Se você acha que escrever um pequeno script em um arquivo de texto e depois chamá-lo no terminal é tão custoso quanto abri-lo em um navegador, saiba que existe outra forma de executar pequenos trechos de código em PHP no terminal simplesmente passando o parâmetro -r e o código entre aspas simples ou duplas e sem as tags <?php ?>. Vamos usar como exemplo um pequeno programa em PHP que nos exibe a data atual no formato dia / mês / ano.


$ php -r 'echo date("d/m/Y")."\n";'


Aqui vai mais um exemplo muito legal e útil. O código a seguir pega o horário do sistema no exato momento em que é executado e envia para um arquivo de texto chamado data.txt. Se o arquivo de texto não existe ele é criado. O “\n” no final da linha de código representa o comando ENTER (também conhecido como RETURN ou NEW LINE) e ele faz com que cada nova data vá para a linha seguinte do arquivo de texto


$ php -r 'echo date("H:i:s")."\n";' >> data.txt


Se você procurar no diretório atual verá um arquivo de texto chamado data.txt e ao abri-lo verá a hora em que ele foi executado. Repita este comando várias vezes e veja que ele irá gerar horários diferentes.


Rodando o PHP de forma interativa


Quando eu tive meus primeiros contatos com a linguagem Ruby (antes de partir para o Rails logo em seguida) uma das coisas que achei muito legal foi o IRB, o interpretador interativo do Ruby. Mas o PHP também pode ser executado de forma interativa simplesmente executando o comando php -a. Vejamos um exemplo, vamos fazer um contador de 1 a 10 com um laço for no PHP:


$ php -a
Interactive mode enabled

php > for ($i = 0; $i < 10; i++)
php >     echo ($i+1)."\n";
1
2
3
4
5
6
7
8
9
10


Veja que após entrar com o comando php -a é exibida a mensagem Interactive mode enablede em seguida o prompt muda para php >. Para sair do modo Interativo é só digitar quit e dar ENTER.


Servidor Web Embutido


Lembro de quando comecei a aprender a programar em PHP e quando eu lia algo sobre introdução ao PHP geralmente começava com: “tudo o que você precisa é instalar a linguagem de programação, instalar e configurar um servidor web e levantar o servidor”, caso contrário, estranhamente não funcionará. Falando assim até parece galho fraco, até que você começa a ter seus primeiros ataques de raiva e sente vontade de socar seu computador porque alguma coisa no meio da configuração de seu ambiente não esta funcionando como deveria. Se eu soubesse que eu poderia simplesmente usar o servidor embutido do PHP para dar meu primeiro Hello World eu teria economizado vários neurônios guerreiros.


Vamos a um exemplo rápido, crie uma pasta em um local qualquer no seu computador, no meu caso eu criei uma pasta chamada projetos e dentro dela criei uma pasta chamada php. Entre na sua pasta e crie um arquivo index.php com o conteúdo a seguir:


<html>
    <head>
        <title>Embeded Web Server</title>
    </head>
    <body>
        <h1>Servidor Web Embutido do PHP</h1>
        <p>
             A partir da versão 5.4.0 do PHP,
             o CLI SAPI fornece um servidor web embutido
        </p>
    </body>
</html>


Estando dentro da pasta onde você salvou o arquivo index.php execute o comando a seguir:


$ php -S localhost:8000


O terminal deverá exibir algo parecido com isso:


PHP 7.1.24-1+ubuntu16.04.1+deb.sury.org+1 Development Server Started at Mon Dec 10 11:04:39 2018
Listening on http://localhost:8000
Document root is /home/username/projetos/php
Press Ctrl-C to quit.


Agora abra seu navegador e acesse o endereço localhost:8000. Deverá aparecer a página criada anteriormente no navegador.


Nem foi necessário instalar servidor nenhum, isso não é ótimo?! Claro que para um ambiente de produção é necessário que você instale um servidor web dedicado, seja um Apache ou um Nginx, porque, apesar do servidor embutido do PHP CLI ser muito prático, ele não oferece todos os recursos que os outros servidores oferecem, então ele só é recomendado para ambiente de desenvolvimento ou testes.


Como dito anteriormente não pretendo esgotar este assunto, meu objetivo foi apenas mostrar a utilidade e as possibilidades de se trabalhar com PHP no terminal. Os exemplos apresentados foram realizados em um computador com sistema GNU/Linux Ubuntu versão 16.04, mas se você quiser utilizar este recurso no Windows ou no MacOS também é possível.


Espero poder ter ajudado. Um forte abraço e até a próxima!

2
17

Comentários (2)

0
Belisnalva Jesus

Belisnalva Jesus

02/02/2021 00:10

Boa noite Josué!


Gostei de sua sugestão.

Parabéns!


Att,


Belisnalva

1
J

Julian Gamboa

24/12/2020 12:13

O Servidor Web Embutido foi uma grande solução desde o ano 2010


None

Brasil