Criando Extensões para o PHP: Parte II – Configuração do Ambiente de Desenvolvimento no Windows

Olá Amigos!

Este é o segundo post da nossa série “Criando Extensões para o PHP“, até agora este foi o post que mais exigiu pesquisa e dedicação, trabalhei para que ele ficasse o mais enxuto possível e também irei descrever os erros de configuração e as respectivas respostas que tive ao longo do caminho. Antes de mais nada você precisa se certificar que está com o PHP instalado e funcionando. Em um post anterior eu sugeri um tutorial de instalação da mesma versão que estamos utilizando aqui, a 5.4.4, fique a vontade para atualizar. Acidentalmente durante a pesquisa para este trabalho encontrei outro tutorial de instalação mais completo e descrevendo algumas particularidades, vale a pena dar uma olhada.

Em nosso segundo post da série que aborda o desenvolvimento de extensões para o PHP (se você não viu o primeiro clique aqui) iremos configurar o ambiente de desenvolvimento no Windows e por fim obteremos nossa extensão na forma de uma DLL. Antes que os mais detalhistas digam que mencionei no post passado que trabalharíamos com extensões build-in eu acrescento que ao longo da pesquisa me deparei com este tipo de abordagem e acreditei ser mais válida a abordagem neste primeiro momento, já que sua implementação é mais simples.

Inicialmente pensei em utilizar o NetBeans como IDE, no entanto percebi que absolutamente ninguém o utilizava, e interessado em saber o porque descobri a lista de compiladores suportados pelo PHP no ambiente Windows, e ainda descobri que o compilador MinGW, que eu pretendia utilizar juntamente com o NetBeans é explicitamente não suportado. E assim levando em conta este fato com tom engraçado descobri ainda que a recomendação é utilizar o Microsoft Visual C++ para “buildar” o PHP no Windows, eu na minha eterna ingenuidade não havia (incrivelmente) ligado os pontos, já que vamos compilar o PHP para rodar em um produto Microsoft, nada melhor que utilizar um compilador Microsoft.

Bom, dadas as cartas na mesa, vamos ver o que iremos precisar neste momento:

.

1. Instalações e Configuração de Arquivos e Diretórios

Após ter em mãos todos os arquivos, instale:

  1. Microsoft Visual C++ 2008 Express Edition (pode ir tomar m café, demora um pouco).
  2. Microsoft Windows SDK for Windows 7 and .NET Framework.
  3. Crie uma pasta no C:/ denominada “php-dev”.
  4. Descompacte o arquivo de fontes do PHP para dentro do “php-dev” de maneira que os fontes fiquem acessíveis como: “C:/php-dev/php-5.4.4”
  5. Descompacte nossas bibliotecas Win32 Build Tools para dentro da pasta “php-dev”, de maneira que fique: “C:/php-dev/win32build”
  6. Copie o arquivo “bison.exe” de dentro de “C:/php-dev/win32build/bin” para “C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/bin”
.

1. Preparando o Ambiente de Desenvolvimento

No menu iniciar, abra o “Microsoft Visual Studio 2008 Command Prompt“. Vá até a pasta do código fonte do PHP, no nosso exemplo fica:

cd C:/php-dev/php-5.4.4

Agora vamos executar dos scripts, o buildconf.bat e configure.js. Esta etapa é importante pois vai criar alguns arquivos que serão incluídos em nosso projeto e resolver este erro no momento do Build:

Compiling...
stdafx.cpp
C:php-devphp-5.4.4-srcZendzend_config.w32.h(25) : fatal error C1083: Cannot open include file: '../main/config.w32.h': No such file or directory

Quando estava escrevendo este post tive o problema abaixo no momento da execução de ambos, veja:

c:php-devphp-5.4.4>buildconf.bat
Erro de entrada: Não há mecanismo de script para a extensão de arquivo ".js".
Now run 'configure --help'

c:php-devphp-5.4.4>cscript/nologo configure.js
Erro de entrada: Não há mecanismo de script para a extensão de arquivo ".js".

