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 + -
显示快捷键?