Compare commits

..
Author SHA1 Message Date
SVN Migration 8d6817e7f1 This commit was manufactured by cvs2svn to create tag 'help'. 2002-03-13 18:39:43 +00:00
25 changed files with 1694 additions and 4823 deletions

No files matched your search

+5
View File
@@ -0,0 +1,5 @@
LTLIBRARY_NAME = libregex.la
LTLIBRARY_SOURCES = regcomp.c regexec.c regerror.c regfree.c
include $(top_srcdir)/build/ltlib.mk
-46
View File
@@ -1,46 +0,0 @@
dnl
dnl $Id$
dnl
PHP_ARG_WITH(interbase,for InterBase support,
[ --with-interbase[=DIR] Include InterBase support. DIR is the InterBase base
install directory, defaults to /usr/interbase])
if test "$PHP_INTERBASE" != "no"; then
if test "$PHP_INTERBASE" = "yes"; then
IBASE_INCDIR=/usr/interbase/include
IBASE_LIBDIR=/usr/interbase/lib
else
IBASE_INCDIR=$PHP_INTERBASE/include
IBASE_LIBDIR=$PHP_INTERBASE/lib
fi
PHP_CHECK_LIBRARY(fbclient, isc_detach_database,
[
IBASE_LIBNAME=fbclient
], [
PHP_CHECK_LIBRARY(gds, isc_detach_database,
[
IBASE_LIBNAME=gds
], [
PHP_CHECK_LIBRARY(ib_util, isc_detach_database,
[
IBASE_LIBNAME=ib_util
], [
AC_MSG_ERROR([libgds, libib_util or libfbclient not found! Check config.log for more information.])
], [
-L$IBASE_LIBDIR
])
], [
-L$IBASE_LIBDIR
])
], [
-L$IBASE_LIBDIR
])
PHP_ADD_LIBRARY_WITH_PATH($IBASE_LIBNAME, $IBASE_LIBDIR, INTERBASE_SHARED_LIBADD)
PHP_ADD_INCLUDE($IBASE_INCDIR)
AC_DEFINE(HAVE_IBASE,1,[ ])
PHP_NEW_EXTENSION(interbase, interbase.c, $ext_shared)
PHP_SUBST(INTERBASE_SHARED_LIBADD)
fi
-16
View File
@@ -1,16 +0,0 @@
// $Id$
// vim:ft=javascript
ARG_WITH("interbase", "InterBase support", "no");
if (PHP_INTERBASE != "no") {
if (CHECK_HEADER_ADD_INCLUDE("ibase.h", "CFLAGS_INTERBASE", PHP_PHP_BUILD + "\\interbase\\include;" + PHP_INTERBASE) &&
(CHECK_LIB("fbclient_ms.lib", "interbase", PHP_PHP_BUILD + "\\interbase\\lib_ms;" + PHP_INTERBASE) ||
CHECK_LIB("gds32_ms.lib", "interbase", PHP_PHP_BUILD + "\\interbase\\lib_ms;" + PHP_INTERBASE))) {
EXTENSION("interbase", "interbase.c");
AC_DEFINE('HAVE_IBASE', 1, 'Have interbase library');
} else {
WARNING("interbase not enabled; libraries and headers not found");
}
}
File diff suppressed because it is too large. Load diff
-219
View File
@@ -1,219 +0,0 @@
/*
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2004 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.0 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_0.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Authors: Jouni Ahto <jouni.ahto@exdec.fi> |
| Andrew Avdeev <andy@simgts.mv.ru> |
| Ard Biesheuvel <a.k.biesheuvel@its.tudelft.nl> |
+----------------------------------------------------------------------+
*/
/* $Id$ */
#ifndef PHP_INTERBASE_H
#define PHP_INTERBASE_H
#include <ibase.h>
extern zend_module_entry ibase_module_entry;
#define phpext_interbase_ptr &ibase_module_entry
PHP_MINIT_FUNCTION(ibase);
PHP_RINIT_FUNCTION(ibase);
PHP_MSHUTDOWN_FUNCTION(ibase);
PHP_RSHUTDOWN_FUNCTION(ibase);
PHP_MINFO_FUNCTION(ibase);
PHP_FUNCTION(ibase_connect);
PHP_FUNCTION(ibase_pconnect);
PHP_FUNCTION(ibase_close);
PHP_FUNCTION(ibase_drop_db);
PHP_FUNCTION(ibase_query);
PHP_FUNCTION(ibase_fetch_row);
PHP_FUNCTION(ibase_fetch_assoc);
PHP_FUNCTION(ibase_fetch_object);
PHP_FUNCTION(ibase_free_result);
PHP_FUNCTION(ibase_name_result);
PHP_FUNCTION(ibase_prepare);
PHP_FUNCTION(ibase_execute);
PHP_FUNCTION(ibase_free_query);
#if HAVE_STRFTIME
PHP_FUNCTION(ibase_timefmt);
#endif
PHP_FUNCTION(ibase_gen_id);
PHP_FUNCTION(ibase_num_fields);
PHP_FUNCTION(ibase_num_params);
#if abies_0
PHP_FUNCTION(ibase_num_rows);
#endif
PHP_FUNCTION(ibase_affected_rows);
PHP_FUNCTION(ibase_field_info);
PHP_FUNCTION(ibase_param_info);
PHP_FUNCTION(ibase_trans);
PHP_FUNCTION(ibase_commit);
PHP_FUNCTION(ibase_rollback);
PHP_FUNCTION(ibase_commit_ret);
PHP_FUNCTION(ibase_blob_create);
PHP_FUNCTION(ibase_blob_add);
PHP_FUNCTION(ibase_blob_cancel);
PHP_FUNCTION(ibase_blob_open);
PHP_FUNCTION(ibase_blob_get);
PHP_FUNCTION(ibase_blob_close);
PHP_FUNCTION(ibase_blob_echo);
PHP_FUNCTION(ibase_blob_info);
PHP_FUNCTION(ibase_blob_import);
#ifdef SQL_DIALECT_V6
PHP_FUNCTION(ibase_add_user);
PHP_FUNCTION(ibase_modify_user);
PHP_FUNCTION(ibase_delete_user);
PHP_FUNCTION(ibase_rollback_ret);
#endif
PHP_FUNCTION(ibase_errmsg);
PHP_FUNCTION(ibase_errcode);
PHP_FUNCTION(ibase_wait_event);
PHP_FUNCTION(ibase_set_event_handler);
PHP_FUNCTION(ibase_free_event_handler);
#define IBASE_MSGSIZE 256
#define MAX_ERRMSG (IBASE_MSGSIZE*2)
/* this value should never be > USHRT_MAX */
#define IBASE_BLOB_SEG 4096
ZEND_BEGIN_MODULE_GLOBALS(ibase)
ISC_STATUS status[20];
long default_link;
long num_links, num_persistent;
long max_links, max_persistent;
long allow_persistent;
char *default_user, *default_password;
char *timestampformat;
char *cfg_timestampformat;
char *dateformat;
char *cfg_dateformat;
char *timeformat;
char *cfg_timeformat;
char errmsg[MAX_ERRMSG];
long sql_code;
ZEND_END_MODULE_GLOBALS(ibase)
typedef struct {
isc_db_handle handle;
struct tr_list *tr_list;
unsigned short dialect;
} ibase_db_link;
typedef struct {
isc_tr_handle handle;
unsigned short link_cnt;
unsigned long affected_rows;
ibase_db_link *db_link[1]; /* last member */
} ibase_trans;
typedef struct tr_list {
ibase_trans *trans;
struct tr_list *next;
} ibase_tr_list;
typedef struct {
ISC_ARRAY_DESC ar_desc;
ISC_LONG ar_size; /* size of entire array in bytes */
unsigned short el_type, el_size;
} ibase_array;
typedef struct {
isc_blob_handle bl_handle;
ISC_QUAD bl_qd;
unsigned short type;
} ibase_blob;
typedef struct {
ibase_db_link *link;
ibase_trans *trans;
isc_stmt_handle stmt;
unsigned short type;
unsigned char has_more_rows, statement_type;
XSQLDA *out_sqlda;
ibase_array out_array[1]; /* last member */
} ibase_result;
typedef struct {
ibase_db_link *link;
ibase_trans *trans;
int result_res_id;
isc_stmt_handle stmt;
XSQLDA *in_sqlda, *out_sqlda;
ibase_array *in_array, *out_array;
unsigned short dialect;
char statement_type;
char *query;
long trans_res_id;
} ibase_query;
typedef struct {
ibase_db_link *link;
long link_res_id;
ISC_LONG event_id;
unsigned short event_count;
char **events;
char *event_buffer, *result_buffer;
zval *callback;
void **thread_ctx;
} ibase_event;
enum php_interbase_option {
PHP_IBASE_DEFAULT = 0,
/* fetch flags */
PHP_IBASE_FETCH_BLOBS = 1,
PHP_IBASE_FETCH_ARRAYS = 2,
PHP_IBASE_UNIXTIME = 4,
/* timefmt flags */
PHP_IBASE_TIMESTAMP = 1,
PHP_IBASE_DATE = 2,
PHP_IBASE_TIME = 4,
/* transaction access mode */
PHP_IBASE_WRITE = 1,
PHP_IBASE_READ = 2,
/* transaction isolation level */
PHP_IBASE_CONCURRENCY = 4,
PHP_IBASE_COMMITTED = 8,
PHP_IBASE_REC_NO_VERSION = 32,
PHP_IBASE_REC_VERSION = 64,
PHP_IBASE_CONSISTENCY = 16,
/* transaction lock resolution */
PHP_IBASE_WAIT = 128,
PHP_IBASE_NOWAIT = 256
};
#ifdef ZTS
#define IBG(v) TSRMG(ibase_globals_id, zend_ibase_globals *, v)
#else
#define IBG(v) (ibase_globals.v)
#endif
#else
#define phpext_interbase_ptr NULL
#endif /* PHP_INTERBASE_H */
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
+5
View File
@@ -0,0 +1,5 @@
LTLIBRARY_NAME = libregex.la
LTLIBRARY_SOURCES = regcomp.c regexec.c regerror.c regfree.c
include $(top_srcdir)/build/ltlib.mk
+142
View File
@@ -0,0 +1,142 @@
# Microsoft Developer Studio Project File - Name="php4apache2" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
CFG=php4apache2 - Win32 Debug_TS
!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 "php4apache2.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 "php4apache2.mak" CFG="php4apache2 - Win32 Debug_TS"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "php4apache2 - Win32 Release_TS" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "php4apache2 - Win32 Release_TS_inline" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE "php4apache2 - Win32 Debug_TS" (based on "Win32 (x86) Dynamic-Link Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
MTL=midl.exe
RSC=rc.exe
!IF "$(CFG)" == "php4apache2 - Win32 Release_TS"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release_TS"
# PROP BASE Intermediate_Dir "Release_TS"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release_TS"
# PROP Intermediate_Dir "Release_TS"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PHP4APACHE2_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /I "...\..\include" /I "..\..\win32" /I "..\..\Zend" /I "..\.." /I "..\..\..\bindlib_w32" /I "..\..\main" /I "..\..\TSRM" /D ZEND_DEBUG=0 /D "NDEBUG" /D "ZTS" /D "ZEND_WIN32" /D "PHP_WIN32" /D "_WINDOWS" /D "_USRDLL" /D "WIN32" /D "_MBCS" /D "_WINSOCK2API_" /D "_MSWSOCK_" /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "NDEBUG"
# ADD RSC /l 0x407 /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 /nologo /dll /machine:I386
# ADD LINK32 php4ts.lib libhttpd.lib libapr.lib libaprutil.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 /dll /machine:I386 /libpath:"..\..\Release_TS" /libpath:"..\..\TSRM\Release_TS" /libpath:"..\..\Zend\Release_TS"
!ELSEIF "$(CFG)" == "php4apache2 - Win32 Release_TS_inline"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release_TS_inline"
# PROP BASE Intermediate_Dir "Release_TS_inline"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release_TS_inline"
# PROP Intermediate_Dir "Release_TS_inline"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PHP4APACHE2_EXPORTS" /YX /FD /c
# ADD CPP /nologo /MD /W3 /GX /O2 /I "...\..\include" /I "..\..\win32" /I "..\..\Zend" /I "..\.." /I "..\..\..\bindlib_w32" /I "..\..\main" /I "..\..\TSRM" /D ZEND_DEBUG=0 /D "ZEND_WIN32_FORCE_INLINE" /D "NDEBUG" /D "ZTS" /D "ZEND_WIN32" /D "PHP_WIN32" /D "_WINDOWS" /D "_USRDLL" /D "WIN32" /D "_MBCS" /D "_WINSOCK2API_" /D "_MSWSOCK_" /YX /FD /c
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "NDEBUG"
# ADD RSC /l 0x407 /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 /nologo /dll /machine:I386
# ADD LINK32 php4ts.lib libhttpd.lib libapr.lib libaprutil.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 /dll /machine:I386 /out:"..\..\Release_TS_inline/php4apache2.dll" /libpath:"..\..\Release_TS_inline" /libpath:"..\..\TSRM\Release_TS_inline" /libpath:"..\..\Zend\Release_TS_inline"
!ELSEIF "$(CFG)" == "php4apache2 - Win32 Debug_TS"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug_TS"
# PROP BASE Intermediate_Dir "Debug_TS"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug_TS"
# PROP Intermediate_Dir "Debug_TS"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "PHP4APACHE2_EXPORTS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "...\..\include" /I "..\..\win32" /I "..\..\Zend" /I "..\.." /I "..\..\..\bindlib_w32" /I "..\..\main" /I "..\..\TSRM" /D "_DEBUG" /D ZEND_DEBUG=1 /D "ZTS" /D "ZEND_WIN32" /D "PHP_WIN32" /D "_WINDOWS" /D "_USRDLL" /D "WIN32" /D "_MBCS" /D "_WINSOCK2API_" /D "_MSWSOCK_" /YX /FD /GZ /c
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
# ADD BASE RSC /l 0x407 /d "_DEBUG"
# ADD RSC /l 0x407 /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 /nologo /dll /debug /machine:I386 /pdbtype:sept
# ADD LINK32 php4ts.lib libhttpd.lib libapr.lib libaprutil.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 /dll /debug /machine:I386 /pdbtype:sept /libpath:"..\..\Debug_TS" /libpath:"..\..\TSRM\Debug_TS" /libpath:"..\..\Zend\Debug_TS"
!ENDIF
# Begin Target
# Name "php4apache2 - Win32 Release_TS"
# Name "php4apache2 - Win32 Release_TS_inline"
# Name "php4apache2 - Win32 Debug_TS"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\apache_config.c
# End Source File
# Begin Source File
SOURCE=.\php_functions.c
# End Source File
# Begin Source File
SOURCE=.\sapi_apache2.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=.\php_apache.h
# End Source File
# End Group
# End Target
# End Project
+99
View File
@@ -0,0 +1,99 @@
dnl
dnl $Id$
dnl
AC_DEFUN(PHP_TEST_WRITE_STDOUT,[
AC_CACHE_CHECK(whether writing to stdout works,ac_cv_write_stdout,[
AC_TRY_RUN([
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#define TEXT "This is the test message -- "
main()
{
int n;
n = write(1, TEXT, sizeof(TEXT)-1);
return (!(n == sizeof(TEXT)-1));
}
],[
ac_cv_write_stdout=yes
],[
ac_cv_write_stdout=no
],[
ac_cv_write_stdout=no
])
])
if test "$ac_cv_write_stdout" = "yes"; then
AC_DEFINE(PHP_WRITE_STDOUT, 1, [whether write(2) works])
fi
])
if test "$PHP_SAPI" = "default"; then
PHP_TEST_WRITE_STDOUT
PHP_ARG_ENABLE(force-cgi-redirect,whether to force Apache CGI redirect,
[ --enable-force-cgi-redirect
Enable the security check for internal server
redirects. You should use this if you are
running the CGI version with Apache. ])
if test "$PHP_FORCE_CGI_REDIRECT" = "yes"; then
REDIRECT=1
else
REDIRECT=0
fi
AC_DEFINE_UNQUOTED(FORCE_CGI_REDIRECT,$REDIRECT,[ ])
PHP_ARG_ENABLE(discard-path,whether to discard path_info + path_translated,
[ --enable-discard-path If this is enabled, the PHP CGI binary
can safely be placed outside of the
web tree and people will not be able
to circumvent .htaccess security. ])
if test "$PHP_DISCARD_PATH" = "yes"; then
DISCARD_PATH=1
else
DISCARD_PATH=0
fi
AC_DEFINE_UNQUOTED(DISCARD_PATH, $DISCARD_PATH, [ ])
INSTALL_IT="\$(INSTALL) -m 0755 $SAPI_PROGRAM \$(INSTALL_ROOT)\$(bindir)/php-cgi"
fi
AC_MSG_CHECKING(for fhttpd module support)
AC_ARG_WITH(fhttpd,
[ --with-fhttpd[=DIR] Build fhttpd module. DIR is the fhttpd sources
directory, defaults to /usr/local/src/fhttpd.],
[
if test "$withval" = "yes"; then
# fhttpd source directory
withval=/usr/local/src/fhttpd
fi
if test "$withval" != "no"; then
# For fhttpd 0.3.x
if test -f $withval/servproc.h; then
FHTTPD_INCLUDE=-I$withval/
FHTTPD_LIB=$withval/servproc.o
FHTTPD_TARGET=$withval/
PHP_BUILD_STATIC
PHP_SAPI=cgi
AC_DEFINE(FHTTPD,1,[ ])
AC_MSG_RESULT(yes - fhttpd 0.3.x)
else
AC_MSG_RESULT(no)
AC_MSG_ERROR(Invalid fhttpd directory - unable to find servproc.h under $withval)
fi
else
AC_MSG_RESULT(no)
fi
],[
AC_MSG_RESULT(no)
])
INCLUDES="$INCLUDES $FHTTPD_INCLUDE"
dnl## AC_SUBST(FHTTPD_INCLUDE)
PHP_SUBST(FHTTPD_LIB)
PHP_SUBST(FHTTPD_TARGET)
+4
View File
@@ -0,0 +1,4 @@
fastcgi
Ben Mansell
Stephen Landamore
Daniel Silverstone
+53
View File
@@ -0,0 +1,53 @@
Using FastCGI PHP with Apache
=============================
First of all, you may well ask 'Why?'. After all, Apache already has mod_php.
However, there are advantages to running PHP with FastCGI. Separating the
PHP code from the web server removes 'bloat' from the main server, and should
improve the performance of non-PHP requests. Secondly, having one permanent
PHP process as opposed to one per apache process means that shared resources
like persistent database connections are used more efficiently.
First of all, make sure that the FastCGI module is enabled. You should have
a line in your config like:
LoadModule fastcgi_module /usr/lib/apache/1.3/mod_fastcgi.so
Don't load mod_php, by the way. Make sure it is commented out!
#LoadModule php4_module /usr/lib/apache/1.3/libphp4.so
Now, we'll create a fcgi-bin directory, just like you would do with normal
CGI scripts. You'll need to create a directory somewhere to store your
FastCGI binaries. We'll use /space/fcgi-bin/ for this example. Remember to
copy the FastCGI-PHP binary in there. (named just 'php')
ScriptAlias /fcgi-bin/ /space/fcgi-bin/
<Location /fcgi-bin/>
SetHandler fastcgi-script
</Location>
Next, we need to tell Apache to use the FastCGI binary /fcgi-bin/php to
deliver PHP pages. All that is needed is:
AddType application/x-httpd-php .php
Action application/x-httpd-php /fcgi-bin/php
Now, if you restart Apache, php pages should now be delivered!
Running PHP-FastCGI separately from the webserver
-------------------------------------------------
(Read README.FastCGI for why you might want to do this).
Easy! Add one more configuration line:
FastCgiExternalServer /space/fcgi-bin/php -host localhost:8002
Then, start the PHP off with the following command:
/space/fcgi-bin/php 8002
The number 8002 is the port that PHP will listen on for requests - change this
to anything suitable. And be sure to firewall it out so that external
connections are denied!
+91
View File
@@ -0,0 +1,91 @@
FastCGI module
--------------
This module requires the FastCGI development kit, available from
http://www.fastcgi.com/
Before building PHP, please enter the dev kit, and run:
./configure
make
make export
This will compile the library code required for the FastCGI module. All
that is then required is to configure PHP with the '--with-fastcgi' option.
After making the code, you will end up with a binary file called 'php'.
Installation of this file will depend on the web server being used, please
see their documentation for details.
Running the FastCGI PHP module
------------------------------
There are two ways to run the resulting 'php' binary after the fastcgi
version has been built:
1) Configure your web server to run the PHP binary itself.
This is the simplest method, obviously you will have to configure your
web server appropriately. Some web servers may also not support this method,
or may not be as efficient.
2) Run PHP separately from the web server.
In this setup, PHP is started as a separate process entirely from the web
server. It will listen on a socket for new FastCGI requests, and deliver
PHP pages as appropriate. This is the recommended way of running PHP-FastCGI.
To run this way, you must start the PHP binary running by giving it a port
number to listen to on the command line, e.g.:
./php 8002
(you can also specify a bind address, e.g. ./php localhost:8002. However, this
relies on the FastCGI devkit and does not seem to work properly)
You must also configure your web server to connect to the appropriate port
in order to talk to the PHP FastCGI process.
The advantage of running PHP in this way is that it entirely separates the
web server and PHP process, so that one cannot disrupt the other. It also
allows PHP to be on an entirely separate machine from the web server if need
be, you could even have several web servers utilising the same running PHP
process if required!
Security
--------
Be sure to run the php binary as an appropriate userid. Also, firewall out
the port that PHP is listening on. In addition, you can set the environment
variable FCGI_WEB_SERVER_ADDRS to control who can connect to the FastCGI.
Set it to a comma separated list of IP addresses, e.g.:
export FCGI_WEB_SERVER_ADDRS=199.170.183.28,199.170.183.71
Tuning
------
There are a few tuning parameters that can be tweaked to control the
performance of FastCGI PHP. The following are environment variables that can
be set before running the PHP binary:
PHP_FCGI_CHILDREN (default value: 8)
This controls how many child processes the PHP process spawns. When the
fastcgi starts, it creates a number of child processes which handle one
page request at a time. So by default, you will be able to handle 8
concurrent PHP page requests. Further requests will be queued.
Increasing this number will allow for better concurrency, especially if you
have pages that take a significant time to create, or supply a lot of data
(e.g. downloading huge files via PHP). On the other hand, having more
processes running will use more RAM, and letting too many PHP pages be
generated concurrently will mean that each request will be slow.
PHP_FCGI_MAX_REQUESTS (default value: 500)
This controls how many requests each child process will handle before
exitting. When one process exits, another will be created. This tuning is
necessary because several PHP functions are known to have memory leaks. If the
PHP processes were left around forever, they would be become very inefficient.
+26
View File
@@ -0,0 +1,26 @@
dnl
dnl $Id$
dnl
AC_MSG_CHECKING(for FastCGI support)
AC_ARG_WITH(fastcgi,
[ --with-fastcgi=SRCDIR Build PHP as FastCGI application],[
if test "$withval" = "yes"; then
FASTCGIPATH=/usr/local
else
FASTCGIPATH=$withval
fi
test -f "$FASTCGIPATH/lib/libfcgi.a" || AC_MSG_ERROR(Unable to find libfcgi.a in $FASTCGIPATH/lib)
test -f "$FASTCGIPATH/include/fastcgi.h" || AC_MSG_ERROR(Unable to find fastcgi.h in $FASTCGIPATH/include)
PHP_SELECT_SAPI(fastcgi, programm, fastcgi.c)
PHP_LIBS=$FASTCGIPATH/lib/libfcgi.a
PHP_ADD_INCLUDE($FASTCGIPATH/include)
EXT_PROGRAM_LDADD="$EXT_PROGRAM_LDADD $FASTCGIPATH/lib/libfcgi.a"
INSTALL_IT="\$(INSTALL) -m 0755 $SAPI_PROGRAM \$(bindir)/$SAPI_FASTCGI"
RESULT=yes
PHP_SUBST(FASTCGI_LIBADD)
PHP_SUBST(EXT_PROGRAM_LDADD)
],[
RESULT=no
])
AC_MSG_RESULT($RESULT)
+609
View File
@@ -0,0 +1,609 @@
/*
+----------------------------------------------------------------------+
| PHP Version 4 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2002 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 2.02 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.php.net/license/2_02.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Ben Mansell <php@slimyhorror.com> |
+----------------------------------------------------------------------+
*/
/* Debugging */
/* #define DEBUG_FASTCGI 1 */
/* Two configurables for the FastCGI runner.
*
* PHP_FCGI_CHILDREN - if set, the FastCGI will pre-fork this many processes
* which will accept requests.
*
* PHP_FCGI_MAX_REQUESTS - if set, the runner will kill itself after handling
* the given number of requests. This is to curb any
* memory leaks in PHP.
*/
/* The following code is based mainly on the thttpd sapi and the original
* CGI code, no doubt with many new and interesting bugs created... :)
*/
#include "php.h"
#include "SAPI.h"
#include "php_main.h"
#include "php_fastcgi.h"
#include "php_variables.h"
#include "fcgi_config.h"
#include "fcgiapp.h"
#include <stdio.h>
#if HAVE_STDLIB_H
#include <stdlib.h>
#endif
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef PHP_WIN32
#include <io.h>
#include <fcntl.h>
#include "win32/php_registry.h"
#else
#include <sys/wait.h>
#endif
#include <sys/stat.h>
#if HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#if HAVE_SIGNAL_H
#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;
/* The environment given by the FastCGI */
char **cgi_env;
/* The manufactured environment, from merging the base environ with
* the parameters set by the per-connection environment
*/
char **merge_env;
/**
* Number of child processes that will get created to service requests
*/
static int children = 8;
/**
* Set to non-zero if we are the parent process
*/
static int parent = 1;
/**
* Process group
*/
static pid_t pgroup;
static int sapi_fastcgi_ub_write(const char *str, uint str_length TSRMLS_DC)
{
uint sent = FCGX_PutStr( str, str_length, out );
return sent;
}
static void sapi_fastcgi_flush( void *server_context )
{
if( FCGX_FFlush( out ) == -1 ) {
php_handle_aborted_connection();
}
}
static void sapi_fastcgi_send_header(sapi_header_struct *sapi_header, void *server_context TSRMLS_DC)
{
if( sapi_header ) {
#ifdef DEBUG_FASTCGI
fprintf( stderr, "Header: %s\n", sapi_header->header );
#endif
FCGX_PutStr( sapi_header->header, sapi_header->header_len, out );
}
FCGX_PutStr( "\r\n", 2, out );
}
static int sapi_fastcgi_read_post(char *buffer, uint count_bytes TSRMLS_DC)
{
size_t read_bytes = 0;
int c;
char *pos = buffer;
while( count_bytes ) {
c = FCGX_GetStr( pos, count_bytes, in );
read_bytes += c;
count_bytes -= c;
pos += c;
if( !c ) break;
}
return read_bytes;
}
static char *sapi_fastcgi_read_cookies(TSRMLS_D)
{
return getenv( "HTTP_COOKIE" );
}
static void sapi_fastcgi_register_variables(zval *track_vars_array TSRMLS_DC)
{
/* In CGI mode, we consider the environment to be a part of the server
* variables
*/
php_import_environment_variables(track_vars_array TSRMLS_CC);
/* 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);
}
static void sapi_fastcgi_log_message(char *message)
{
#ifdef DEBUG_FASTCGI
fprintf( stderr, "Log Message: %s\n", message );
#endif
FCGX_FPrintF(err, "%s\n", message);
}
static sapi_module_struct fastcgi_sapi_module = {
"fastcgi",
"FastCGI",
php_module_startup,
php_module_shutdown_wrapper,
NULL, /* activate */
NULL, /* deactivate */
sapi_fastcgi_ub_write,
sapi_fastcgi_flush,
NULL, /* get uid */
NULL, /* getenv */
php_error,
NULL,
NULL,
sapi_fastcgi_send_header,
sapi_fastcgi_read_post,
sapi_fastcgi_read_cookies,
sapi_fastcgi_register_variables,
sapi_fastcgi_log_message,
NULL, /* Block interruptions */
NULL, /* Unblock interruptions */
STANDARD_SAPI_MODULE_PROPERTIES
};
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);
}
}
static int init_request_info( TSRMLS_D )
{
char *content_length = getenv("CONTENT_LENGTH");
char *content_type = getenv( "CONTENT_TYPE" );
const char *auth;
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 -1;
/*
* if the file doesn't exist, try to extract PATH_INFO out
* of it by stat'ing back through the '/'
*/
if ( stat( pt, &st ) == -1 ) {
int len = strlen(pt);
char *ptr;
while( ptr = strrchr(pt,'/') ) {
*ptr = 0;
if ( stat(pt, &st) == 0 && S_ISREG(st.st_mode) ) {
/*
* okay, we found the base script!
* work out how many chars we had to strip off;
* then we can modify PATH_INFO
* accordingly
*/
int slen = len - strlen(pt);
if ( pi ) {
int pilen = strlen( pi );
strcpy( pi, pi + pilen - slen );
}
break;
}
}
/*
* if we stripped out all the '/' and still didn't find
* a valid path... we will fail, badly. of course we would
* have failed anyway... is there a nice way to error?
*/
} else {
/* the first stat succeeded... */
if ( pi ) *pi = 0;
}
/* The CGI RFC allows servers to pass on unvalidated Authorization data */
auth = getenv("HTTP_AUTHORIZATION");
#ifdef DEBUG_FASTCGI
fprintf( stderr, "Authorization: %s\n", auth );
#endif
php_handle_auth_data(auth TSRMLS_CC);
return 0;
}
void fastcgi_php_init(void)
{
TSRMLS_FETCH();
sapi_startup(&fastcgi_sapi_module);
fastcgi_sapi_module.startup(&fastcgi_sapi_module);
SG(server_context) = (void *) 1;
}
void fastcgi_php_shutdown(void)
{
TSRMLS_FETCH();
if (SG(server_context) != NULL) {
fastcgi_sapi_module.shutdown(&fastcgi_sapi_module);
sapi_shutdown();
}
}
/**
* Clean up child processes upon exit
*/
void fastcgi_cleanup(int signal)
{
#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 );
}
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 fcgi_fd = 0;
int env_size, cgi_env_size;
FCGX_Request request;
#ifdef ZTS
zend_compiler_globals *compiler_globals;
zend_executor_globals *executor_globals;
php_core_globals *core_globals;
sapi_globals_struct *sapi_globals;
void ***tsrm_ls;
#endif
#ifdef DEBUG_FASTCGI
fprintf( stderr, "Initialising now, pid %d!\n", getpid() );
#endif
if( FCGX_IsCGI() ) {
/* Did a bind address or port get configured on the command line? */
if( argc >= 2 ) {
/* Pass on the arg to the FastCGI library, with one exception.
* If just a port is specified, then we prepend a ':' onto the
* path (it's what the fastcgi library expects)
*/
int port = atoi( argv[ 1 ] );
if( port ) {
char bindport[ 32 ];
snprintf( bindport, 32, ":%s", argv[ 1 ] );
fcgi_fd = FCGX_OpenSocket( bindport, 128 );
} else {
fcgi_fd = FCGX_OpenSocket( argv[ 1 ], 128 );
}
if( fcgi_fd < 0 ) {
fprintf( stderr, "Couldn't create FastCGI listen socket\n" );
exit( 1 );
}
} else {
fprintf( stderr, "The FastCGI version of PHP cannot be "
"run as a CGI application\n" );
exit( 1 );
}
}
/* Calculate environment size */
env_size = 0;
while( environ[ env_size ] ) { env_size++; }
/* Also include the final NULL pointer */
env_size++;
/* Allocate for our environment */
orig_env = malloc( env_size * sizeof( char *));
if( !orig_env ) {
perror( "Can't malloc environment" );
exit( 1 );
}
memcpy( orig_env, environ, env_size * sizeof( char *));
#ifdef HAVE_SIGNAL_H
#if defined(SIGPIPE) && defined(SIG_IGN)
signal(SIGPIPE, SIG_IGN); /* ignore SIGPIPE in standalone mode so
that sockets created via fsockopen()
don't kill PHP if the remote site
closes it. in apache|apxs mode apache
does that for us! thies@thieso.net
20000419 */
#endif
#endif
#ifdef ZTS
tsrm_startup(1, 1, 0, NULL);
#endif
sapi_startup(&fastcgi_sapi_module);
#ifdef PHP_WIN32
_fmode = _O_BINARY; /*sets default for file streams to binary */
setmode(_fileno(stdin), O_BINARY); /* make the stdio mode be binary */
setmode(_fileno(stdout), O_BINARY); /* make the stdio mode be binary */
setmode(_fileno(stderr), O_BINARY); /* make the stdio mode be binary */
#endif
if (php_module_startup(&fastcgi_sapi_module)==FAILURE) {
return FAILURE;
}
#ifdef ZTS
compiler_globals = ts_resource(compiler_globals_id);
executor_globals = ts_resource(executor_globals_id);
core_globals = ts_resource(core_globals_id);
sapi_globals = ts_resource(sapi_globals_id);
tsrm_ls = ts_resource(0);
#endif
/* How many times to run PHP scripts before dying */
if( getenv( "PHP_FCGI_MAX_REQUESTS" )) {
max_requests = atoi( getenv( "PHP_FCGI_MAX_REQUESTS" ));
if( !max_requests ) {
fprintf( stderr,
"PHP_FCGI_MAX_REQUESTS is not valid\n" );
exit( 1 );
}
}
#ifndef PHP_WIN32
/* Pre-fork, if required */
if( getenv( "PHP_FCGI_CHILDREN" )) {
children = atoi( getenv( "PHP_FCGI_CHILDREN" ));
if( !children ) {
fprintf( stderr,
"PHP_FCGI_CHILDREN is not valid\n" );
exit( 1 );
}
}
/* Initialise FastCGI request structure */
FCGX_Init();
FCGX_InitRequest( &request, fcgi_fd, 0 );
if( children ) {
int running = 0;
int i;
pid_t pid;
/* Create a process group for ourself & children */
setsid();
pgroup = getpgrp();
#ifdef DEBUG_FASTCGI
fprintf( stderr, "Process group %d\n", pgroup );
#endif
/* Set up handler to kill children upon exit */
act.sa_flags = 0;
act.sa_handler = fastcgi_cleanup;
if( sigaction( SIGTERM, &act, &old_term ) ||
sigaction( SIGINT, &act, &old_int ) ||
sigaction( SIGQUIT, &act, &old_quit )) {
perror( "Can't set signals" );
exit( 1 );
}
while( parent ) {
do {
#ifdef DEBUG_FASTCGI
fprintf( stderr, "Forking, %d running\n",
running );
#endif
pid = fork();
switch( pid ) {
case 0:
/* One of the children.
* Make sure we don't go round the
* fork loop any more
*/
parent = 0;
/* don't catch our signals */
sigaction( SIGTERM, &old_term, 0 );
sigaction( SIGQUIT, &old_quit, 0 );
sigaction( SIGINT, &old_int, 0 );
break;
case -1:
perror( "php (pre-forking)" );
exit( 1 );
break;
default:
/* Fine */
running++;
break;
}
} while( parent && ( running < children ));
if( parent ) {
#ifdef DEBUG_FASTCGI
fprintf( stderr, "Wait for kids, pid %d\n",
getpid() );
#endif
wait( &status );
running--;
}
}
}
#endif /* WIN32 */
/* Main FastCGI loop */
#ifdef DEBUG_FASTCGI
fprintf( stderr, "Going into accept loop\n" );
#endif
while( FCGX_Accept_r( &request ) >= 0 ) {
#ifdef DEBUG_FASTCGI
fprintf( stderr, "Got accept\n" );
#endif
in = request.in;
out = request.out;
err = request.err;
cgi_env = request.envp;
cgi_env_size = 0;
while( cgi_env[ cgi_env_size ] ) { cgi_env_size++; }
merge_env = malloc( (env_size+cgi_env_size)*sizeof(char*) );
if( !merge_env ) {
perror( "Can't malloc environment" );
exit( 1 );
}
memcpy( merge_env, orig_env, (env_size-1)*sizeof(char *) );
memcpy( merge_env + env_size - 1,
cgi_env, (cgi_env_size+1)*sizeof(char *) );
environ = merge_env;
if (init_request_info(TSRMLS_C)!=0) {
/* we received some invalid environment */
//char *b = "Can't init the request\n";
//sapi_fastcgi_ub_write(b, strlen(b) TSRMLS_C);
//FCGX_Finish();
//break;
}
SG(server_context) = (void *) 1; /* avoid server_context==NULL checks */
SG(request_info).argv0 = argv0;
zend_llist_init(&global_vars, sizeof(char *), NULL, 0);
fastcgi_module_main(TSRMLS_C);
if( path_info ) {
free( path_info );
path_info = NULL;
}
/* TODO: We should free our environment here, but
* some platforms are unhappy if they've altered our
* existing environment and we then free() the new
* environ pointer
*/
requests++;
if( max_requests && ( requests == max_requests )) {
FCGX_Finish();
break;
}
}
#ifdef ZTS
tsrm_shutdown();
#endif
#ifdef DEBUG_FASTCGI
fprintf( stderr, "Exiting...\n" );
#endif
return 0;
}
+195
View File
@@ -0,0 +1,195 @@
# 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_TS
!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_TS"
!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 "fastcgi - Win32 Debug_TS" (based on "Win32 (x86) Console Application")
!MESSAGE "fastcgi - Win32 Release_TS" (based on "Win32 (x86) Console Application")
!MESSAGE "fastcgi - Win32 Release_TS_inline" (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/phpfcgi.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 "Debug"
# 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 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 php4nts_debug.lib /nologo /version:4.0 /subsystem:console /debug /machine:I386 /nodefaultlib:"libcd" /nodefaultlib:"libcmt" /out:"..\Debug\phpfcgi.exe" /pdbtype:sept /libpath:"..\..\Debug" /libpath:"fcgi\lib"
!ELSEIF "$(CFG)" == "fastcgi - Win32 Debug_TS"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "fastcgi___Win32_Debug_TS"
# PROP BASE Intermediate_Dir "fastcgi___Win32_Debug_TS"
# PROP BASE Ignore_Export_Lib 0
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug_TS"
# PROP Intermediate_Dir "Debug_TS"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE 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 BASE CPP /YX
# 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 "ZTS" /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 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 php4nts_debug.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"
# ADD LINK32 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 php4ts_debug.lib /nologo /version:4.0 /subsystem:console /debug /machine:I386 /nodefaultlib:"libcd" /nodefaultlib:"libcmt" /out:"..\..\Debug_TS\phpfcgi.exe" /pdbtype:sept /libpath:"..\..\Debug_TS" /libpath:"fcgi\lib"
!ELSEIF "$(CFG)" == "fastcgi - Win32 Release_TS"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "fastcgi___Win32_Release_TS"
# PROP BASE Intermediate_Dir "fastcgi___Win32_Release_TS"
# PROP BASE Ignore_Export_Lib 0
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release_TS"
# PROP Intermediate_Dir "Release_TS"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE 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 BASE CPP /YX
# 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" /D "ZTS" /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 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"
# ADD LINK32 php4ts.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_TS/phpfcgi.exe" /libpath:"..\..\Release_TS" /libpath:"fcgi\lib"
!ELSEIF "$(CFG)" == "fastcgi - Win32 Release_TS_inline"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "fastcgi___Win32_Release_TS_inline"
# PROP BASE Intermediate_Dir "fastcgi___Win32_Release_TS_inline"
# PROP BASE Ignore_Export_Lib 0
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release_TS_inline"
# PROP Intermediate_Dir "Release_TS_inline"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE 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" /D "ZTS" /Fr /FD /c
# SUBTRACT BASE CPP /YX
# 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_WIN32_FORCE_INLINE" /D ZEND_DEBUG=0 /D "MSVC5" /D "WIN32" /D "_MBCS" /D "ZEND_WIN32" /D "PHP_WIN32" /D "ZTS" /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 php4ts.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_TS/phpfcgi.exe" /libpath:"..\..\Release_TS" /libpath:"fcgi\lib"
# ADD LINK32 php4ts.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_TS_inline/phpfcgi.exe" /libpath:"..\..\Release_TS_inline" /libpath:"fcgi\lib"
!ENDIF
# Begin Target
# Name "fastcgi - Win32 Release"
# Name "fastcgi - Win32 Debug"
# Name "fastcgi - Win32 Debug_TS"
# Name "fastcgi - Win32 Release_TS"
# Name "fastcgi - Win32 Release_TS_inline"
# 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
View File
Whitespace-only changes.
+28
View File
@@ -0,0 +1,28 @@
/*
+----------------------------------------------------------------------+
| PHP Version 4 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2002 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 2.02 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.php.net/license/2_02.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Sascha Schumann <sascha@schumann.cx> |
+----------------------------------------------------------------------+
*/
#ifndef PHP_FASTCGI_H
#define PHP_FASTCGI_H
#include <sys/types.h>
#include <sys/stat.h>
void fastcgi_php_shutdown(void);
void fastcgi_php_init(void);
#endif
+35
View File
@@ -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.
+2
View File
@@ -0,0 +1,2 @@
fhttpd
Alex Belits
+185
View File
@@ -0,0 +1,185 @@
/*
+----------------------------------------------------------------------+
| PHP Version 4 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2002 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 2.02 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available at through the world-wide-web at |
| http://www.php.net/license/2_02.txt. |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Alex Belits <abelits@phobos.illtel.denver.co.us> |
+----------------------------------------------------------------------+
*/
/* $Id$ */
#include "php.h"
#include <stdlib.h>
#if HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <string.h>
#include <errno.h>
#include <ctype.h>
#if FHTTPD
#include <servproc.h>
#include <signal.h>
struct http_server *server = NULL;
struct request *req = NULL;
struct httpresponse *response = NULL;
int headermade = 0;
int global_alarmflag = 0;
int idle_timeout = IDLE_TIMEOUT;
int exit_status = 0;
char **currentheader = NULL;
char *headerfirstline = NULL;
int headerlines = 0;
static int headerlinesallocated = 0;
void alarmhandler(SIGACTARGS)
{
global_alarmflag = 1;
}
void setalarm(int t)
{
struct sigaction tmpsigaction;
global_alarmflag = 0;
if (t){
bzero((char *) &tmpsigaction, sizeof(struct sigaction));
tmpsigaction.sa_handler = alarmhandler;
sigaddset(&tmpsigaction.sa_mask, SIGALRM);
tmpsigaction.sa_flags = 0;
sigaction(SIGALRM, &tmpsigaction, NULL);
alarm(t);
}
}
int checkinput(int h)
{
fd_set readfd;
FD_ZERO(&readfd);
FD_SET(h, &readfd);
return select(h + 1, &readfd, NULL, NULL, NULL) > 0;
}
PHPAPI void php_fhttpd_free_header(void)
{
int i;
if (headerfirstline) {
free(headerfirstline);
headerfirstline = NULL;
}
if (currentheader) {
for (i = 0; i < headerlines; i++) {
free(currentheader[i]);
}
free(currentheader);
currentheader = NULL;
}
headerlines = 0;
headerlinesallocated = 0;
headermade = 0;
}
PHPAPI void php_fhttpd_puts_header(char *s)
{
char *p0, *p1, *p2, *p3, **p;
int l;
if (!s || !*s || *s == '\r' || *s == '\n')
return;
l = strlen(s);
p2 = strchr(s, '\r');
p3 = strchr(s, '\n');
p0 = strchr(s, ':');
p1 = strchr(s, ' ');
if (p0 && (!p1 || p1 > p0)) {
if (!headerlinesallocated) {
currentheader = (char **) malloc(10 * sizeof(char *));
if (currentheader)
headerlinesallocated = 10;
} else {
if (headerlinesallocated <= headerlines) {
p = (char **) realloc(currentheader, (headerlinesallocated + 10) * sizeof(char *));
if (p) {
currentheader = p;
headerlinesallocated += 10;
}
}
}
if (headerlinesallocated > headerlines) {
currentheader[headerlines] = malloc(l + 3);
if (currentheader[headerlines]) {
strcpy(currentheader[headerlines], s);
if (!p3) {
if (p2) {
(currentheader[headerlines] + (p2 - s))[1] = '\n';
(currentheader[headerlines] + (p2 - s))[2] = 0;
} else {
currentheader[headerlines][l] = '\r';
currentheader[headerlines][l + 1] = '\n';
currentheader[headerlines][l + 2] = 0;
}
}
headerlines++;
headermade = 1;
}
}
} else {
if (headerfirstline)
free(headerfirstline);
headerfirstline = malloc(l + 3);
if (headerfirstline) {
strcpy(headerfirstline, s);
if (!p3) {
if (p2) {
(headerfirstline + (p2 - s))[1] = '\n';
(headerfirstline + (p2 - s))[2] = 0;
} else {
headerfirstline[l] = '\r';
headerfirstline[l + 1] = '\n';
headerfirstline[l + 2] = 0;
}
}
}
headermade = 1;
}
}
void fhttpd_flush(void)
{
}
PHPAPI void php_fhttpd_puts(char *s)
{
putlinetoresponse(response, s);
}
PHPAPI void php_fhttpd_putc(char c)
{
writetoresponse(response, &c, 1);
}
PHPAPI int php_fhttpd_write(char *a, int n)
{
return writetoresponse(response, a, n);
}
#endif
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
*/
+8
View File
@@ -0,0 +1,8 @@
#!/bin/sh
#
# $Id$
dir=$1; shift
for stubfile in $dir/*/config0.m4 $dir/*/config.m4; do
echo "sinclude($stubfile)"
done
+30
View File
@@ -0,0 +1,30 @@
#! /bin/sh
#
# do some automatic conversion of prototypes
#
if test "$1" = "" ; then
echo "usage: $0 list-of-files"
exit 1
fi
tmpfile=`mktemp -q /tmp/asd.XXXXXX`
if test "$?" != "0" ; then
echo "$0: cannot create temporary file"
exit 1
fi
for file in ${1+"$@"} ; do
echo "working on $file"
cat $file | \
sed -e \
's/void php3_\(.*\)(INTERNAL_FUNCTION_PARAMETERS)/PHP_FUNCTION(\1)/' \
-e 's/^extern void /void /' \
-e 's/^extern PHP_FUNCTION/PHP_FUNCTION/' > $tmpfile
cp $tmpfile $file
done
rm -f $tmpfile
exit 0
+61
View File
@@ -0,0 +1,61 @@
#! /bin/sh
#
# +----------------------------------------------------------------------+
# | PHP Version 4 |
# +----------------------------------------------------------------------+
# | Copyright (c) 1997-2002 The PHP Group |
# +----------------------------------------------------------------------+
# | This source file is subject to version 2.02 of the PHP license, |
# | that is bundled with this package in the file LICENSE, and is |
# | available at through the world-wide-web at |
# | http://www.php.net/license/2_02.txt. |
# | If you did not receive a copy of the PHP license and are unable to |
# | obtain it through the world-wide-web, please send a note to |
# | license@php.net so we can mail you a copy immediately. |
# +----------------------------------------------------------------------+
# | Author: Sascha Schumann <sascha@schumann.cx> |
# +----------------------------------------------------------------------+
#
# $Id$
for i in $@; do
echo -n "Processing $i... "
sed \
-e 's/(\*\([^()]\+\))->type/Z_TYPE_PP(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)->type/Z_TYPE_P(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)\.type/Z_TYPE(\1)/g' \
-e 's/(\*\([^()]\+\))->value\.dval/Z_DVAL_PP(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)->value\.dval/Z_DVAL_P(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)\.value\.dval/Z_DVAL(\1)/g' \
-e 's/(\*\([^()]\+\))->value\.lval/Z_LVAL_PP(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)->value\.lval/Z_LVAL_P(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)\.value\.lval/Z_LVAL(\1)/g' \
-e 's/(\*\([^()]\+\))->value\.ht/Z_ARRVAL_PP(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)->value\.ht/Z_ARRVAL_P(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)\.value\.ht/Z_ARRVAL(\1)/g' \
-e 's/(\*\([^()]\+\))->value\.str\.val/Z_STRVAL_PP(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)->value\.str\.val/Z_STRVAL_P(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)\.value\.str\.val/Z_STRVAL(\1)/g' \
-e 's/(\*\([^()]\+\))->value\.str\.len/Z_STRLEN_PP(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)->value\.str\.len/Z_STRLEN_P(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)\.value\.str\.len/Z_STRLEN(\1)/g' \
-e 's/(\*\([^()]\+\))->value\.obj\.properties/Z_OBJPROP_PP(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)->value\.obj\.properties/Z_OBJPROP_P(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)\.value\.obj\.properties/Z_OBJPROP(\1)/g' \
-e 's/(\*\([^()]\+\))->value\.obj\.ce/Z_OBJCE_PP(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)->value\.obj\.ce/Z_OBJCE_P(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)\.value\.obj\.ce/Z_OBJCE(\1)/g' \
-e 's/(\*\([^()]\+\))->value\.obj/Z_OBJ_PP(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)->value\.obj/Z_OBJ_P(\1)/g' \
-e 's/\([a-z_][]a-z_0-9\[]*\)\.value\.obj/Z_OBJ(\1)/g' \
-e 's/\([a-zA-Z_][a-zA-Z_0-9]*\)->Z_\([A-Z_]\+\)(/Z_\2(\1->/g' \
-e 's/\([a-zA-Z_][a-zA-Z_0-9]*\)->Z_\([A-Z_]\+\)(/Z_\2(\1->/g' \
-e 's/\([a-zA-Z_][a-zA-Z_0-9]*\)->Z_\([A-Z_]\+\)(/Z_\2(\1->/g' \
-e 's/\([a-zA-Z_][a-zA-Z_0-9]*\)\.Z_\([A-Z_]\+\)(/Z_\2(\1./g' \
-e 's/\([a-zA-Z_][a-zA-Z_0-9]*\)\.Z_\([A-Z_]\+\)(/Z_\2(\1./g' \
-e 's/\([a-zA-Z_][a-zA-Z_0-9]*\)\.Z_\([A-Z_]\+\)(/Z_\2(\1./g' \
< $i > tmp && cp tmp $i
echo "DONE"
done
rm -f tmp
+26
View File
@@ -0,0 +1,26 @@
#!/bin/sh
awkprog='
BEGIN { FS = "\n"; RS = "" }
{ print "CREDIT_LINE(\""$1"\", \""$2"\");" }'
for what in ext sapi
do
file=ext/standard/credits_$what.h
cat >$file <<END
/*
DO NOT EDIT THIS FILE!
it has been automaticaly created by php4/scripts/credits from
the information found in the various php4/ext/.../CREDITS and
php4/sapi/.../CREDITS files
if you want to change an entry you have to edit the appropriate
CREDITS file instead
*/
END
# Do not process skeleton #
files=`find "$what" -name CREDITS | grep -v "$what"/skeleton/CREDITS`
awk "$awkprog" $files | sort -f >> $file
done
Executable
+60
View File
@@ -0,0 +1,60 @@
PHP Regression Tests
====================
To run the tests, go to the top-level directory and
run "./php -q run-tests.php".
Without parameters, "run-tests.php" will recursively scan through the
file tree looking for directories called "tests", and run all the
tests (.phpt files) within (recursively).
To run tests in a single directory, pass the directory as a parameter:
"./php -q run-tests.php tests/lang".
To run one or more single tests, pass them as parameters:
"./php -q run-tests.php tests/lang/015.phpt".
The format of the .phpt files is quite simple. There are 6 possible
sections. Test, Skipif, Post, Get, File and Expect. The Test section
contains the description of the test. The Skipif section contains
code that should print "skip" if this test should be skipped for some
reason (such as an extension that is not compiled in). The Post
section contains any post data that the script might need. The Get
section contains any Get data. Note that both the Post and the Get
sections need to have this data in url-encoded format. The File
section contains the actual script and the Expect section is the
expected output, sans headers. Blank lines are ignored in the
expected output.
A simple example which takes one argument through the POST method
and one through the GET and displays these would be:
--TEST--
Simple GET and POST test
--SKIPIF--
--POST--
a=Hello
--GET--
b=There
--FILE--
<?php echo "$a $b">
--EXPECT--
Hello There
Another simple example that only runs if the PCRE extension is loaded:
--TEST--
Simple Perl regexp test
--SKIPIF--
<?php if (!extension_loaded("pcre")) print "skip"; ?>
--POST--
--GET--
--FILE--
<?php
$str="Hello 42 World";
if (pcre_match('/^([a-z]+)\s+(\d+)\s+([a-z]+)/i', $str, $matches)) {
printf("%s %s: %d\n", $matches[1], $matches[3], $matches[2]);
}
?>
--EXPECT--
Hello World: 42
+30
View File
@@ -0,0 +1,30 @@
--TEST--
dirname test
--FILE--
<?php
function check_dirname($path)
{
print "dirname($path) == " . dirname($path) . "\n";
}
check_dirname("/foo/");
check_dirname("/foo");
check_dirname("/foo/bar");
check_dirname("d:\\foo\\bar.inc");
check_dirname("/");
check_dirname(".../foo");
check_dirname("./foo");
check_dirname("foobar///");
check_dirname("c:\foo");
?>
--EXPECT--
dirname(/foo/) == /
dirname(/foo) == /
dirname(/foo/bar) == /foo
dirname(d:\foo\bar.inc) == .
dirname(/) == /
dirname(.../foo) == ...
dirname(./foo) == .
dirname(foobar///) == .
dirname(c:\foo) == .