Estou desenvolvendo este trabalho Windows 7 64 bits, acho que este é um problema comum da versão, para resolver veja este tutorial (em inglês), bem simples, é só seguir os passos. Após seguir os passos do tutorial, tente executar os scripts novamente.

Caso tudo der certo você terá uma tela semelhante a da figura abaixo. Após o último comando o script configure vai gerar uma resposta enorme, a imagem abaixo contém apenas o começo dela.

Início do retorno após a execução do script configure.js

2. Configuração da IDE com o Código Fonte do PHP

Abra o Microsoft Visual Studio C++ 2008 Express Edition, crie um novo projeto Win32 (File -> New -> Project -> Win32 ->Win32 Project), dê um nome a ele, em nosso exemplo “php_first_extension”. Em seguida irá abrir uma janela: “Win32 Application Wizard – php_first_extension”, clique em “Next”. Na próxima tela do assistente você terá um grupo de opções denominado “Application Type“, selecione “DLL“. e por fim clique em “Finish”. Quando você terminar terá uma estrutura no “Solution Explorer” como na figura abaixo:

Solution Explorer – Microsoft Visual C++ 2008 Express Edition

Muito bem! Agora temos que configurar algumas diretivas nas propriedades projeto. Clique com  o botão direito sobre o nome do projeto (php_first_extension), e no fim da lista vá em “Properties“. Abrirá uma janela “php_frist_extension Property Pages”, e dentro dela você irá ver a sua esquerda vários itens filhos de “Configuration Priperties“, dentre os itens, os que vão nos interessar são: “General“, “C/C++” e “Linker“. Não vou entrar em detalhes sobre cada um, apenas altere as configurações de acordo com o que está sem seguida.

Entre no subitem “General“, altere as seguintes configurações:

  • “Character Set” para “Use Multi-byte Character Set”.
Em seguida, entre no subitem C/C++, em “General” e altere as seguintes diretivas:
  • “Debug Information Format” para “Program Database (/ZI)”.
  • “Detect 64-bit Portability Issues” para “No” (Se você estiver no Windows 64, como é no meu caso, esta opção já deve aparecer como “No”).
  • “Addition Include Directories”, neste campo você irá indicar onde os fontes do PHP estão, conforme você baixou e descompactou no Item 1 (“C:/php-dev/php-5.4.4”), após a configuração irá ficar desta maneira:
C:/php-dev/php-5.4.4/main 
C:/php-dev/php-5.4.4/Zend 
C:/php-dev/php-5.4.4/TSRM 
C:/php-dev/php-5.4.4/
.
Em seguida no subitem Preprocessor, adicione em Preprocessor Definitions:
ZEND_DEBUG=0    
ZTS=1    
ZEND_WIN32
PHP_WIN32
Feito isso, vamos para o subitem seguinte “Code Generation“, sete as configurações como está abaixo:
  • “Enable String Pooling” para “Yes (/GF)”.
  • “Enable Minimal Rebuild” para “No”.
  • “Basic Runtime Checks” para “Default”.
  • “Runtime Library” para “Multi-threaded Debung (/MTd)”.
.
No próximo item da lista, “Linker“, no primeiro subitem “General”, mude a seguinte configuração: “Adition Library Directories“, adicionando o caminho “C:/php/dev”, que é onde meu PHP está instalando e funcionando, veja não é o diretório dos fontes do PHP, se você olhar dentro deste diretório verá o arquivo “php5ts.lib“, que no subitem “Input”, procure pela propriedade “Addition Dependencies“, e coloque “php5ts.lib“.
.
Ok, até agora nenhuma tarefa complicada (apensar de muito extensa), já estamos com nossas ferramentas instaladas e configuras. No item seguinte vamos criar um pequeno exemplo.
.

3. Exemplo de Extensão e Configuração com o PHP

Agora que temos nosso projeto criado, e o ambiente de desenvolvimento configurado vamos criar um pequeno exemplo, e “junta-lo” com nosso PHP já instalado.

