27

Здравствуйте!

Видел, но не нашёл нужных статей. Кто имеет опыт, как делать сайт на C++ и какие подводные камни? Можно ли работать с SQLITE?

Спасибо.

Nicolas Chabanovsky
  • 51,426
  • 87
  • 267
  • 507
  • 2
    сайт? может сервер?? – Gorets Sep 29 '12 at 14:25
  • 3
    можно, но зачем? –  Sep 29 '12 at 16:43
  • 8
    На PHP лучше что-ли? – ВладиславМСК Sep 29 '12 at 17:28
  • 7
    @ВладиславМСК - java, c#, node.js, ruby, python ......

    Кстати, почему C++? лучше сразу ASM, а еще лучше - машинный код, зачем "мелочится" то?

    Кстати, с т.з. именно тупо сайта - да, лучше на PHP

    –  Sep 29 '12 at 18:52
  • 2
    Такое ощущение складывается, что вы задали этот вопрос просто так, от балды. @AlexWindHope сказал правильно, че мелочиться то, пишите сразу в машинном коде. – KoCaTKo Sep 30 '12 at 11:07
  • 1
    @jetu, Я думал, что сайт на C++ будет требовать меньше ресурсов, чем сайт на том же PHP. Поскольку я владею C++, мне стал этот вопрос интересен. – ВладиславМСК Sep 30 '12 at 12:16
  • 2
    Знаешь сайт в машинных кодах сайт будет работать еще "быстрее". Скорость вся будет нивелироваться говнокодом, который вы напишите. Владеете С++ ?? nice joke bro. Знать синтаксис не означает владеть языком. – KoCaTKo Sep 30 '12 at 12:40
  • 4
    @ВладиславМСК, видимо Вы еще не владеете C++ если задаёте такие вопросы. – Viacheslav Sep 30 '12 at 12:42
  • присоединяюсь к вопросу. есть какой-нибудь подробный, пошаговый мануал на русском, от и до, как сделать сайт на Си?

    например, как тут про пхп: http://www.master-live.ru/php_klass.php (много рекламы там, но урок хороший)

    то есть чтобы все подробно, с нуля, как вывести html теги, с чего начать написание программы и т.д.

    –  Nov 30 '12 at 09:58
  • Исключать возможность существования такого сайта нельзя (извращенцев всяких хватает), но вероятность этого крайне невелика.

    Ну а что касается html тегов, так и на этом сайте прочитать можно.

    Тем более для таких случаев стандартный разрыв: тому, кто это может сделать, это не надо, а тот, кому надо -- не может.

    – alexlz Nov 30 '12 at 10:14
  • Обновил ответ с описанием настройки fastcgi. – manking Dec 01 '12 at 04:48
  • Писать сайты на си плюс плюс можно, но зачем? Простейшие операции выливаются в бесконечные операции по преобразованию типов, и борьбу с утечками памяти. Для фана можно попробовать, но для работы это лишнее. Изучите лучше, к примеру, python, а потом на django будете сайты писать. – nolka Sep 29 '12 at 17:58
  • Добавлю ссылочку: CGI и голый C. – Alexander Petrov Jun 16 '16 at 17:46

3 Answers3

41

Можно но геморно. Работать можно с какой угодно СУБД. Хоть свою собственную пиши.

Подсказать могу только под 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. Но всё равно результат показателен.

