Criando Extensões PHP – Preparando o ambiente (Linux)

Talvez eu tenha demorado um pouco para postar sobre este assunto, já que postei alguns outros assuntos mais avançados.

Neste post vou mostrar como iniciar um projeto, compilar num novo PHP com suporte a sua extensão ou somente sua extensão. Porem não tive oportunidades nem feedbacks sobre como fazer isto no Windows, então vou explicar somente como fazer-lo no Linux, mas prometo que um dia postarei sobre o assunto.

updated: Criando Extensões PHP – Preparando o ambiente (Windows)

Precisaremos dos fontes do PHP, do pacote PHP5-dev, make, gcc e algumas outras coisas necessárias para compilação, que provavelmente será instalada junto as .DEB caso esteja utilizando este tipo de pacote.

updated: No ubuntu 10.4, precisei forçar a instalação do automake 2.13 e o flex antigo (apt-get install automake2.13 flex-old) e iniciar o processo novamente, com fontes novos

Os fontes podem ser baixados no site do PHP (http://www.php.net/downloads), as outras dependências podem ser baixadas junto ao PHP5-DEV (apt-get install php5-dev).

Após baixados, descompacte o source do PHP e entre no diretório. Agora temos vários diretório, mas o interessante para nós chama-se ext, entre nele.

Dentro do diretório de extensões, temos um script chamado ext_skel, responsável por criar o esqueleto da nossa extensão. Vamos criar uma uma extensão chamada minha_extensao

cd ext/
./ext_skel --extname=minha_extensao

Após o comando acima, será criado o diretório minha_extensao que conterá nossos fontes e outros arquivos de configuração. Agora precisamos descomentar algumas linhas no arquivo de configuração da nossa extensão para que ao compilar o php, ela esteja disponível. Para fazer isto, editamos o arquivo config.m4, localizado no diretório na nossa extensão. Localize as linha parecidas com isso, aproximadamente na linha 16:

dnl PHP_ARG_ENABLE(minha_extensao, whether to enable minha_extensao support,
dnl Make sure that the comment is aligned:
dnl [  --enable-minha_extensao           Enable minha_extensao support])

O dnl significa comentário, logo, tudo que inicia com dnl está comentado. Localizando nossas linhas, descomentamos a primeira e a ultima linha deste bloco, deixando assim:

PHP_ARG_ENABLE(minha_extensao, whether to enable minha_extensao support,
dnl Make sure that the comment is aligned:
[  --enable-minha_extensao           Enable minha_extensao support])

Estamos prontos para compilar nosso PHP, então voltamos para o diretório do source do PHP, e rodamos um script chamado buildconf:

cd ../../
./buildconf --force

Agora configuramos e habilitamos nossa extensão. Nesta parte, se não descomentarmos o config.m4 acorrerá problemas:

./configure --enable-minha_extensao

Agora só precisamos compilar, utilizando o comando make. Após a compilação, aparecerá para o usuário digitar outras coisas, mas não o faça, pois o make install poderá substituir suas configurações ou algo pior.

make

Quando o PHP é compilado, é possivel testar sua extensão, com um arquivo .php criado automaticamente dentro do diretório da sua extensão. Para testarmos, utilizamos o php que foi compilado, que se encontra dentro do diretório sapi/cli/:

sapi/cli/php ext/minha_extensao/minha_extensao.php

Pronto, estamos prontos para começar a desenvolver nossa extensão, lembrando que a cada modificação do nosso código C, precisamos digitar somente make para recompilar. Eu geralmente utilizo o seguinte comando:

make; sapi/cli/php ext/minha_extensao/minha_extensao.php

Assim, compilo e executo o teste.
Se o usuário utilizou libs externas na sua extensão, ele poderá linkar a sua lib dentro do arquivo Makefile na raiz do source do PHP. Procure pela linha EXTRA_LIBS, e adicione ao final da linha, a lib necessária.

Outra dica bem válida, é quando o usuário precisa compilar somente a extensão, para poder coloca-la em produção futuramente. A ferramenta que faz isso é chamada phpize, que está localizada no pacote php5-dev. Entre no diretório da sua extensão, e digite:

cd ext/minha_extensao/
phpize
./configure
make

Se for preciso adicionar algumas libs ao linker, edite o Makefile antes de digitar o make. Após a compilação, será criado um diretório chamado modules, que conterá o .a e o .so da sua extensão.
Agora com o .so da sua extensão criada, só é preciso copia-lo para o diretório do seu PHP de produção, e habilita-la no php.ini.

Bem, espero que gostem, e trabalhem nisso, já que é uma coisa bem simples.