Primeiramente abra o arquivo de cabeçalho stdafx.h, que está em “Header Files”, apague todo seu conteúdo e coloque:

#ifdef PHP_WIN32
   #pragma once
   #include "zend_config.w32.h"
   #include "php.h"
#endif

Em seguida, abra o arquivo php_first_extension.cpp, apague todo seu conteúdo e coloque:

#include "stdafx.h"

PHP_FUNCTION(first_extension);

zend_function_entry php_fist_extension_functions[] = {
   PHP_FE(first_extension, NULL)
   {NULL, NULL, NULL}
};

PHP_MINIT_FUNCTION(php_first_extension)
{
   return SUCCESS;
}

PHP_MINFO_FUNCTION(php_first_extension)
{
}

zend_module_entry php_first_extension_module_entry = {
   STANDARD_MODULE_HEADER,
   "PHP First Extension do Blog do Tiago",
   php_fist_extension_functions,
   PHP_MINIT(php_first_extension),
   NULL, 
   NULL, 
   NULL, 
   PHP_MINFO(php_first_extension),
   "0.1", 
   STANDARD_MODULE_PROPERTIES
};

ZEND_GET_MODULE(php_first_extension)

PHP_FUNCTION(first_extension)
{
   char *strMensagemSucesso = "Parabéns! sua extensão está funcionando!";
   RETURN_STRING(strMensagemSucesso, 1);
}

Remova do projeto os outros arquivos, não vamos utiliza-los por enquanto. Quando ao código no próximo post explico mais profundamente sobre ele.

Bom, agora vamos construir nosso projeto. Mais uma vez com o botão direito sobre o nosso do nosso projeto, clique em Build, ele irá começar a compilar nosso código, que resultará em um arquivo chamado “php_first_extension.dll” que estará dentro da pasta “Debug” no caminho que você salvou o projeto no seu computador. Você verá uma mensagem parecida como esta na IDE:

1>------ Build started: Project: php_first_extension, Configuration: Debug Win32 ------
1>Linking...
1>   Creating library C:UsersTiagoDocumentsVisual Studio 2008Projectsphp_first_extensionDebugphp_first_extension.lib and object C:UsersTiagoDocumentsVisual Studio 2008Projectsphp_first_extensionDebugphp_first_extension.exp
1>Embedding manifest...
1>Build log was saved at "file://c:UsersTiagoDocumentsVisual Studio 2008Projectsphp_first_extensionphp_first_extensionDebugBuildLog.htm"
1>php_first_extension - 0 error(s), 0 warning(s)
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

Para testar este exemplo de extensão, copie o arquivo “php_first_extension.dll” para o diretório “ext“, no meu caso “C:/php-5.4.4/ext”, em seguida abra o arquivo php.ini (que está um diretório acima), procure pelas linhas onde estão o “loading” das extenções, e então adicione:

extension=php_first_extesion.dll

Feche o arquivo php.ini salvando as alterações, restarte seu servidor web (se estiver utilizando o Apache, pode-se utilizar o “Apache System Monitor”).

Crie um arquivo PHP no diretório acessível do seu servidor, dê o nome que quiser, neste arquivo vamos chamar nossa extensão com o seguinte código:

<?php
    echo first_extension();
?>

Se tudo correr bem você verá a seguinte mensagem na tela: “Parabéns! sua extensão está funcionando!“. Se você criar um arquivo PHP com a função “php_info()”, nele você também irá notar os dados da sua extensão, vale a pena ver!

Se você quiser pode fazer o download dos arquivos do projeto aqui.

4. Conclusão da Segunda Parte

Nesta segunda parte fizemos o download das ferramentas necessárias para a construção de extensões no Microsoft Windows, instalamos e as configuramos, além de elaborar e “testar” um pequeno exemplo de extensão externa (dll). A tarefa foi simples, nos próximos posts vamos explorar um pouco da Zend API e elaborar projetos mais complexos.

Referencias

.

Abraços,

Tiago.

Add a Comment

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *