Português Português English English

how to: fazer hello world em PHP-CLI

Estudando um pouco de PHP - pra variar - acabei conhecendo mais a fundo uma biblioteca muito legal do Zend Framework (ZF), é o Zend_Console_Getopt. Neste post vou fazer um passo-a-passo para quem quiser saber como fazer um script com interface via linha de comando (CLI) utilizando essa biblioteca.

Pra entender esse post você precisa saber programar (em qualquer linguagem que use o paradigma imperativo) e o que é CLI. Quem é da computação, com os links indicados, consegue prosseguir em poucos minutos de leitura.

Primeiro precisamos saber o que essa biblioteca faz e no que ela irá nos ajudar. Zend_Console_Getopt é uma classe que auxilia aplicações com interface linha de comando a fazerem o parser dos parâmetros. Imagino eu que essa atividade é a mais difícil pra quem está iniciando no mundo CLI. Logo essa biblioteca vai tornar as coisas mais fáceis.

Precisamos também definir o que nossa aplicação vai fazer. Eu sugiro que ele imprima um “hello world”, e como não tem ninguém pra contrariar é isso que ele vai fazer e pronto! :-) .

Mas (…) ele não exibirá um simples “alô”. Nosso programa devera mostrar um alô em três línguas: português, espanhol e inglês. Isso deverá ser determinado pelo usuário com o parâmetro language, exemplo de uso: “–language=pt” ou “-l es”.

Outra opção que nossa aplicação vai ter é o famoso “verbose”. Passando esse parâmetro (”-v” ou “–verbose”) o nosso programa vai imprimir o que está acontecendo.

Vamos ao trabalho!

  • instale um linux qualquer em sua máquina com php5-cgi (é CGI e não módulo do apache!);
  • crie um diretório da aplicação chamado “sample” em qualquer lugar que você tenha permissão de escrita;
  • crie um arquivo dento do diretório criado acima chamado “hello_world”;
  • dê permissão de execução para o arquivo criado no passo anterior, use “chmod 753 hello_cli” ;-) ;
  • baixe o ZendFramework e copie o diretório “library” (somente esse diretório!) no mesmo lugar que você colocou o arquivo “hello_cli” (deve ficar assim: sample/libray/Zend/*);
  • edite o arquivo “hello_cli” com o código que será apresentado.

O código do arquivo “hello_cli” está “jogado” logo abaixo, porém irei detalhá-lo depois.

Nota: na primeira linha é necessário indicar que o php é quem irá interpretar nosso código. O caminho do interpretador PHP no meu computador é “/usr/bin/php5-cgi”, caso em seu sistema operacional seja diferente altere essa linha (use o comando locate no terminal caso não lembre aonde está).

#!/usr/bin/php5-cgi -q
<?php

############### CONFIGURATION

# Error
# programmers wrong never! rigth?
ini_set"error_reporting"E_ALL );
ini_set"display_errors");
ini_set"display_startup_errors");
ini_set"html_errors");

# Constants
define"DIR_ROOT"realpathdirname__FILE__ ) ) . "/" );
define"DIR_LIBRARY"DIR_ROOT "library/" );

# alter include_path
ini_set"include_path"ini_get"include_path" ) . PATH_SEPARATOR DIR_LIBRARY );

# Zend Framework
# configures autoload to call zend class loader
require "Zend/Loader.php";
spl_autoload_register( array( "Zend_Loader""autoload" ) );

# Functions
function output$sText )
{
    echo 
$sText "\n";
}

############### ARGUMENTS

# configure arguments and options
# see http://framework.zend.com/manual/en/zend.console.getopt.rules.html
$_rules = array(
    
"verbose|v" => "",
    
"language|l=s" => ""
);
$_argument = new Zend_Console_Getopt$_rules );

# fetchs arguments
try
{
    
$verbose = isset( $_argument->verbose );
    
$language $_argument->language;
}
catch ( 
Zend_Console_Getopt_Exception $_exception )
{
    
output$_exception->getUsageMessage() );
    exit();
}

############### APPLICATION

# finally, the application!
# let's go!
if ( $verbose )
{
    
output"starting..." );
}
switch ( 
strtolower$language ) )
{
    case 
"pt":
        
output"Alô mundo CLI!" );
        break;
    case 
"es":
        
output"¡Hola mundo CLI!" );
        break;
    case 
"en":
    default:
        
output"Hello CLI world!" );
        break;
}
if ( 
$verbose )
{
    
output"ending, bye..." );
}

Perceba que nosso código possui, na ordem, três partes: configuração; tratamento da entrada; regra de negócio. Inicialmente configuramos a exibição de erro, o ZendFramework e criamos uma funçãozinha de output. A configuração do ZF exige algumas tarefas específicas que não vou abordar aqui, mas fica pra outro post, ok?

A segunda parte é a mais importante, nela determinamos quais os parâmetros possíveis para nossa aplicação, capturamos os dados e tratamos os erros de entrada. A variável “$_rules” possui os parâmetros que a classe da Zend deverá tratar, não vou aqui detalhar como funciona, mas olhando já da pra se ter uma idéia, mas quem quiser saber mais acesse o link de configuração de parâmetros. No bloco “try” pegamos os parâmetros que foram passados à nossa aplicação, veja que basta acessar os parâmetros como se fossem atributos da classe Zend_Console_Getopt. Ao mesmo tempo que pegamos as entradas o tratamento de erro é feito com a captura de possíveis exceções que são soltas pela biblioteca Zend.

A última parte é tranquila, com tudo feito e os parâmetros carregados nos resta aplicar as regras que definimos anteriormente e acenar para o novo mundo que nos abre. Veja alguns exemplos de uso da nossa apliação.

renan@renan:~/sample$ ./hello_cli -l pt
Alô mundo CLI!
renan@renan:~/sample$ ./hello_cli --language=es
¡Hola mundo CLI!
renan@renan:~/sample$ ./hello_cli
Hello CLI world!
renan@renan:~/sample$ ./hello_cli -vl en
starting...
Hello CLI world!
ending, bye
renan@renan:~/sample$ ./hello_cli -vl pt
starting...
Alô mundo CLI!
ending, bye

Abaixo o download do resultado final pra quem estiver com preguiça de seguir os passos indicados ou teve problemas na criação da aplicação.

Hello CLI World!

Posted in Development, PHP

1 Comment so far

Subscribe to Comments RSS or TrackBack 'how to: fazer hello world em PHP-CLI'.

  1. Aug 25, 2008 at 8:34 pm

    thymo says,

    velho, estou dando uma estudada também no manual, estou querendo criar um gerador de código, parecido com o rails e com o symfony, pensei até em criar uma aplicação deskop, um mini dreamweaver! mas to vendo que com essa classe ai do zend fw vou poder começar a brincar rapidinho, ótimo tuto! um abraço.

Leave a Comment

Please be polite and on topic. Your e-mail will never be published.

BrasilMato GrossoRondôniaDistrito Federal