Здравствуйте!
Видел, но не нашёл нужных статей. Кто имеет опыт, как делать сайт на C++ и какие подводные камни? Можно ли работать с SQLITE?
Спасибо.
Здравствуйте!
Видел, но не нашёл нужных статей. Кто имеет опыт, как делать сайт на C++ и какие подводные камни? Можно ли работать с SQLITE?
Спасибо.
Можно но геморно. Работать можно с какой угодно СУБД. Хоть свою собственную пиши.
Подсказать могу только под windows. Веб сервер IIS.
Вариант 1:
самый простой через CGI.
Вывод такой
std::cout << "<br><p>HTML</p>";
Недостатки: Для каждого запроса запускается отдельный процесс, а по завершении закрывается. Это приводит к серьезному снижению производительности.
Вариант 2: Использовать протокол fastcgi. Здесь вывод будет через функцию в("<br><p>HTML</p>");
Тестирование.
hello world:
C++ (fastcgi) ~ 12000/сек.(свыше 12000 кидаются исключения из w3wp.exe)
php (fastcgi) - 6300/сек.
perl (isapi) - 2200/сек.
python (isapi) - 15280/сек. (кэширование)
python (cgi) - 74/сек.
150000 циклов с операциями сложения и умножения:
C++ - 5500/сек.(long long)
php - 220/сек. в 25 раз
perl - 48/сек. в 114 раз
python cgi - 34/сек. в 161 раз
50000 циклов. вывод счётчика i (нагрузка на сеть)
C++ - 950/сек.
php - 750/сек.
perl - 7/сек.
python cgi - 9/сек.
@nolka Наверное 50000 в сек. у меня было в режиме балансировки нагрузки для нескольких серверов. А php запускался не как fastcgi, а как cgi. Но всё равно результат показателен.
Проблемы:
нет инструментов. Придется самому писать.
не факт что готовый сайт будет работать быстрее. Если уровень программиста не очень высокий, то вероятнее всего производительность окажется гораздо хуже чем такой же сайт написанный на специализированном языке..
хостинг не подойдёт. Нужен виртуальный выделенный сервер.
Необходимо грамотно реализовать отдельную обработку get, post запросов.
обработку загрузки файла(через post), обработку отдачи изображения(для captcha например).
работу с заголовками(иногда требуется вывести заголовок в зависимости от результатов, во время выполнения).
обработка ajax запросов так же разная. Это нужно учитывать как для всего приложения(отдельный exe на ajax обработку), так и для обработки post get через ajax. Опять же по разному там приходят все переменные сервера. И если не знать хорошо протокол http, то в коде будет множество заплаток.
Если среда разработки не поддерживает работу в кодировке utf-8, то будет много всяких to_utf8() to_ansi().
кодирование строки запроса urldecode() от разных браузеров разный. Придётся использовать связку библиотеки curl + обычное hex декодирование. При ajax запросе лучше сразу всё оборачивать в urlencode от javascript.
Естественно если на сайте есть flash или другой язык, он также будет по разному всё кодировать. Придётся влезать в исходники этих flash и там всё изменять.
нет готовых "скриптов" для тех или иных задач для сервера. Всё нужно разрабатывать с нуля.
В принципе писать на Си для web, это как писать gui на ассемблере.
Плюсы:
при грамотном исполнении, скорость выполнения программы будет очень высокой. (например до цикла приёма запросов, процесс собирает требуемые данные с диска, и помещает их в память, где сортирует и индексирует). Соединения с субд устанавливается до цикла приёма запросов.
познакомитесь с внутреннем устройством протокола http. Возможно еще с tcp/ip, dns, smtp, pop.
при грамотном исполнении и настройке хостинга, сайт невозможно будет взломать. Взломщикам придётся изучать его структуру.(а не так: в joomla версии 1.5.241 найдена уязвимость, всем пользователям этой версии следует скачать патч, иначе взломщики могут...)
Всё зависит от разработчика. Никакая новая версия языка не должна привести к проблемам.(а-ля в версии 2.1507ab удалены устаревшие... или в этом языке подобные моменты невозможны.)
Нет никаких утечек конфиденциальной информации. CMS(WordPress к примеру) могут содержать специальные инструкции по передаче определенной информации в центры анализа данных ЦРУ или стать неработоспособными в определенный момент.
Инструкция: Windows. веб сервер IIS. Протокол CGI.
1) Создаешь консольное приложение C++.
2) убираем предварительно скомпилированный заголовок.
3) Запускаем консоль IIS.
сайты -> добавить веб сайт.
имя:
CGI
путь:
C:\inetpub\CGI
ОК
Заходим на этот сайт в консоли.
4)Документ по умолчанию:
index.wpp
5)Типы mine:
.wpp
text/html
6)Далее в папке
C:\inetpub\CGI
создаем пустой файл
index.wpp.
7) В С++ проект помещаем строки
#include <iostream>
int main()
{
std::cout << "\nПривет мир С++ в web!";
return 0;
}
8) Компилируем. Берем exe файл. допустим это CGI.exe
кладем в папку
C:\inetpub\CGI
9) дальше идем снова в настройки IIS -> сайты -> CGI -> сопоставление обработчиков -> добавить сопоставление модуля.
путь запроса:
*.wpp
модуль:
cgimodule
исполняемый файл:
"C:\inetpub\CGI\CGI.exe"
имя:
главный
да.
10) Всё теперь идем по ip который указан в привязках сайта. Браузер отобразит строку приветствия.
Инструкция: Windows. веб сервер IIS. Протокол FASTCGI.
1) Качаем
libfcgi2
отсюда
http://www.coastrd.com/download
вот это:
DLL library + headers for C/C++, Delphi, VB & other BASICs
Из архива папку С++ кладем в папку include среды разработки.
Lib в папку с lib файлами, а dll в папку
С:/include/fastcgi test
По этой ссылке смотрим как сконфигурировать
сам IIS
http://www.coastrd.com/cgioniis7
в принципе не отличается от CGI метода, надо только выбрать модуль не cgimodule, а fastcgimodule.
- Создаем новый проект консольный.(только x32)
В него добавляем такие строчки
#ifndef _FCGXAPP_H
#include <libfcgi2.h>
#endif
#pragma comment(lib, "libfcgi2.lib")
#include <iostream>
// функция вывода
static inline void v(const std::string & text , FCGX_REQUEST & FCGI)
{
FCGX_PutStr( text.data(), text.size(), FCGI.pOut);
}
static inline std::string int_to_string(int integ)
{
if(integ == 0){ return "0"; }
char * buffer = new char [32];
_itoa_s(integ, buffer,32, 10 );
return buffer;
}
static inline void v(const int & integ , FCGX_REQUEST & FCGI)
{
std::string global_string = int_to_string(integ);
FCGX_PutStr( global_string.data(), global_string.size(), FCGI.pOut);
}
int main()
{
// счётчик запросов
long long count_fastcgi = 0;
FCGX_REQUEST FCGI = { 0 };
FCGX_InitRequest( &FCGI, 0, 0 );
std::string first = "Content-Type: text/html;charset=utf-8\r\nX-Powered-By: C++\r\nAccess-Control-Allow-Origin: \r\n\r\n";
const char first_string = first.data();
int size_ = first.size();
//first+="Access-Control-Allow-Origin: *\r\n\r\n";
while( FCGX_Accept_r(&FCGI) == 0 )
{
// Вывод заголовков.
FCGX_PutStr( first.data(), size_, FCGI.pOut );
// переменные сервера
for(int i = 0; i < FCGI.nParam ; i++)
{
v("<br>" , FCGI); v(FCGI.envp[i] , FCGI);
}
} // цикл
return 0;
}
После компиляции кладем fastcgi.exe в папку
С:/include/fastcgi test
Добавляем сопоставление модуля в IIS.
Тоже самое как в cgi, только указать не cgimodule, а fastcgimodule.
Если всё заработало, берем apache jmeter(который кстати на java написан -> жутко глючит) , выставляем полную оптимизацию в компиляторе и смотрим сколько страниц сможет обработать. Главное чтобы сам этот jmeter не завис.
Delphi или Си, когда в качестве аргумента выставляют скорость Format относительно printf: правильное соотношение циклов будет только в том случае, если вы заглянете в листинг asm и посчитаете, сколько действительно делает циклов каждый из претендентов. Сравнивать в таком случае надо не скорости, а эффективность оптимизаторов конкретно для задач Web-программирования.
– mega
Jun 16 '16 at 03:24
@pustreg, я минут 5 почитал по Вашей ссылке, и не понял, CppCMS сам является http сервером или как?
– avp Sep 29 '12 at 17:47Это не сервер, это фреймворк для разработки web приложений.
– pustserg Sep 29 '12 at 17:51система регистрации и авторизации своя.
форум свой самописный.
поиск по базе свой.
система вывода статей своя.
административная панель своя, интегрированная в форум.
каптча своя :)) с генерацией изображений на своём же сервере.
система загрузки файлов своя.
система комментариев к статьям своя.
В общем года 2-3 и вместе с геморроем, получите и отличный сайт.
– manking Sep 29 '12 at 18:08Неужели для обращения к ним обязателен слой интерпретации?
– avp Sep 29 '12 at 18:17@pustserg Если бы это было так то движок на C++ можно подключить за 30 мин.
То что вы называете движок, я называю инструменты: это:
функция для работы с потоком вывода(то куда мы html будем передавать).
получить и разобрать переменные post get и упаковать их в удобные контейнеры.
написать код для работы с Cookie.
найти всякие функции UriDecode , htmlspecialcahrs и.т.д
написать обёртки для работы с субд.
и еще много чего..
– manking Sep 29 '12 at 18:34А на каком горючем будет этот движок работать? Или он электрический?
– alexlz Sep 29 '12 at 23:47тестировал 2 года назад на apache jmeter. Понятно что php уже разбирает входящий запрос и формирует post get массивы, и другие моменты. Но если грамотно создать только те компоненты, которые нужны сайту, то для крупной компании получится нехилая экономия на серверах.
Я думаю большинство серьезных проектов и не только в веб, написаны на Си/С++ плюс собственный движок.
– manking Dec 01 '12 at 03:43В больших серьезных проектах, да, некоторые компоменты на более низкоуровневых языках написаны, например, компоненты, занимающиеся анализом данных. Но черпак дегтя - сложность в поддержке и сопровождении.
– nolka Dec 01 '12 at 08:31Рекомендую библиотеку Wt. Шаблоны, сессии, переводы на язык клиента. Работа с СУБД, JSON, AJAX и COMET. Русской документации правда маловато.
Так же рекомендуют crow.
Недавно я разработал шаблонизатор на javascript и компилятор модулей генерации json для lighttpd на чистом C: mod_json-dev.
Спасибо, взял URL на заметку, может и пригодится.
– avp Nov 30 '12 at 15:04
Кстати, почему C++? лучше сразу ASM, а еще лучше - машинный код, зачем "мелочится" то?
Кстати, с т.з. именно тупо сайта - да, лучше на PHP
– Sep 29 '12 at 18:52например, как тут про пхп: http://www.master-live.ru/php_klass.php (много рекламы там, но урок хороший)
то есть чтобы все подробно, с нуля, как вывести html теги, с чего начать написание программы и т.д.
– Nov 30 '12 at 09:58Ну а что касается html тегов, так и на этом сайте прочитать можно.
Тем более для таких случаев стандартный разрыв: тому, кто это может сделать, это не надо, а тот, кому надо -- не может.
– alexlz Nov 30 '12 at 10:14