diff options
author | Shane Caraveo <shane@php.net> | 2001-08-20 05:00:05 +0000 |
---|---|---|
committer | Shane Caraveo <shane@php.net> | 2001-08-20 05:00:05 +0000 |
commit | 108633e1ab34d5dc324205898827906649e2faec (patch) | |
tree | c0934ede231fdd022510ca2351c4d814fa4e698e | |
parent | 22aed399e77c6a17cfddc18de1d0b1f8cf1ff76f (diff) | |
download | php-git-108633e1ab34d5dc324205898827906649e2faec.tar.gz |
Windows compilation of fast cgi now working. See windows.txt for info.
-rw-r--r-- | sapi/fastcgi/fastcgi.c | 66 | ||||
-rw-r--r-- | sapi/fastcgi/fastcgi.dsp | 108 | ||||
-rw-r--r-- | sapi/fastcgi/windows.txt | 35 |
3 files changed, 192 insertions, 17 deletions
diff --git a/sapi/fastcgi/fastcgi.c b/sapi/fastcgi/fastcgi.c index e0a3fe7384..80b5c3c204 100644 --- a/sapi/fastcgi/fastcgi.c +++ b/sapi/fastcgi/fastcgi.c @@ -49,7 +49,9 @@ #if HAVE_UNISTD_H #include <unistd.h> #endif +#ifndef PHP_WIN32 #include <sys/wait.h> +#endif #include <sys/stat.h> #if HAVE_SYS_TYPES_H @@ -59,10 +61,16 @@ #include <signal.h> #endif +#ifndef S_ISREG +#define S_ISREG(mode) ((mode) & _S_IFREG) +#endif + FCGX_Stream *in, *out, *err; FCGX_ParamArray envp; char *path_info = NULL; +#ifndef PHP_WIN32 struct sigaction act, old_term, old_quit, old_int; +#endif /* Our original environment from when the FastCGI first started */ char **orig_env; @@ -119,7 +127,7 @@ static void sapi_fastcgi_send_header(sapi_header_struct *sapi_header, void *serv static int sapi_fastcgi_read_post(char *buffer, uint count_bytes TSRMLS_DC) { - size_t read_bytes = 0, tmp; + size_t read_bytes = 0; int c; char *pos = buffer; @@ -141,21 +149,13 @@ static char *sapi_fastcgi_read_cookies(TSRMLS_D) static void sapi_fastcgi_register_variables(zval *track_vars_array TSRMLS_DC) { - char *self = getenv("REQUEST_URI"); - char *ptr = strchr( self, '?' ); - - /* - * note that the environment will already have been set up - * via fastcgi_module_main(), below. - * - * fastcgi_module_main() -> php_request_startup() -> - * php_hash_environment() -> php_import_environment_variables() + /* In CGI mode, we consider the environment to be a part of the server + * variables */ + php_import_environment_variables(track_vars_array TSRMLS_CC); - /* strip query string off this */ - if ( ptr ) *ptr = 0; - php_register_variable( "PHP_SELF", getenv("REQUEST_URI"), track_vars_array TSRMLS_CC); - if ( ptr ) *ptr = '?'; + /* Build the special-case PHP_SELF variable for the CGI version */ + php_register_variable("PHP_SELF", (SG(request_info).request_uri ? SG(request_info).request_uri:""), track_vars_array TSRMLS_CC); } @@ -194,12 +194,31 @@ static sapi_module_struct fastcgi_sapi_module = { static void fastcgi_module_main(TSRMLS_D) { zend_file_handle file_handle; + int c, retval = FAILURE; file_handle.type = ZEND_HANDLE_FILENAME; file_handle.filename = SG(request_info).path_translated; file_handle.free_filename = 0; file_handle.opened_path = NULL; + /* eat the bang line */ + if (SG(request_info).path_translated) { + retval = php_fopen_primary_script(&file_handle TSRMLS_CC); + } + + if (retval == SUCCESS) { + /* #!php support */ + c = fgetc(file_handle.handle.fp); + if (c == '#') { + while (c != 10 && c != 13) { + c = fgetc(file_handle.handle.fp); /* skip to end of line */ + } + CG(zend_lineno)++; + } else { + rewind(file_handle.handle.fp); + } + } + if (php_request_startup(TSRMLS_C) == SUCCESS) { php_execute_script(&file_handle TSRMLS_CC); php_request_shutdown(NULL); @@ -215,16 +234,23 @@ static void init_request_info( TSRMLS_D ) struct stat st; char *pi = getenv( "PATH_INFO" ); char *pt = getenv( "PATH_TRANSLATED" ); + if (!pt) { + pt = getenv("SCRIPT_FILENAME"); // apache mod_fastcgi sets this + } path_info = strdup( pi ); SG(request_info).request_method = getenv("REQUEST_METHOD"); SG(request_info).query_string = getenv("QUERY_STRING"); SG(request_info).request_uri = path_info; + if (!SG(request_info).request_uri) { + SG(request_info).request_uri = getenv("SCRIPT_NAME"); + } SG(request_info).content_type = ( content_type ? content_type : "" ); SG(request_info).content_length = (content_length?atoi(content_length):0); SG(sapi_headers).http_response_code = 200; SG(request_info).path_translated = pt; + if (!pt) return; /* * if the file doesn't exist, try to extract PATH_INFO out * of it by stat'ing back through the '/' @@ -291,16 +317,17 @@ void fastcgi_php_shutdown(void) */ void fastcgi_cleanup(int signal) { - int i; #ifdef DEBUG_FASTCGI fprintf( stderr, "FastCGI shutdown, pid %d\n", getpid() ); #endif +#ifndef PHP_WIN32 sigaction( SIGTERM, &old_term, 0 ); /* Kill all the processes in our process group */ kill( -pgroup, SIGTERM ); +#endif /* We should exit at this point, but MacOSX doesn't seem to */ exit( 0 ); @@ -310,15 +337,17 @@ void fastcgi_cleanup(int signal) int main(int argc, char *argv[]) { int exit_status = SUCCESS; +#ifndef PHP_WIN32 int c, i, len; zend_file_handle file_handle; char *s; + int status; +#endif char *argv0=NULL; char *script_file=NULL; zend_llist global_vars; int max_requests = 500; int requests = 0; - int status; int env_size, cgi_env_size; #ifdef DEBUG_FASTCGI @@ -355,7 +384,7 @@ int main(int argc, char *argv[]) 20000419 */ #endif #endif - + sapi_startup(&fastcgi_sapi_module); if (php_module_startup(&fastcgi_sapi_module)==FAILURE) { @@ -372,6 +401,7 @@ int main(int argc, char *argv[]) } } +#ifndef PHP_WIN32 /* Pre-fork, if required */ if( getenv( "PHP_FCGI_CHILDREN" )) { children = atoi( getenv( "PHP_FCGI_CHILDREN" )); @@ -446,6 +476,8 @@ int main(int argc, char *argv[]) } } +#endif /* WIN32 */ + /* Main FastCGI loop */ #ifdef DEBUG_FASTCGI fprintf( stderr, "Going into accept loop\n" ); diff --git a/sapi/fastcgi/fastcgi.dsp b/sapi/fastcgi/fastcgi.dsp new file mode 100644 index 0000000000..446e5373ef --- /dev/null +++ b/sapi/fastcgi/fastcgi.dsp @@ -0,0 +1,108 @@ +# Microsoft Developer Studio Project File - Name="fastcgi" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Console Application" 0x0103
+
+CFG=fastcgi - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "fastcgi.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "fastcgi.mak" CFG="fastcgi - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "fastcgi - Win32 Release" (based on "Win32 (x86) Console Application")
+!MESSAGE "fastcgi - Win32 Debug" (based on "Win32 (x86) Console Application")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "fastcgi - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "..\..\Release"
+# PROP Intermediate_Dir "..\..\Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\regex\\" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /I "fcgi\include" /D "NDEBUG" /D "_CONSOLE" /D ZEND_DEBUG=0 /D "MSVC5" /D "WIN32" /D "_MBCS" /D "ZEND_WIN32" /D "PHP_WIN32" /Fr /FD /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
+# ADD LINK32 php4nts.lib libfcgi.lib winmm.lib wsock32.lib netapi32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /version:4.0 /subsystem:console /machine:I386 /nodefaultlib:"libc.lib" /out:"..\..\Release/php-fcgi.exe" /libpath:"..\..\Release" /libpath:"fcgi\lib"
+
+!ELSEIF "$(CFG)" == "fastcgi - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "c:\php-fcgi"
+# PROP Intermediate_Dir "..\..\Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
+# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "..\.." /I "..\..\main" /I "..\..\Zend" /I "..\..\regex\\" /I "..\..\..\bindlib_w32" /I "..\..\TSRM" /I "fcgi\include" /D "DEBUG" /D "_DEBUG" /D "_CONSOLE" /D "MSVC5" /D "PHP_WIN32" /D ZEND_DEBUG=1 /D "ZEND_WIN32" /D "WIN32" /D "_MBCS" /FR /FD /GZ /c
+# SUBTRACT CPP /YX
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 winmm.lib wsock32.lib netapi32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib php4nts_debug.lib libfcgi.lib /nologo /version:4.0 /subsystem:console /debug /machine:I386 /nodefaultlib:"libcd" /nodefaultlib:"libcmt" /out:"c:\php-fcgi\php-fcgi.exe" /pdbtype:sept /libpath:"..\..\Debug" /libpath:"fcgi\lib"
+
+!ENDIF
+
+# Begin Target
+
+# Name "fastcgi - Win32 Release"
+# Name "fastcgi - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=.\fastcgi.c
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=.\php_fastcgi.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# End Target
+# End Project
diff --git a/sapi/fastcgi/windows.txt b/sapi/fastcgi/windows.txt new file mode 100644 index 0000000000..fc12b0aaba --- /dev/null +++ b/sapi/fastcgi/windows.txt @@ -0,0 +1,35 @@ +Windows support is currently experimental. + +Tested under IIS with cgi-fcgi.exe and Apache with mod_fastcgi. + +Compilation: +Currently only supports Non-Thread safe compilation, however, +that is realy all that is needed :) + +Get the devkit from www.fastcgi.com, build it. +Create the directories + php4/sapi/fastcgi/fcgi + php4/sapi/fastcgi/fcgi/include + php4/sapi/fastcgi/fcgi/lib +Place headers and libs in the include and lib directories. +Load the php.dsw, and compile. + +IIS configuration: + +Under the application configuration in the IIS configuration program, use: +.php C:\php-fcgi\cgi-fcgi.exe -connect php c:\php-fcgi\php-fcgi.exe + +Apache Configuration: + +LoadModule fastcgi_module modules/mod_fastcgi.dll +<IfModule mod_fastcgi.c> +AddHandler fastcgi-script fphp php +</IfModule> + +The scripts require the bang line as the first line +of the script to work with mod_fastcgi, +#!c:/php-fcgi/php-fcgi.exe + +TODO: +make 'thread-safe' compilation, though it isn't necessary. + |