Aslında bilemiyorum dersin devamı gelir mi? Çünkü göreceksiniz ki; C++ bilen birisi rahatlıkla devamını getirebilecektir. Genel olarak birçok bilgiyi bu makalede vereceğim.
Hangi formatta derlenecek ? :
Windows ortamında çalışabilecek DLL formatında derleyeceğiz ama linux ortamda .so formatında da derleyebilirsiniz. Tabi ki bazı değişiklikler olabileceği için kodlamalarda küçük değişikliklere ihtiyaç duyabilirsiniz.
Hangi kaynaklardan faydalanılır? :
Zend kütüphanesindeki fonksiyonlardan faydalanabilir.
Neden Extension yazmaya ihtiyaç duyulur? ;
- Büyük bir proje hazırladığınızda php'nin bazı kendi fonksiyonları sistemin aşırı kaynak tüketmesine neden olabilir. Stabil çalışmasını engelleyebilir. Bunun sebebi PHP'nin temel fonksiyonlarının kullanabilirlik açısından kolay olması için olabildiğince esnek hazırlanmıştır. Bu yüzden fazla ve projenizde kullanmayacağınız ek kodlamalar olabilmekte. Kendi fonksiyonlarınızı yazabilir ve bunları güven içinde saklayabilirsiniz.
- Güvenlik, şifreleme için kullanılabilir. Bakarsanız ionCube gibi encoderlar mevcuttur. Kendi şifreleme yönteminizi kullanabilirsiniz.
- Küçük projelerinizde kullanmamanızı öneririm. Fazladan yazacağınız extension'lar bellekte gereksiz yer kaplayabilir veya küçük scriptlerinizde birçok hosting firması ne olduğu belli olmayan DLL'lerinizi sistemine yüklemek istemeyebilir.
- Yasadışı yönü ; PHP fonksiyonları amacından çıkartılarak scriptler kırılabilir. Umarım bu yönde kullanmaya çalışmazsınız!...
Gereken araçlar;
PHP Source : Php.net'den edinebilirsiniz. Lakin dikkat etmeniz gereken konu bazı fonksiyonlar versiondan versiona değişecektir.
Visual Studio 2005 =+ : Derleme işlemi yapmak için gerekli olacaktır. 2005 veya üzeri olabilir.
Şuan php extension ile uğraşmadığım için yeterli araç gereç yok bilgisayarımda. Beğendiğim bir siteden alıntılar yaptım eksik anlatmamak için anlatımı resimleri ve aşamaları kullanmayı uygun gördüm.
Anlatım ;
PHP kaynağımızı indirdikten sonra herhangi bir klasöre çıkartın.
/ext klasörüne gidin. (Bu klasör extensionlarınızı kullanacağınız fonksiyonları ve diğer extensionların kaynak kodlarını içermektedir.)
Visual Studio'da Visual C++ Win32 projesi oluşturun.

Herhangi bir isim verin. CustomExt adını verdik. Win32 Application Wizard penceresi geldiğinde Application Settings 'e tıklayın (solda). Application Type'de DLL'i seçin.

Finish'e tıklayarak projeyi oluşturma işlemini tamamlayın.
Aşama aşama anlatacağız ancak hazır kodları indirmek isterseniz buraya tıklayarak indirebilirsiniz.
Configuration Properties'dan General sekmesine gelin. Charset'i "Use Multi-Byte Character Set" olarak değiştirin.

Code Generation bölümünden ;

Şeklinde değiştirin. Yani;
- Enable String Pooling to “Yes (/GF)”
- Enable Minimal Rebuild to “No”
- Basic Runtime Checks to “Default”
- Runtime Library to “Multi-threaded Debug (/MTd)”
- Debug Information Format to “Program Database (/Zi)”
- Detect 64-bit Portability Issues to “No”
şeklinde değiştirin.
Apply'e tıklayarak ayarları kaydedin.
Project Properties diyalogu altından Configuration Properties > C/C++ > General sekmesine gelin.PHP Source'sinin bulunduğu klasörü C:/PHP5Source/ olsun. Sizde PHP kaynak kodlarınız neredeyse onun bulunduğu klasörü ele alarak ayar yapınız. Additional Include Directories diyaloguna gelerek aşağıdaki klasörleri ekleyin.
- C:/PHPSource/main
- C:/PHPSource/Zend
- C:/PHPSource/TSRM
- C:/PHPSource/regex
- C:/PHPSource/

Apply'e tıklayıp önceki yere geri dönün. Project Properties bölümünden Configuration Properties > C/C++ > Preprocessor sekmesine gelin. Preprocessor Definitions bölümüne aşağıdakileri ekleyin.
- ZEND_DEBUG=0
- ZTS=1
- ZEND_WIN32
- PHP_WIN32

OK butonuna tıklayıp onaylayın ve Apply'e basarak ayarları geçerli kılın.
Şimdi tekrar Project Properties diyalogu altında Configuration Properties > Linker > General sekmesine gelin.
Additional Library Directories -> PHP Kaynak kodunun bulunduğu klasörünüz. (Bizde bu C:\PHPSource\ 'di)

Configuration Properties > Linker > Input altından Additional Dependencies bölümüne php5ts.lib ekleyin. (C:\PHPSource klasörünün içinde php5ts.lib olmasına dikkat edin.)

stdafx.h 'a aşağıdaki kodları ekleyin.
Kod:
#pragma once /* PHP Extension headers */ /* include zend win32 config first */ #include "zend_config.w32.h" /* include standard header */ #include "php.h"
Örnek olarak DoubleUp fonksiyonumuz :
Kod:
#include "stdafx.h" /* declaration of functions to be exported */ ZEND_FUNCTION(DoubleUp); /* compiled function list so Zend knows what's in this module */ zend_function_entry CustomExtModule_functions[] = { ZEND_FE(DoubleUp, NULL) {NULL, NULL, NULL} }; /* compiled module information */ zend_module_entry CustomExtModule_module_entry = { STANDARD_MODULE_HEADER, "CustomExt Module", CustomExtModule_functions, NULL, NULL, NULL, NULL, NULL, NO_VERSION_YET, STANDARD_MODULE_PROPERTIES }; /* implement standard "stub" routine to introduce ourselves to Zend */ ZEND_GET_MODULE(CustomExtModule) /* DoubleUp function */ /* This method takes 1 parameter, a long value, returns the value multiplied by 2 */ ZEND_FUNCTION(DoubleUp){ long paramValue = 0; if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", ¶mValue)==FAILURE){ RETURN_STRING("Bad parameters!", true); } paramValue *= 2; RETURN_LONG(paramValue); }
Compile ettiğinizde .dll'iz hazır olacaktır.
PHP Extension Eklemek ve Aktif Etmek
PHP sunucunuzun ext klasörüne gidin ve .dll'inizi içine kopyalayın.
!!! DİKKAT !!! : PHP extension dosyaları genellikle php_xxx.dll formatındadır. Bu formata uygun yapmanızı öneririm. (Örneğin php_CustomExt.dll)
php.ini içine aşağıdaki şekilde extension'unuzu kopyalayın. (;extension=php_zip.dll altına kopyalamanız daha iyi olacaktır)
Kod:
extension=php_ext_adi.dll
Örnek :
Kod:
extension=php_CustomExt.dll
Web sunucunuzu yeniden başlattığınızda eklenti aktif olacaktır. (Eğer bir hata yapılmadıysa)
PHP- Kodu:
<?
phpinfo();
?>
phpinfo();
?>
ile PHP bilgilerine baktığınızda CustomExt'i görürseniz bir problem yok demektir.
Aşağıdaki şekilde eklentinizi deneyebilirsiniz.
PHP- Kodu:
<?
$value = 14; $result = DoubleUp($value); print "Calling DoubleUp($value) returned $result";
?>
$value = 14; $result = DoubleUp($value); print "Calling DoubleUp($value) returned $result";
?>
Anlatım için kaynak : http://blog.slickedit.com/2007/09/cr...visual-c-2005/
Not: R10'daki problemden dolayı konuyu google önbelleğinden çekmek zorunda kaldım. Görsel sorunlar olabilir tam inceleyemedim.