Проблемы:

  1. нет инструментов. Придется самому писать.

  2. не факт что готовый сайт будет работать быстрее. Если уровень программиста не очень высокий, то вероятнее всего производительность окажется гораздо хуже чем такой же сайт написанный на специализированном языке..

  3. хостинг не подойдёт. Нужен виртуальный выделенный сервер.

  4. Необходимо грамотно реализовать отдельную обработку get, post запросов.

  5. обработку загрузки файла(через post), обработку отдачи изображения(для captcha например).

  6. работу с заголовками(иногда требуется вывести заголовок в зависимости от результатов, во время выполнения).

  7. обработка ajax запросов так же разная. Это нужно учитывать как для всего приложения(отдельный exe на ajax обработку), так и для обработки post get через ajax. Опять же по разному там приходят все переменные сервера. И если не знать хорошо протокол http, то в коде будет множество заплаток.

  8. Если среда разработки не поддерживает работу в кодировке utf-8, то будет много всяких to_utf8() to_ansi().

  9. кодирование строки запроса urldecode() от разных браузеров разный. Придётся использовать связку библиотеки curl + обычное hex декодирование. При ajax запросе лучше сразу всё оборачивать в urlencode от javascript. Естественно если на сайте есть flash или другой язык, он также будет по разному всё кодировать. Придётся влезать в исходники этих flash и там всё изменять.

  10. нет готовых "скриптов" для тех или иных задач для сервера. Всё нужно разрабатывать с нуля.

В принципе писать на Си для web, это как писать gui на ассемблере.

Плюсы:

  1. при грамотном исполнении, скорость выполнения программы будет очень высокой. (например до цикла приёма запросов, процесс собирает требуемые данные с диска, и помещает их в память, где сортирует и индексирует). Соединения с субд устанавливается до цикла приёма запросов.

  2. познакомитесь с внутреннем устройством протокола http. Возможно еще с tcp/ip, dns, smtp, pop.

  3. при грамотном исполнении и настройке хостинга, сайт невозможно будет взломать. Взломщикам придётся изучать его структуру.(а не так: в joomla версии 1.5.241 найдена уязвимость, всем пользователям этой версии следует скачать патч, иначе взломщики могут...)

  4. Всё зависит от разработчика. Никакая новая версия языка не должна привести к проблемам.(а-ля в версии 2.1507ab удалены устаревшие... или в этом языке подобные моменты невозможны.)

  5. Нет никаких утечек конфиденциальной информации. 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.

  1. Создаем новый проект консольный.(только x32)

В него добавляем такие строчки

     #ifndef _FCGXAPP_H
#include &lt;libfcgi2.h&gt;
#endif
#pragma comment(lib, "libfcgi2.lib") 
#include &lt;iostream&gt;

// функция вывода

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 &lt; FCGI.nParam ; i++)
{
v("&lt;br&gt;" , FCGI); v(FCGI.envp[i] , FCGI);
}

} // цикл

return 0; }

После компиляции кладем fastcgi.exe в папку С:/include/fastcgi test

Добавляем сопоставление модуля в IIS. Тоже самое как в cgi, только указать не cgimodule, а fastcgimodule.

Если всё заработало, берем apache jmeter(который кстати на java написан -> жутко глючит) , выставляем полную оптимизацию в компиляторе и смотрим сколько страниц сможет обработать. Главное чтобы сам этот jmeter не завис.

manking
  • 6,393
  • А на чём тогда написан Яндекс и Гугл?
    Понятно, что не на PHP, на Java что ли? Это же нереально, он же медлительный оченью
    – ВладиславМСК Sep 30 '12 at 10:42
  • facepalm.... – KoCaTKo Sep 30 '12 at 11:05
  • Ой как много java в гугле,пора бы уже знать,что C++ у них на бек-энде – vanekk1 Nov 30 '12 at 11:48
  • Если посмотреть на вакансии Яндекса, то видно, что С++ там тоже есть. – Lucky Nov 30 '12 at 12:11
  • Ну ,конечно)))есть – vanekk1 Nov 30 '12 at 14:01
  • 3
    Многабукофф. Ни асилил, но крута! Плюсадынадын. – gecube Dec 02 '12 at 12:37
  • Мне вот эти таблицы сравнения тут напоминают спор про то что быстрее Delphi или Си, когда в качестве аргумента выставляют скорость Format относительно printf: правильное соотношение циклов будет только в том случае, если вы заглянете в листинг asm и посчитаете, сколько действительно делает циклов каждый из претендентов. Сравнивать в таком случае надо не скорости, а эффективность оптимизаторов конкретно для задач Web-программирования. – mega Jun 16 '16 at 03:24
  • какое отношение имеют операции сложения/умножения в цикле к производительности веб-сайта не ясно. – jfs Jun 16 '16 at 17:19
