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:
- Microsoft Visual C++ 2008 Express Edition (Você pode baixar a 2010, eu já tinha esta aqui)
- Microsoft Windows SDK for Windows 7 and .NET Framework 4
- PHP 5.4.4 Source Code
- PHP Win32 Build Tools
1. Instalações e Configuração de Arquivos e Diretórios
Após ter em mãos todos os arquivos, instale:
- Microsoft Visual C++ 2008 Express Edition (pode ir tomar m café, demora um pouco).
- Microsoft Windows SDK for Windows 7 and .NET Framework.
- Crie uma pasta no C:/ denominada “php-dev”.
- 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”
- Descompacte nossas bibliotecas Win32 Build Tools para dentro da pasta “php-dev”, de maneira que fique: “C:/php-dev/win32build”
- 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.
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:
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”.
- “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/
ZEND_DEBUG=0 ZTS=1 ZEND_WIN32 PHP_WIN32
- “Enable String Pooling” para “Yes (/GF)”.
- “Enable Minimal Rebuild” para “No”.
- “Basic Runtime Checks” para “Default”.
- “Runtime Library” para “Multi-threaded Debung (/MTd)”.
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
- Build your own PHP on Windows
- Supported Compilers to build PHP on Windows
- PHP GTK – Criando Extensões PHP: Preparando o ambiente Windows
- Creating a PHP 5 Extension with Visual C++ 2005
- Apostilas – Compilando a partir dos Fontes
.
Abraços,