PHP Console

Monday, 13 August 2007

Alguma vez pensou se seria possível executar ficheiros de php na linha de comandos, como se fossem programas de C ou de Pascal?

Além de parecer divertido, provavelmente já precisou mesmo de usar e não sabia como. Imagine um ficheiro em PHP que executaria quando iniciasse o servidor (ou o seu servidor instalado em casa) e que trataria de apagar mensagens de fórum antigas ou actualizasse as estatísticas de um gestor de ficheiros.

Podíamos criar um Crontab se estivéssemos a usar Cpanel ou Unix, mas por vezes precisamos de ir mais além. Em PHP existe mais uma opção chamada actualmente de CLI (Command Line Interface) a qual vamos explorar neste artigo.

O CLI

Desde a versão 4.3.0 do PHP que o CLI se tornou um um SAPI (Server API) oficial e conta agora com um .exe próprio para executar aplicações destinadas á linha de comandos.

É bom ter a noção de que o PHP não é a única escolha para criar aplicações que executem em linha-de-comandos, mas traz obviamente vantagens. Se estivermos a programar um portal poderíamos usar outra linguagem como PERL ou Python; o problema aparece quando não conhecemos bem a linguagem ou, mesmo que lidemos bem com ela, seria necessário um esforço extra para executar no mesmo servidor duas linguagens diferentes e lidarmos com a possibilidade de ter de corrigir problemas de duas linguagens diferentes. Simplesmente na grande maioria dos casos é preferível a simplicidade à performance que as outras linguagens dão.

Que tipo de problemas podem ser resolvidos utilizando PHP na consola? Podemos resolver problemas administrativos em que não necessitamos de criar grandes ambientes visuais, mas precisamos de mandar executar backups, limpeza de listas de comentários. Também podemos pensar em fazer um programa de instalação de linha de comandos; por vezes não temos pastas com acessos de escrita e então temos aqui uma boa solução.

Versão da PHP

Podemos correr qualquer versão do PHP na consola, mas é aconselhável que se use a partir da versão 4.3.0, pois implementa o novo sistema CLI. { Ver documentação PHP }

Antes de executarmos o comando é importante relembrar que não necessitam de ter a palavra php definida como um atalho no Windows; podem executar directamente através da pasta. Para os utilizadores de Linux este problema não se coloca.

C:wampphp>php -v
PHP 5.2.3 (cli) (built: May 31 2007 09:37:22)
Copyright (c) 1997-2007 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2007 Zend Technologies

ou

$ php -v
PHP 4.3.6 (cli) (built: Apr 19 2004 10:02:14)
Copyright (c) 1997-2004 The PHP Group
Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies

É aconselhável que obtenham a confirmação que têm o cli, mas se obtiverem um cgi não se preocupem pois pode ser contornado. Mais à frente veremos como.

O Básico

Para começar, é importante perceber que qualquer script em php vai funcionar correctamente na linha de comandos. Mas também é imediato a percepcção que o output não vai ser tão bonito como visto num browser.. ; )

É portanto preciso adaptarmo-nos quando estamos a programar um script a ser executado para a linha de comandos. Aqui fica um exemplo muito simples:

Para executar este programa, vamos novamente à consola:

C:wampphp>php hello.php
Ola Consola! :D

ou

C:wampphp>php C:caminho_para_ficheirohello.php
Ola Consola! :D

Mais avançado

É importante perceber mais conceitos. Quando se escreve programas para consola, devemos incluir um exit(0); no final do programa respeitar as regra de “boas maneiras”. Além disso os parágrafos funcionam de forma bem mais simples sendo apenas necessário um n no final da linha, ao contrário de um ou .

<?php
for ( $i = 0; $i

Output

C:wampphp>php loop.php
0
1
2
3
4
5
6
7
8
9

Quando estivermos a programar para consola, vamos utilizar duas novas funções: fgets e fwrite. Qualquer pessoa familiarizada com outras linguagens já conhece estas funções. Elas recebem como argumento um stream de dados.

Existem três stream’s que vêem por defeito no PHP, associadas a estes endereços:

  * php://stdin (leitura) - **STDIN**
  * php://stdout (escrita) - **STDOUT**
  * php://stderr (escrita) - **STDERR**

Conseguiríamos um programa exactamente igual com esta alternativa:

<?php
for ( $i = 0; $i

Ler dados

Obviamente em algum ponto vai ser necessário o utilizador faz algumas escolhas dentro da execução do programa.

Podemos pensar que estamos a lidar com um ficheiro, que torna tudo mais fácil de imaginar. A única diferença é que usamos os stream’s de input e output do PHP. A constante que sobra, STDERR, serve para guardar erros de execução numa stream independente; estudaremos mais em pormenor noutro artigo.