10

Можно использовать С++ фреймворк например CppCMS

pustserg
  • 750
  • Это что-то совсем новое?

    @pustreg, я минут 5 почитал по Вашей ссылке, и не понял, CppCMS сам является http сервером или как?

    – avp Sep 29 '12 at 17:47
  • Знаете, если уж и писать на С++ именно сайт, то и движок у него должен быть свой. Иначе какой смысл? – manking Sep 29 '12 at 17:51
  • Как говорят сами разработчики в FAQ It is a web development framework like Django or RoR.

    Это не сервер, это фреймворк для разработки web приложений.

    – pustserg Sep 29 '12 at 17:51
  • Ну, да. На 10-й минуте я нашел инструкции для подключения к апачу и т.п. – avp Sep 29 '12 at 17:55
  • @manking а что вы подразумеваете под движком? CMS, CMF или что-то еще? Просто CppCMS является (несмотря на название) именно фреймворком, а не CMS (я движок сайта понимаю как CMS). – pustserg Sep 29 '12 at 18:00
  • О CMS на C++ наверное можно забыть(например на уровне joomla). Движок значит:
    • система регистрации и авторизации своя.

    • форум свой самописный.

    • поиск по базе свой.

    • система вывода статей своя.

    • административная панель своя, интегрированная в форум.

    • каптча своя :)) с генерацией изображений на своём же сервере.

    • система загрузки файлов своя.

    • система комментариев к статьям своя.

    В общем года 2-3 и вместе с геморроем, получите и отличный сайт.

    – manking Sep 29 '12 at 18:08
  • 2
    @manking, а все базовые функции PHP (а значит joomla) разве не на С написаны?

    Неужели для обращения к ним обязателен слой интерпретации?

    – avp Sep 29 '12 at 18:17
  • Хммм то что вы перечислили больше похоже на CMS, сам же сайт, даже супер-пупер динамический представляет по сути набор хтмлок (иногда с пройслойкой js для красивого представления), а вот кто будет генерировать эти хтмлки без разницы же, либо человек (в случае статического сайта), либо серверные сценарии (причем на каком языке они написаны сайту то без разницы) Так что движок в этом случае - то что генерит хтмл файлы, отдаваемые браузеру. И не каждому движку нужен форум, капча, админка и прочее. Вопрос же был как сделать сайт на С++, а не как написать CMS на С++ ) – pustserg Sep 29 '12 at 18:19
  • @avp Как? Смотреть исходники и выдирать оттуда?

    @pustserg Если бы это было так то движок на C++ можно подключить за 30 мин.

    То что вы называете движок, я называю инструменты: это:

    • функция для работы с потоком вывода(то куда мы html будем передавать).

    • получить и разобрать переменные post get и упаковать их в удобные контейнеры.

    • написать код для работы с Cookie.

    • найти всякие функции UriDecode , htmlspecialcahrs и.т.д

    • написать обёртки для работы с субд.

    и еще много чего..

    – manking Sep 29 '12 at 18:34
  • 2
    "Знаете, если уж и писать на С++ именно сайт, то и движок у него должен быть свой."

    А на каком горючем будет этот движок работать? Или он электрический?

    – alexlz Sep 29 '12 at 23:47
  • Начинаем холивар что-ли? Сказали-же, что писать сайты на цпп можно, но зачем?)) Чтобы создать гипермегасупербыстрый сайт? Это не актуально, потому что:
    • во 1, написанный гипермегасупербыстрый сайт при отдаче контента упрется в сеть. Имею ввиду, что далеко не у всех пользователей сети качественный и быстрый интернет.
    • во 2, каким бы крутым с++ программистом ты ни был, написав сайт на с++ кто его кроме тебя сможет сопровождать, отсюда вытекает третий пункт:
    • в 3 спрос на сайтоделов на с++ если и есть, то он очень уж маленький. Это не выгодно.
    – nolka Dec 01 '12 at 03:06
  • На задачи, которые на том же самом Python+django делаются за 30 минут, вы будете тратить часы, дни, а то, и недели. Я не буду приводить примеров задач, это не принципиально. Мне становится печально только от того, как вы будете это все клиенту отдавать, генерировать html, или другой контент. – nolka Dec 01 '12 at 03:08
  • 3
    Простой вывод hello world на PHP обрабатывает 500 стр/сек. на fastcgi C++ 50000 стр/сек. все ядра на 100% забиты.

    тестировал 2 года назад на apache jmeter. Понятно что php уже разбирает входящий запрос и формирует post get массивы, и другие моменты. Но если грамотно создать только те компоненты, которые нужны сайту, то для крупной компании получится нехилая экономия на серверах.

    Я думаю большинство серьезных проектов и не только в веб, написаны на Си/С++ плюс собственный движок.

    – manking Dec 01 '12 at 03:43
  • Заинтересовало. Хотел бы посмотреть пошаговое введение вэтот фреймворк и сравнение его с Wt. Сам вижу возможные недостаоки в Wt - то что шаблоны интерпретируемые и переводы сообщений хранятся в xml-файлах. – sercxjo Dec 01 '12 at 03:49
  • @manking, все ядра - сколько в штуках? что за железо? тестили как? на локалхосте? условия тестирования одинаковые были?

    В больших серьезных проектах, да, некоторые компоменты на более низкоуровневых языках написаны, например, компоненты, занимающиеся анализом данных. Но черпак дегтя - сложность в поддержке и сопровождении.

    – nolka Dec 01 '12 at 08:31
