Доброго инета)) полагаю многие сталкивались с "недоработками" пхп, которые стандартными путями не решались, сейчас мы научимся быдлокодить на c++ с целью повыпендриваться на php))) И так нам понадобится 1) мозг (опционально) 2) среда разработки визуал студио сообразно версии (в качестве образца возьмём php5.5.10 and vc2012 (не чего личного так разрабы решили) по сцылке https://www.microsoft.com/ru-ru/download/details.aspx?id=30678 ) (рассмотрим вариант с шиндовс тк адаптация с шандовс на линух занимает куда меньше сил) 3) установленая весия пхп --------------------------------------- И здесь два пути простой,- скачать шаблон http://dropmefiles.com/OeLQw или попытаться в ручную установить настройки препроцессора. путь 1: распаковываем архив по адресу винды C:\Users\Пользователь\Documents\Visual Studio 2012\Projects где пользователь=никнейм жевательно на латинице так как или сейчас или после вам придётся юзать латиницу в винде а если продолжите юзать винду с кирилицей то вам не избежать таких кошмаров как ср866 или ср1251 путь 2: для компиляции нам понадобятся исходники которые вы должны скачать сообразно вашей версии пыха и опционально поместить в удобном для вас месте по ссылке https://secure.php.net/releases/ выбираем нужную версию и если имеется выбор то source code формат архива не приоритетен, ну может быть вам придётся думать чем его открыть из всех этих метробайт мёртвого груза нам понадобятся следующие php-версия php-версия\main php-версия\TSRM php-версия\Zend а именно запускаем vc2012 переходим проект/свойства win32project1/свойства конфигурации/каталоги включения и добавляем пути к вышеозначенм папкам далее нужно перейти по пути проект/свойства win32project1/свойства конфигурации/с\с++ /препроцессор/определения препроцессора и добавить следующие строки PHP_WIN32 // ваша разрядность ZEND_WIN32 ZEND_DEBUG=0 // редкая опция которую смотрим в phpinfo и TS если у вас сборка TS то ставим строку TS=1 если сборка NTS то не ставим никакой строки переходим проект/свойства win32project1/свойства конфигурации/компановщик/дополнительные каталоги билиотек/ добавляем путь "php_Версия/dev" ереходим проект/свойства win32project1/свойства конфигурации/компановщик/ввод/дополнительные зависимости и прописываем "php5.lib" и я включаю телепатию и видю что у вас нет этого файла))) взять их вы можете из репозитория пыха на гитхабе https://github.com/php/php-src кликнув brranch_master/tags/URversion //------------------------------------------------------------ всё самое лёгкое кончилось)) переходим к проекту, то есть к коду для тех кто пошёл по тяжёлому пути создаем проект вин32 консольное приложение для тех кто скачал исходиник открываем проект C:\Users\Пользователь\Documents\Visual Studio 2012\Projects\Win32Project1 далее удаляем все что нам навязывает vc2012 далее нам нужно создать три файла (для простоты) первый stdafx.h Код (Text): #ifndef STDAFX #define STDAFX #define PHP_COMPILER_ID "VC11" // здесь идёт дополнительная заглушка различия версий #include "zend_config.w32.h"// и зенда #include "php.h" #include "info.h" LPCTSTR s = L"test.dll"; // скачок в разработке,- этим мы подключаем дллку не привязаную к зенду, которая описывается в проекте win32project2 для скачавших шаблон HINSTANCE hlib = LoadLibrary(s); // наследие предыдущей строки #endif конечно имя stdafx и её константы могут быть удалены\заменены\переименованы далее мы рассмотрим мое первое расширение пхп для консоли шиндовс Код (Text): #include "stdafx.h" //---------------------------------------------------------------------------------------------- PHP_FUNCTION(wcolor){ // объявляем пхп функцию if(hlib){ //если сторонняя длл подключена long* in; long* (*dllHelloWorld) (long* ...); dllHelloWorld = (long* (*)(long* ...))GetProcAddress(hlib, "wcolor"); // получаем адрес функции находящейся во внешней длл zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,"l", &in); // получаем параметры перданные пыхом средствами зенда if(dllHelloWorld) { //если адресс функции получен if((int)in>0){ dllHelloWorld(in); }else{ php_error(E_NOTICE,"Value must be more than 0");} }else{ php_error(E_WARNING,"Dll function not found"); } }else{ php_error(E_WARNING,"Dll loading is failed");} RETURN_TRUE; } PHP_FUNCTION(wcls){ //const char *aaa = INI_STR("test.string"); if(hlib){ void (*dllHelloWorld) (); dllHelloWorld = (void (*)())GetProcAddress(hlib, "wcls"); if(dllHelloWorld) { dllHelloWorld(); }else{ php_error(E_WARNING,"Dll function not found"); } }else{ php_error(E_WARNING,"Dll loading is failed");} RETURN_TRUE; } PHP_FUNCTION(wkey){ int ch; //const char *aaa = INI_STR("test.string"); if(hlib){ int (*dllHelloWorld) (); dllHelloWorld = (int (*)())GetProcAddress(hlib, "wkey"); if(dllHelloWorld) { ch=dllHelloWorld(); }else{ php_error(E_WARNING,"Dll function not found"); } }else{ php_error(E_WARNING,"Dll loading is failed");} RETURN_LONG ((long)ch); } //-------------------------------------------------------------------------------------------- #include "end.h" --- Добавлено --- Здесь мы столкнулись с особенностями зенда,- нельзя подключать внешние библиотеки, нельзя использовать шаблоны и прочие ограничения, выход есть один клепать независимую длл и подключать её. По своей сути движок зенд реализовал свой функционал в полной мере в дефолтных расширениях пхп. В сущности можно реализовать функцию return_string('made by popov'); Код (Text): const zend_function_entry test_functions[] = { PHP_FE(wcolor, NULL) // идёт перечисление добавляемых функций PHP_FE(wcls, NULL) PHP_FE(wkey, NULL) PHP_FE_END }; //------------------------------------------------------------------------------------------------- PHP_INI_BEGIN() PHP_INI_ENTRY("test.string", "abc", PHP_INI_ALL, NULL) // здесь идёт чтение вхождений в пхп.ини PHP_INI_END() PHP_MINIT_FUNCTION(test) { // функция исполняемая однажды при инициализации расширения REGISTER_INI_ENTRIES(); return SUCCESS; } PHP_MSHUTDOWN_FUNCTION(test) {// тоже при деинициализации if(!FreeLibrary(hlib)){php_error(E_WARNING,"Dll free is fail");} UNREGISTER_INI_ENTRIES(); return SUCCESS;} PHP_MINFO_FUNCTION(test) { // устанавливаем значения в пхп.ини на случай если они там не прописаны php_info_print_table_start(); php_info_print_table_header(2, "First column", "Second column"); php_info_print_table_row(2, "Entry in first row", "Another entry"); php_info_print_table_row(2, "Just to fill", "another row here"); php_info_print_table_end(); DISPLAY_INI_ENTRIES(); } zend_module_entry test_module_entry = { STANDARD_MODULE_HEADER, // #if ZEND_MODULE_API_NO >= 20010901 "test", // название модуля test_functions, // указываем экспортируемые функции NULL, // PHP_MINIT(test) если требуются действия при инициализации PHP_MSHUTDOWN(test), // тоже для деинициализации NULL, // PHP_RINIT(test), Request Initialization NULL, // PHP_RSHUTDOWN(test), Request Shutdown PHP_MINFO(test), // PHP_MINFO(test), Module Info (для phpinfo()) "0.1", // версия нашего модуля STANDARD_MODULE_PROPERTIES }; ZEND_GET_MODULE(test) далее нужен файл внешней длл с кодом, для которого нужен новый проект (win32project2 в образце) Код (Text): #include <Windows.h> #include <conio.h> using namespace std; BOOL WINAPI DllMain(HINSTANCE hDll, DWORD dwReason, LPVOID lpReserved) { switch(dwReason) { case DLL_PROCESS_ATTACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; } extern "C" __declspec(dllexport) void wcolor(long* a){ HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(console, (int)a); } extern "C" __declspec(dllexport) void wcls(){ system("cls");} extern "C" __declspec(dllexport) int wkey(){ // указываем тип функции а в с++ это равно возвращаемому значению if(_kbhit ()){ // и выполняем какие либо действия return _getch(); }else{ return NULL;} } --- Добавлено --- далее компилируем два проекта, переименовываем второй в test.dll и кидаем test.dll в корень пыха (туда же где лежит php.ini) второй переименовываем по своему усмотрению и кидаем в папку с расширениями /ext подключаем расширения в php.ini выводим phpinfo(); и радуемся +: для работы с длл файлами может пригодится программа depends http://dropmefiles.com/y3Ij6 позволяющая работать с длл файлами, в часности выводящая список функций из длл и их адреса РНО: ошибки (нотайсы) будут постоянно их я побороть не в силах. иногда может помочь указать в проект/компановщик/командная строка/ "/FORCE:MULTIPLE" но стоит обратить особое внимание на пути дополнительных библиотек так же если что-то не работает нужно сказать "именем великомогущего абрдабр повелеваю тебе ничтожный мелкософт нормально скомилировать расширение" и перечитать мануал это решит 50% проблем собственно говоря описание процесса создания расширения оказалось довольно таки трудоёмким занятием, и мне пришлось выкинуть запланированые пояснения и стандартные ошибки, отступления и комментарии, но если ктото столкнётся с чем-то то мб я проявлю экстрасенсорные способности и помогу решить проблему))) --- Добавлено --- что нужно знать о с++ в своём синтаксисе с++ очень похож на пхп со следующими исключениями: 1) жесткая типизация. объявляя с++ функцию вы уже должны знать какой тип она вернёт. обходимо при помощи перегрузки... 2) отсутствие типа string. в с++ все строки это массивы или списки что принесёт не мало проблем при освоении с++