Desde a versão 4.3, o PHP suporta um novo tipo SAPI (Server Application Programming Interface) chamado CLI que significa Command Line Interface. Como o próprio nome diz, essa SAPI tem foco no desenvolvimento de aplicações shell (ou no terminal/linha de comando) com o PHP. As diferenças entre a CLI SAPI e as outras SAPIs são detalhadas neste capítulo.
A CLI SAPI foi liberada primeiramente com o PHP 4.2.0, mas ainda em estágio experimental, sendo necessário ativá-la explicitamente com a opção --enable-cli durante o ./configure. Desde o PHP 4.0.3 a CLI SAPI não mais é experimental e é sempre compilada e instalada como o arquivo php (chamado php.exe no Windows), no formato binário executável.
Diferenças importantes das CLI SAPI comparada com outras SAPIs:
Diferentemente da CGI SAPI, nenhum header é impresso na saída.
A CGI SAPI possui um meio de suprimir os headers HTTP, mas não há uma chave equivalente para ativá-los na CLI SAPI.
Estas são as diretivas do php.ini que são sobrescritas pela CLI SAPI porque não fazem sentido no ambiente shell:
Tabela 24-1. Diretivas php.ini sobrescritas
Diretiva | Valor default CLI SAPI | Comentários |
---|---|---|
html_errors | FALSE | Pode ser bem difícil de ler mensagens de erro no seu shell quando elas estão embebidas dentro de tags HTML, por isso essa diretiva tem default para FALSE. |
implicit_flush | TRUE | Essa diretiva causa que qualquer saída gerada de um print(), echo() e semelhantes sejam imediatamente escritas para o output e não cacheadas em nenhum buffer. Você ainda pode usar o output buffering se você precisa atrasar ou manipular a saída padrão. |
max_execution_time | 0 (unlimited) | Devido as infinitas possibilidades da utilização do PHP em ambientes shell, tempo máximo de execução foi configurado para ilimitado. Enquanto aplicações escritas para web são geralmente executadas em poucos segundos, aplicações no shell tendem a ter um tempo de execução mais longo. |
register_argc_argv | TRUE | As variáveis globais do PHP $argc (número de argumentos passados para aplicação) e $argv (array com os argumentos atuais) são sempre presentes e preenchidos com os valores apropriados quando utilizando a CLI SAPI. |
Nota: Estas diretivas não podem ser inicializadas com outros valores do arquivo de configuração php.ini ou um arquivo personalizado (se informado). Esta limitação existe porque estes valores são aplicados depois que todos os arquivos de configuração são analisados. Entretanto, seus valores podem ser modificados durante a execução (o que pode não fazer sentido para todas elas, por exemplo, register_argc_argv).
Para facilicar a operação no ambiente shell, as seguintes constantes estão definidas:
Tabela 24-2. Constantes específicas CLI
Constante | Descrição | |
---|---|---|
STDIN |
Um stream já aberto para o stdin. Isto economiza
ter de abrí-lo com
| |
STDOUT |
Um stream já aberto para o stdout. Isto economiza
ter de abrí-lo com
| |
STDERR |
Um stream já aberto para o stderr. Isto economiza
ter de abrí-lo com
|
Considerando isso, você não precisará mais abrí-los, por exemplo o stderr você mesmo, mas simplesmente usar a constante em vez do recurso stream:
php -r 'fwrite(STDERR, "stderr\n");' |
A CLI SAPI não modifica o diretório de execução atual para o diretório onde o script é interpretado!
Exemplo mostrando a diferença da CGI SAPI:
<?php /* Nossa aplicação de teste */ echo getcwd(), "\n"; ?> |
Quando utilizando a versão CGI, a saída é
$ pwd /tmp $ php-cgi -f outro_diretorio/test.php /tmp/outro_diretorio |
Utilizando a versão CLI SAPI:
$ pwd /tmp $ php -f outro_diretorio/test.php /tmp |
Nota: A CGI SAPI suporta o comportamento da CLI SAPI utilizando a chave -C quando de sua execução na linha de comando.
A lista de opções de linha de comando fornecidas pelo binário do PHP pode ser solicitada a qualquer tempo executando o PHP com a opção -h:
Usage: php [options] [-f] <file> [args...] php [options] -r <code> [args...] php [options] [-- args...] -s Display colour syntax highlighted source. -w Display source with stripped comments and whitespace. -f <file> Parse <file>. -v Version number -c <path>|<file> Look for php.ini file in this directory -a Run interactively -d foo[=bar] Define INI entry foo with value 'bar' -e Generate extended information for debugger/profiler -z <file> Load Zend extension <file>. -l Syntax check only (lint) -m Show compiled in modules -i PHP information -r <code> Run PHP <code> without using script tags <?..?> -h This help args... Arguments passed to script. Use -- args when first argument starts with - or script is read from stdin |
A CLI SAPI fornecer três maneiras diferentes para você executar seu código PHP:
Chamando o PHP para executar um arquivo determinado.
php my_script.php php -f my_script.php |
Passar o código PHP para execução diretamente a linha de comando.
php -r 'print_r(get_defined_constants());' |
Nota: Leia o exemplo cuidadosamente, observando que não há tags de abertura ou fechamento! A opção -r simplesmente não precisa delas. Utilizando-as você obterá erros de interpretação.
Fornece código PHP para interpretação via a entrada padrão (stdin).
Isto mostra a habilidade poderosa de como criar dinamicamente código PHP e fornecê-lo ao binário, como demonstrado neste exemplo (apenas demonstrativo):
$ alguma_aplicacao | algum_filtro | php | sort -u >final_output.txt |
Assim como qualquer aplicação shell, não somente o binário do PHP aceita um certo número de argumentos, mas também seu script PHP também pode recebê-los. O número de argumentos que podem ser passados para seu script não é limitado ao PHP (mas o shell tem um certo limite de tamanho em caracteres que podem ser informados, e não há um padrão para esse limite). Os argumentos passados para seu script são disponibilizados no array global $argv. No índice zero sempre conterá o nome do script (podendo ser - no caso de código PHP estar vindo da entrada padrão ou da opção de linha de comando -r). O segunda variável global $argc contém o número de elementos no array $argv (mas não o número de argumentos passados para seu script.
Os argumentos que você deseja passar para seu script não podem começar com o caracter - e isso não pode ser modificado. Passando argumentos para seu script que comecem com um - causará problemas porque o PHP tentará manuseá-los. Para prevenir isso, utilize o separador de argumentos --. Depois que os argumentos são interpretados pelo PHP, todos os argumentos restantes são repassados intocados para seu script.
# Isto não executará o código fornecido e irá fazer o PHP mostrar sua ajuda $ php -r 'var_dump($argv);' -h Usage: php [options] [-f] <file> [args...] [...] # Isto passará o argumento '-h' para seu script e prevenirá o PHP de usá-lo $ php -r 'var_dump($argv);' -- -h array(2) { [0]=> string(1) "-" [1]=> string(2) "-h" } |
Entretanto, há ainda uma outra maneira de se utilizar o PHP no shell. Você pode escrever um script que na primeira linha tenha #!/usr/bin/php e na seqüência tenha código PHP normal, incluindo as tags de início e fim e os atributos de execução do arquivo. Desta maneira ele pode ser executado como um script shell ou PERL normalmente:
#!/usr/bin/php <?php var_dump($argv); ?> |
$ chmod 755 teste $ ./test -h -- foo array(4) { [0]=> string(6) "./teste" [1]=> string(2) "-h" [2]=> string(2) "--" [3]=> string(3) "foo" } |
Tabela 24-3. Opções de linha de comando
Opção | Descrição | |||
---|---|---|---|---|
-s |
Mostra o código fonte com destaque de cores. Esta opção usa o mecanismo interno para interpretar o arquivo e produzir uma versão HTML do fonte com destaque de cores e a envia para a saída padrão. Note que ele somente gerará blocos de <code> [...] </code>, mas não headers HTML.
| |||
-w |
Mostra o fonte sem comentários e espaços em branco.
| |||
-f |
Interpreta e executa o arquivo informado com a opção -f Esta diretiva é opcional e pode ser deixada de lado. Informar somente o nome do arquivo para execução é suficiente. | |||
-v |
Imprime as versões o PHP, PHP SAPI e Zend para a saída padrão, por exemplo:
| |||
-c |
Esta opção informa um diretório onde procurar pelo php.ini ou especifica um arquivo INI personalizado diretamente (não presisa ser obrigatoriamente php.ini), por exemplo:
| |||
-a |
Executa o PHP no modo interativo. | |||
-d |
Esta opção permite definir um valor personalizado para qualquer diretiva de configuração permitida no php.ini. Sintaxe:
Examples:
| |||
-e |
Gera informações estendidas para o debugador/profiler. | |||
-z |
Carrega a extensão Zend. Se somente o nome de arquivo é fornecido, o PHP tenta carregar essa extensão do caminho default de bibliotecas do seu sistema (geralmente especificado em /etc/ld.so.conf em sistemas Linux). Passando um nome de arquivo com o caminho absoluto irá evitar a procura no caminho das bibliotecas de sistema. Um nome de arquivo com uma informação de diretório relativa fará com que o PHP apenas tente carregar a extensão no caminho relativo ao diretório atual. | |||
-l |
Esta opção fornece uma maneira conveniente apenas realizar uma checagem de sintaxe no código PHP fornecido. No sucesso, o texto No syntax errors detected in <arquivo> é impresso na saída padrão e informado o código de saida de sistema 0. Em caso de erro, o texto Errors parsing <filename> juntamente com o a mensagem do interpretador interno é impressa para a saída padrão e o código de saída de sistema é 255. Esta opção não procura por erros fatais (como funções não definidas). Use -f se você deseja detectar erros fatais também.
| |||
-m |
Utilizando essa opção, o PHP imprime os módulos PHP e Zend compilados (e carregados):
| |||
-i | Esta opção de linha de comando chama a função phpinfo() e imprime seus resultados. Se o PHP não está funcionando bem, é interessante fazer um php -i para observar qualquer mensagem de erro impressa antes ou dentro das tabelas de informação. Como a saída é em HTML, ela é um pouco grande. | |||
-r |
Esta opção permite a execução de código PHP direto da linha de comando. As tags de início e fim do PHP (<?php e ?>) não são necessárias e causarão erros de interpretação.
| |||
-h | Com essa opção, você pode obter informações sobre a lista atual de opções de linha de comando pequenas descrições sobre o que elas fazem. |
O PHP executável pode ser utilizando para rodar scripts PHP absolutamente independente de um servidor web. Se você está num sistema Unix, você pode acrescentar uma linha especial na primeira linha de seu script e torná-lo executável, então o sistema operacional saberá que programa deverá rodar o script. Na plataforma Windows, você pode associar php.exe -q com o clique duplo em arquivos .php ou fazer um arquivo batch para rodar seus scripts através do PHP. A primeira linha acrescentada ao script nos Unix não funcionam no Windows, por isso você não pode escrever programas independentes de plataforma desse jeito. Um exemplo simples de como escrever um programa para a linha de comando segue abaixo:
No script acima, nós utilizamos uma primeira linha especial para indicar que este arquivo precisa rodar pelo PHP. Como nós trabalhamos com a versão CLI aqui, não serão impressos headers HTTP. Há duas variáveis que você precisa conhecer para escrever aplicações em linha de comando com o PHP: $argc e $argv. O primeiro é o número de argumentos mais um (o nome do script executando). O segundo é um array contendo os argumentos, começando com o nome do script no índice zero ($argv[0]).
No programa acima é verificado se há apenas um argumento fornecido. Se o argumento for --help, -help, -h ou -?, é impresso uma mensagem de ajuda, imprimindo o nome do script dinamicamente. Qualquer outro argumento é exibido como informado.
Para rodar esse aplicativo nos Unix, basta torná-lo executável e o chamar diretamente como script.php exibaisso ou script.php -h. No Windows, você pode fazer um arquivo batch para esta tarefa:
Assumindo que você nomeou o programa acima como script.php, e você tem um php.exe em c:\php\php.exe este arquivo batch irá rodar com os seguintes parâmetros: script.bat exibaisso ou script.bat -h.
Veja também a documentação da extensão Readline para mais funções que você pode usar para incrementar suas aplicações para linha de comando em PHP.