rtcphptypes.pas
来自「Delphi快速开发Web Server」· PAS 代码 · 共 511 行
PAS
511 行
{
"PHP Scripting Type definition" - Copyright (c) Danijel Tkalcec
@html(<br>)
@longcode(#
Based on PHP 4 Delphi
by Serhiy Perevoznyk
<serge_perevoznyk(at)hotmail.com>
<http://users.chello.be/ws36637> #)
@exclude
}
unit rtcPHPTypes;
{$INCLUDE rtcDefs.inc}
interface
{If you are using PHP 4 please comment $DEFINE PHP5}
{.$DEFINE PHP5}
{$A+}
uses
Windows,
SysUtils,
rtcThrPool;
const
ZEND_HANDLE_FILENAME = 0;
TSRM_ERROR_LEVEL_ERROR = 1;
TSRM_ERROR_LEVEL_CORE = 2;
TSRM_ERROR_LEVEL_INFO = 3;
type
size_t = cardinal;
pzval = pointer;
ppointer = ^pointer;
pppointer = ^ppointer;
zend_bool = boolean;
Psapi_module_struct = ^Tsapi_module_struct;
TModuleShutdownFunc = function (globals : pointer) : Integer; cdecl;
TModuleStartupFunc = function (sapi_module : psapi_module_struct) : integer; cdecl;
sapi_module_struct = record
name : PChar;
pretty_name : PChar;
startup : TModuleStartupFunc; //int (*startup)(struct _sapi_module_struct *sapi_module);
shutdown : TModuleShutdownFunc; //int (*shutdown)(struct _sapi_module_struct *sapi_module);
activate : pointer;
deactivate : pointer;
ub_write : pointer;
flush : pointer;
stat : pointer;
getenv : pointer;
sapi_error : pointer;
header_handler : pointer;
send_headers : pointer;
send_header : pointer;
read_post : pointer;
read_cookies : pointer;
register_server_variables : pointer;
log_message : pointer;
php_ini_path_override : PChar;
block_interruptions : pointer;
unblock_interruptions : pointer;
default_post_reader : pointer;
treat_data : pointer;
executable_location : PChar;
php_ini_ignore : Integer;
{******************************}
{IMPORTANT: }
{Please check your php version }
{******************************}
{$IFDEF PHP5}
get_fd : pointer;
force_http_10 : pointer;
get_target_uid : pointer;
get_target_gid : pointer;
input_filter : pointer;
ini_defaults : pointer;
phpinfo_as_text : integer;
{$ELSE}
get_fd : pointer;
force_http_10 : pointer;
get_target_uid : pointer;
get_target_gid : pointer;
ini_defaults : pointer;
phpinfo_as_text : integer;
{$ENDIF}
end;
Tsapi_module_struct = sapi_module_struct;
Psapi_request_info = ^Tsapi_request_info;
sapi_request_info =
record
request_method : PChar;
query_string : PChar;
post_data : PChar;
raw_post_data : PChar;
cookie_data : PChar;
content_length : Longint;
post_data_length : uint;
raw_post_data_length : uint;
path_translated : PChar;
request_uri : PChar;
content_type : PChar;
headers_only : zend_bool;
no_headers : zend_bool;
{$IFDEF PHP5}
headers_read : zend_bool;
{$ENDIF}
post_entry : pointer; // PSapi_post_entry;
content_type_dup : PChar;
//for HTTP authentication
auth_user : PChar;
auth_password : PChar;
//this is necessary for the CGI SAPI module
argv0 : PChar;
//this is necessary for Safe Mode
current_user : PChar;
current_user_length : Integer;
//this is necessary for CLI module
argc : Integer;
argv : ^PChar;
end;
Tsapi_request_info = sapi_request_info;
pzend_list_element = ^zend_list_element;
zend_list_element = record
prev: pzend_list_element;
next: pzend_list_element;
data: char;
end;
pzend_llist = ^zend_llist;
zend_llist = record
head: pzend_list_element;
tail: pzend_list_element;
size: size_t;
count: size_t;
dtor: pointer;
persistent: byte;
traverse_ptr: pzend_list_element;
end;
Psapi_headers_struct = ^Tsapi_headers_struct;
sapi_headers_struct =
record
headers : zend_llist;
http_response_code : Integer;
send_default_content_type : Byte;
mimetype : PChar;
http_status_line : PChar;
end;
Tsapi_headers_struct = sapi_headers_struct;
PStat = ^TStat;
TStat = record
st_dev: Word;
st_ino: Word;
st_mode: Word;
st_nlink: SmallInt;
st_uid: SmallInt;
st_gid: SmallInt;
st_rdev: Word;
st_size: Longint;
st_atime: Longint;
st_mtime: Longint;
st_ctime: Longint;
end;
Stat = TStat;
PBucket = ^TBucket;
TBucket = record
h: ulong;
nKeyLength: uint;
pData: Pointer;
pDataPtr: Pointer;
pListNext: PBucket;
pListLast: PBucket;
pNext: PBucket;
pLast: PBucket;
arKey: array[0..0] of char;
end;
PHashTable = ^THashTable;
THashTable =
record
nTableSize: uint;
nTableMask: uint;
nNumOfElements: uint;
nNextFreeElement: ulong;
pInternalPointer: PBucket;
pListHead: PBucket;
pListTail: PBucket;
arBuckets: ^PBucket;
pDestructor: pointer;
persistent: boolean;
nApplyCount: Byte;
bApplyProtection: boolean;
end;
Psapi_globals_struct = ^Tsapi_globals_struct;
_sapi_globals_struct =
record
server_context : Pointer;
request_info : sapi_request_info;
sapi_headers : sapi_headers_struct;
read_post_bytes : Integer;
headers_sent : Byte;
global_stat : stat;
default_mimetype : PChar;
default_charset : PChar;
rfc1867_uploaded_files : PHashTable;
post_max_size : Longint;
options : Integer;
{$IFDEF PHP5}
sapi_started : zend_bool;
{$ENDIF}
end;
Tsapi_globals_struct = _sapi_globals_struct;
Psapi_header_struct = ^Tsapi_header_struct;
sapi_header_struct =
record
header : PChar;
header_len : uint;
replace : boolean;
end;
Tsapi_header_struct = sapi_header_struct;
{$IFDEF PHP5}
zend_stream_reader_t = function(handle : pointer; buf : pChar; len : size_t; TSRMLS_DC : pointer) : size_t; cdecl;
zend_strem_closer_t = procedure(handle : pointer; TSRMLS_DC : pointer); cdecl;
_zend_stream = record
handle : pointer;
reader : pointer;
closer : pointer;
interactive : pointer;
end;
TZendStream = _zend_stream;
PZendStream = ^TZendStream;
{$ENDIF}
zend_file_handle =
record
_type: uchar;
filename: PChar;
opened_path: PChar;
handle:
record
case Integer of
1:
(
fd: Integer;
);
2:
(
fp: pointer;
);
{$IFDEF PHP5}
3 :
(
stream : TZendStream;
);
{$ENDIF}
end;
free_filename: shortint;
end;
TZendFileHandle = zend_file_handle;
arg_separators =
record
output : PChar;
input : PChar;
end;
Pphp_Core_Globals = ^TPHP_core_globals;
Tphp_core_globals =
record
magic_quotes_gpc : zend_bool;
magic_quotes_runtime : zend_bool;
magic_quotes_sybase : zend_bool;
safe_mode : zend_bool;
allow_call_time_pass_reference : boolean;
implicit_flush : boolean;
output_buffering : Integer;
safe_mode_include_dir : PChar;
safe_mode_gid : boolean;
sql_safe_mode : boolean;
enable_dl :boolean;
output_handler : PChar;
unserialize_callback_func : PChar;
safe_mode_exec_dir : PChar;
memory_limit : Longint;
max_input_time : Longint;
track_errors : boolean;
display_errors : boolean;
display_startup_errors : boolean;
log_errors : boolean;
log_errors_max_len : Longint;
ignore_repeated_errors : boolean;
ignore_repeated_source : boolean;
report_memleaks : boolean;
error_log : PChar;
doc_root : PChar;
user_dir : PChar;
include_path : PChar;
open_basedir : PChar;
extension_dir : PChar;
upload_tmp_dir : PChar;
upload_max_filesize : Longint;
error_append_string : PChar;
error_prepend_string : PChar;
auto_prepend_file : PChar;
auto_append_file : PChar;
arg_separator : arg_separators;
gpc_order : PChar;
variables_order : PChar;
rfc1867_protected_variables : THashTable;
connection_status : Smallint;
ignore_user_abort : Smallint;
header_is_being_sent : Byte;
tick_functions : zend_llist;
http_globals : array[0..5] of pzval;
expose_php : boolean;
register_globals : boolean;
register_argc_argv : boolean;
y2k_compliance : boolean;
docref_root : PChar;
docref_ext : PChar;
html_errors : boolean;
xmlrpc_errors : boolean;
xmlrpc_error_number : Longint;
modules_activated : boolean;
file_uploads : boolean;
during_request_startup : boolean;
allow_url_fopen : boolean;
always_populate_raw_post_data : boolean;
end;
var
zend_error: procedure(ErrType: integer; ErrText: PChar); cdecl;
ts_resource_ex : function(id: integer; p: pointer): pointer; cdecl;
tsrm_startup: function(expected_threads: integer; expected_resources: integer; debug_level: integer; debug_filename: pchar): integer; cdecl;
tsrm_shutdown: procedure(); cdecl;
sapi_startup: procedure (module : pointer); cdecl;
sapi_shutdown: procedure; cdecl;
php_module_startup: function(sf : pointer; additional_modules : pointer; num_additional_modules : uint) : Integer; cdecl;
php_register_variable: procedure(_var : PChar; val: PChar; track_vars_array: pointer; TSRMLS_DC : pointer); cdecl;
php_execute_script : function (primary_file: pointer; TSRMLS_D : pointer) : Integer; cdecl;
php_request_startup: function(TSRMLS_D : pointer) : Integer; cdecl;
php_request_shutdown: procedure(dummy : Pointer); cdecl;
php_module_shutdown_wrapper: function (globals : pointer) : Integer; cdecl;
function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct;
function PG(TSRMLS_DC : pointer) : Pphp_Core_Globals;
function PHPLoaded : boolean;
procedure LoadPHP(const DllFolder: string);
procedure UnloadPHP;
implementation
var
PHPLib : THandle = 0;
MyPHP : boolean = False;
function PHPLoaded : boolean;
begin
Result := PHPLib <> 0;
end;
function GetSAPIGlobals(TSRMLS_DC : pointer) : Psapi_globals_struct;
var
sapi_global_id : pointer;
sapi_globals_value : integer;
sapi_globals : Psapi_globals_struct;
begin
Result := nil;
sapi_global_id := GetProcAddress(PHPLib, 'sapi_globals_id');
if Assigned(sapi_global_id) then
begin
sapi_globals_value := integer(sapi_global_id^);
asm
push ecx
push edx
push eax
mov ecx, sapi_globals_value
mov edx, dword ptr tsrmls_dc
mov eax, dword ptr [edx]
mov ecx, dword ptr [eax+ecx*4-4]
mov sapi_globals, ecx
pop eax
pop edx
pop ecx
end;
Result := sapi_globals;
end;
end;
function GetPHPGlobals(TSRMLS_DC : pointer) : Pphp_Core_Globals;
var
core_global_id : pointer;
core_globals_value : integer;
core_globals : Pphp_core_globals;
begin
Result := nil;
core_global_id := GetProcAddress(PHPLib, 'core_globals_id');
if Assigned(core_global_id) then
begin
core_globals_value := integer(core_global_id^);
asm
push ecx
push edx
push eax
mov ecx, core_globals_value
mov edx, dword ptr tsrmls_dc
mov eax, dword ptr [edx]
mov ecx, dword ptr [eax+ecx*4-4]
mov core_globals, ecx
pop eax
pop edx
pop ecx
end;
Result := core_globals;
end;
end;
function PG(TSRMLS_DC : pointer) : Pphp_Core_Globals;
begin
result := GetPHPGlobals(TSRMLS_DC);
end;
procedure LoadPHP(const DllFolder : string);
begin
if PHPLoaded then Exit;
MyPHP:=True;
{$IFDEF PHP5}
PHPLib := GetModuleHandle(PChar(DllFolder+'php5ts.dll'));
if PHPLib=0 then
PHPLib := LoadLibrary(PChar(DllFolder+'php5ts.dll'))
else
MyPHP:=False;
{$ELSE}
PHPLib := GetModuleHandle(PChar(DllFolder+'php4ts.dll'));
if PHPLib=0 then
PHPLib := LoadLibrary(PChar(DllFolder+'php4ts.dll'))
else
MyPHP:=False;
{$ENDIF}
if PHPLib = 0 then
raise Exception.CreateFmt('PHP DLL not found in Folder %s', [DllFolder]);
zend_error := GetProcAddress(PHPLib, 'zend_error');
ts_resource_ex := GetProcAddress(PHPLib, 'ts_resource_ex');
tsrm_startup := GetProcAddress(PHPLib, 'tsrm_startup');
tsrm_shutdown := GetProcAddress(PHPLib, 'tsrm_shutdown');
sapi_startup := GetProcAddress(PHPLib, 'sapi_startup');
sapi_shutdown := GetProcAddress(PHPLib, 'sapi_shutdown');
php_request_startup := GetProcAddress(PHPLib, 'php_request_startup');
php_request_shutdown := GetProcAddress(PHPLib, 'php_request_shutdown');
php_module_startup := GetProcAddress(PHPLib, 'php_module_startup');
php_module_shutdown_wrapper := GetProcAddress(PHPLib, 'php_module_shutdown_wrapper');
php_register_variable := GetProcAddress(PHPLib, 'php_register_variable');
php_execute_script := GetProcAddress(PHPLib, 'php_execute_script');
end;
procedure UnloadPHP;
var
H : THandle;
begin
if PHPLib<>0 then
begin
H := InterlockedExchange(integer(PHPLib), 0);
if MyPHP and (H > 0) then
begin
MyPHP:=False;
PhpLib:=0;
FreeLibrary(H);
end;
end;
end;
initialization
finalization
UnloadPHP;
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?