Peter_BMedlem sedan apr. 2000595 inlägg
Jag har sedan länge skrivit alla mina cgi-program i perl, det är ju lätt och bra, men ack så segt att laddas.
därför tänkte jag gå över till att skriva vissa program i c++ istället. jag kan både lite c++ och en massa java sen tidigare, men som alla vet är det lite saker man måste tänka på när man gör cgi-program.. till exempel kommunikationen med webservern. hur få in GET och POST-innehållet till exempel? finns det nån sida på nätet som behandlar c++ som cgi-lösning?
Peter
http://www.scorpiondata.com
SweyMedlem sedan apr. 20002 000 inlägg
Hej
Jag har inga större erfarenheter inom C++ i CGI men därimot i C++.
Jag har kollat upp detta nu och du måste kompilera koden i en kompilator och sätta rättigheter för filen så att den kan köras.
Skrev ihop denna kod för att skriva ut alla miljövariabler. Prova så fattar du sen hur det fungerar.
#include <stdio.h>
int main(int argc, char * argv[], char * env[])
{
printf("HTTP/1.1 200 OK\r\n");
printf("Content-type: text/html\r\n");
printf("\r\n");
for(int x = 0; env\[x\] != 0; x++)
printf("%s\<br\>", env\[x\]);
return 0;
}
------------------
/mvh Swey
Programmera Php
swey@tjohoo.se
Peter_BMedlem sedan apr. 2000595 inlägg
okey, det är det som kommer genom "get"? och det som kommer via "post" kommer in genom STDIN?
SweyMedlem sedan apr. 20002 000 inlägg
Öh, nej.
Prova kör koden. Den körs vad som än skickas. GET, POST, PUT, ...
Detta skrev den ut för mig. Bland annat
REQUEST_METHOD=GET
ALLUSERSPROFILE=C:\Documents and Settings\All Users
CommonProgramFiles=C:\Program Files\Common Files
COMPUTERNAME=MARCUS
ComSpec=C:\WINNT\system32\cmd.exe
CONTENT_LENGTH=0
GATEWAY_INTERFACE=CGI/1.1
HTTP_ACCEPT=image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-powerpoint, application/vnd.ms-excel, application/msword, application/x-comet, */*
HTTP_ACCEPT_LANGUAGE=sv
HTTP_CONNECTION=Keep-Alive
HTTP_HOST=localhost
HTTP_USER_AGENT=Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
HTTP_ACCEPT_ENCODING=gzip, deflate
HTTPS=off
INSTANCE_ID=1
LOCAL_ADDR=127.0.0.1
NUMBER_OF_PROCESSORS=1
Os2LibPath=C:\WINNT\system32\os2\dll;
OS=Windows_NT
Path=C:\WINNT\system32;C:\WINNT;C:\WINNT\system32\WBEM;D:\Borland\BCC55\Bin;D:\Borland\CBUILD~1\Projects\Bpl;D:\Borland\CBUILD~1\Bin
PATH_TRANSLATED=e:\www
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 6 Model 7 Stepping 3, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=0703
ProgramFiles=C:\Program Files
QUERY_STRING=a=b
REMOTE_ADDR=127.0.0.1
REMOTE_HOST=127.0.0.1
REQUEST_METHOD=GET
SCRIPT_NAME=/scripts/konsoll.exe
SERVER_NAME=localhost
SERVER_PORT=80
SERVER_PORT_SECURE=0
SERVER_PROTOCOL=HTTP/1.1
SERVER_SOFTWARE=Microsoft-IIS/5.0
SystemDrive=C:
SystemRoot=C:\WINNT
TEMP=C:\WINNT\TEMP
TMP=C:\WINNT\TEMP
USERPROFILE=C:\Documents and Settings\Default User
windir=C:\WINNT
Mycket nöje :D
------------------
/mvh Swey
Programmera Php
swey@tjohoo.se
Peter_BMedlem sedan apr. 2000595 inlägg
hmm.. provade att skriva "gcc ctest.c".. men det gick inte så bra, den klagar på lite saker:
ctest.c: In function `main':
ctest.c:9: parse error before `int'
ctest.c:9: `x' undeclared (first use in this function)
ctest.c:9: (Each undeclared identifier is reported only once
ctest.c:9: for each function it appears in.)
ctest.c:9: parse error before `)'
....
så ser det ut.. :).. behöver jag ge gcc några options?
SweyMedlem sedan apr. 20002 000 inlägg
Deklarationer i for-satser fungerar endast i C++. Kompilera därför med gxx eller använd filnamnstilägget .cpp
------------------
/mvh Swey
Programmera Php
swey@tjohoo.se
Peter_BMedlem sedan apr. 2000595 inlägg
RobbanMedlem sedan dec. 19992 272 inlägg
Kan väl som en parantes nämna att du inte skall vänta dig några astronomiska förbättringar när det gäller hastigheten. En stor del av flaskhalsen ligger i att en ny process skapas för varje CGI-anrop, och den flaskhalsen kvarstår även om du använder kompilerade program. Men visst tjänar du lite på att inte Perl dras igång för varje process. Någonting som dock bör vägas mot att det ofta går dubbelt så snabbt att utveckla någonting i Perl.
Om det är maximal hastighet du vill ha kanske du skall titta på mod_perl? Tyvärr är det inte många webhotell som erbjuder den möjligheten.
------------------
Robban < robban@lipogram.com >
SweyMedlem sedan apr. 20002 000 inlägg
Att starta ens egna program eller DLL lär garanterat gå snabbare än att starta Perl eller PHP-tolkare.
Skillnaden är att tolkningen redan är gjord.
------------------
/mvh Swey
Programmera Php
swey@tjohoo.se
Peter_BMedlem sedan apr. 2000595 inlägg
Kan man inte ha nån process som körs jämt, och som servern sen kontaktar och som efter det hasplar ur sig sitt svar.. istället för att startas gång på gång?
SweyMedlem sedan apr. 20002 000 inlägg
ISAPI, om jag får be :)
PHP4 finns i ISAPI-version och att skapa en egen ISAPI-DLL i C++ är nog inte särskilt svårt.
Det är en DLL som laddas av IIS under uppstart och behöver därför inte laddas om.
------------------
/mvh Swey
Programmera Php
swey@tjohoo.se
Peter_BMedlem sedan apr. 2000595 inlägg
tja, nu spenderar jag inte så mycket tid med microsofts lösningar, gör allt för unix... :)
SweyMedlem sedan apr. 20002 000 inlägg
Hmm... skapa en Apache modul.
------------------
/mvh Swey
Programmera Php
swey@tjohoo.se
Peter_BMedlem sedan apr. 2000595 inlägg
Verkar jobbit det är.. ska kanske nöja mig med att köra en ny process varje gång... går det segt är det bara att uppgradera :)
RobbanMedlem sedan dec. 19992 272 inlägg
Swey skrev:
Att starta ens egna program eller DLL lär garanterat gå snabbare än att starta Perl eller PHP-tolkare.
Jo, jag skrev ju det (gäller dock inte PHP som körs som modul i Apache - går bra mycket snabbare än allt vad CGI heter). Dock inga astronomiska skillnader. Det man tjänar i utvecklingstid kan mycket väl överväga.
Och mod_perl sopar mattan med allt vad CGI heter. :)
Peter_B skrev:
Kan man inte ha nån process som körs jämt, ...
Jo, det kan man. Det är precis så mod_perl för Apache fungerar. Går blixtrande snabbt (blev själv uppriktigt förvånad över skillnaden).
Nackdelen blir att servern slukar ganska mycket mer minne.
------------------
Robban < robban@lipogram.com >
Peter_BMedlem sedan apr. 2000595 inlägg
måste man skriva om sina program eller är det bara att lämna allt precis som vanligt om man installerar mod_perl?
/Peter
RobbanMedlem sedan dec. 19992 272 inlägg
Tja, mod_perl kan köras i ett läge som försöker simulera "CGI-miljö", och där skall många script gå att köras direkt. Annars gäller att scripten måste vara strikt skrivna. Alla variabler måste deklareras o.s.v. Detta för att scriptet inte avslutas mellan varje körning, så man riskerar ha variabler m.m. som ligger kvar efter föregående körning.
Tycker dock själv detta bara är bra. Skriver mina script så att de fungerar under mod_perl för att tvinga mig själv att koda mer strikt. Men det krävs nog lite träning.
Massor av länkar som beskriver mod_perl hittar du via http://perl.apache.org/
------------------
Robban < robban@lipogram.com >
Peter_BMedlem sedan apr. 2000595 inlägg
okey.. tycker iofs att det är väldigt skönt att bara kunna dra till med en variabel när man behöver den... :).. samt alla andra små "fusk" man kan göra som förenklar allt..
... men istället för att skriva om ALLT, kan man göra så att nått enstaka script körs under mod_perl, eller är det så att säga allt eller inget? har några få script som står för c:a 95% av belastningen.. tänkte skriva om dom i c++, men kanske detta räcker för att få upp farten?
Peter Bredlöv
http://www.scorpiondata.com
RobbanMedlem sedan dec. 19992 272 inlägg
Som sagt, kör du i det läge som "simulerar" CGI-miljö så kan många script köras direkt (eventuellt med några små justeringar). Det går inte lika fort som om du använder mod_perl fullt ut, men det går ändå bra mycket snabbare än CGI.
------------------
Robban < robban@lipogram.com >