9

Рекомендую библиотеку Wt. Шаблоны, сессии, переводы на язык клиента. Работа с СУБД, JSON, AJAX и COMET. Русской документации правда маловато.

Так же рекомендуют crow.

Недавно я разработал шаблонизатор на javascript и компилятор модулей генерации json для lighttpd на чистом C: mod_json-dev.

sercxjo
  • 6,904
  • 2
  • 27
  • 57
  • Полноценный сайт слепить можно будет? Интересно, попробую. – ВладиславМСК Nov 30 '12 at 13:35
  • Сам недавно с ней работаю, пишу браузерные игры, удивляюсь широте возможностей. Прошёл несколько подводных камней, будут проблемы - спрашивайте. Рекомендую сразу ставить последнюю версию, в дебиане устаревшая. – sercxjo Nov 30 '12 at 13:43
  • @sercxjo, посмотрел демо Wt, мне понравилось - достойно выглядит.

    Спасибо, взял URL на заметку, может и пригодится.

    – avp Nov 30 '12 at 15:04
  • 1
    дополнительно - есть, еще фрейморвки типа crow/http2, которые поддерживают раутинг и миддлеварь интерфейсы. Для работы с sql есть уймы библиотек (я предпочитаю sqlp11) – strangeqargo Jun 15 '16 at 22:07
  • 2
    @strangeqargo ну где вы были пару месяцев назад :) когда я решил сделать свой шаблонизатор+генератор json на чистом C. – sercxjo Jun 16 '16 at 16:42
  • @sercxjo зато опыт получили – strangeqargo Jun 16 '16 at 18:24
  • 1
    @ВладиславМСК на wt, уверен можно. на crow/cpphttp2+rapidJSON (самый быстрый сейчас, кажется) можно как минимум сделать, например, api для фронтэнда (развлекаюсь этим). crow по умолчанию не может раздавать статику, но middleware для этого пишется очень быстро (делал, потом выложу в гитхабики, если нужно будет) – strangeqargo Jun 16 '16 at 22:26