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

Talvez eu tenha demorado um pouco para postar como faze-lo no Windows, mas ai esta.

Este post é uma resposta ao post Criando Extensões PHP – Preparando o ambiente (Linux). Aqui vou mostrar como iniciar um projeto, compilar a sua extensão.

Precisaremos dos fontes do PHP e do VisualC++. Aqui utilizarei o Visual Studio 2005. Também estamos levando em conta que seu PHP já esteja instalado e funcionando corretamente.

Os fontes podem ser baixados no site do PHP (http://www.php.net/downloads). Infelizmente o Visual Studio é uma ferramenta paga, porem existe uma versão express, que também pode ser utilizada e não possui custo nenhum, se seguida sua licença.

Após baixados, descompacte o source do PHP e entre no diretório. Agora temos vários diretórios, minha estrutura ficou +/- assim:

C:/php-gtk2
C:/php-gtk2/source
C:/php-gtk2/dev

O diretório SOURCE são os fontes baixados do PHP. Reparem no diretório DEV. Este diretório eu tive que copiar de dentro de SOURCE. No php-gtk2 que eu possui-a, não existia este diretório, logo, copiei dos fontes sem problemas. Dentro deste diretório está o .lib que utilizaremos para compilar (linkar) as funções da ZEND API.

A partir daqui, abrimos no Visual Studio, e criamos um novo projeto Visual C++, Win32 Project. Colocamos o nome da nossa extensão, por padrão sempre utilizamos um php_ no inicio, utilizaremo php_hello. Selecione onde seu projeto ficará.

Um projeto iniciará cheio de código, não se preocupe, limparemos isso já já, também não confio nesses templates. No Solution Explorer (container onde fica os arquivos, do lado direito) clique com o direito em cima do nome do seu projeto, e sete em propriedades. Teremos que mudar algumas coisas aqui, algumas coisas eu não sei o por que mudar, pois fui coletando uma informaçãozinha aqui, outra ali, e cheguei nisso, o fato é que mudando algumas das opções a baixo a extensão não compila, ou não funciona corretamente.

Configuration Properties > C/C++ > Code Generation
Mude Enable String Pooling para Yes (/GF)
Mude Enable Minimal Rebuild para No
Mude Basic Runtime Checks para Default
Mude Runtime Library para Multi-threaded Debug (/MTd)

Configuration Properties > C/C++ > General
Mude Debug Information Format para Program Database (/Zi)
Mude Detect 64-bit Portability Issues para No

Após efetuar as mudanças, precisamos dizer à IDE onde estão nossas bibliotecas e código da ZEND API.
Volte para Configuration Properties > C/C++ > General, e em Additional Include Directories adicione os seguintes diretórios (lembrando da minha estrutura, se a sua estiver diferente, fique atento):

C:/php-gtk2/source/main
C:/php-gtk2/source/Zend
C:/php-gtk2/source/TSRM
C:/php-gtk2/source/regex
C:/php-gtk2/source

Agora precisamos criar algumas definições, para que a ZEND API trabelhe corretamente no Windows.
Vá até Configuration Properties > C/C++ > Preprocessor, e em Preprocessor Definitions adicione as seguintes definições:

ZEND_WIN32
PHP_WIN32
ZEND_DEBUG=0
ZTS=1

Iremos agora dizer ao linker, qual a biblioteca da ZEND API.
Vá em Configuration Properties > Linker > General, e em Additional Library Directories adicione o caminho:

C:/php-gtk2/dev

Após isso vá em Configuration Properties > Linker > Input, e em Additional Dependecies adicione:

php5ts.lib

Uffa, é isso, agora podemos nos divertir =)

Apague o conteúdo do arquivo stdafx.h e coloque isso:

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

No arquivo php_hello.cpp, também fique a vontade de apagar tudo. Coloque o seguinte código:

#include "stdafx.h"

PHP_FUNCTION(hello);

zend_function_entry php_hello_functions[] = {
	PHP_FE(hello, NULL)
	{NULL, NULL, NULL}
};    


PHP_MINIT_FUNCTION(php_hello)
{
	return SUCCESS;
}

PHP_MINFO_FUNCTION(php_hello)
{

}

zend_module_entry php_hello_module_entry = {
	STANDARD_MODULE_HEADER,
	"php_hello",
	php_hello_functions,
	PHP_MINIT(php_hello),
	NULL, 
	NULL, 
	NULL, 
	PHP_MINFO(php_hello),
	"0.1", 
	STANDARD_MODULE_PROPERTIES
};    

ZEND_GET_MODULE(php_hello)

PHP_FUNCTION(hello)
{
	char *strHello = "Olha =)";
	RETURN_STRING(strHello, 1);
}

Agora é só compilar, F6 depois CONTROL + F7. Isso criará dentro do seu projeto, um diretório chamado debug, dentro dele se encontra a sua extensão php_hello.dll.

Copie esta DLL para o diretório das extensões do seu PHP, e habilite ela no arquivo php.ini.

Agora é só correr para o abraço:


Próximo passo, será como construir uma estrutura que possa ser compilada tanto no windows quanto no linux.

Valeu =)