1.當PHP需要在Apache伺服器下運行時 一般來說,它可以mod_php5模塊的形式集成, 此時mod_php5模塊的作用是接收Apache傳遞過來的PHP文件請求,並處理這些請求, 然後將處理後的結果返回給Apache。載入方式有兩種:Apache啟動時的載入,或者運行的時候動態裝載 2.Ap ...
1.當PHP需要在Apache伺服器下運行時
一般來說,它可以mod_php5模塊的形式集成, 此時mod_php5模塊的作用是接收Apache傳遞過來的PHP文件請求,並處理這些請求, 然後將處理後的結果返回給Apache。
載入方式有兩種:Apache啟動時的載入,或者運行的時候動態裝載
2.Apache的運行過程
Apache的運行分為啟動階段和運行階段。 在啟動階段,Apache為了獲得系統資源最大的使用許可權,將以特權用戶root(*nix系統)
並且整個過程處於一個單進程單線程的環境中。 這個階段包括配置文件解析(如http.conf文件)、模塊載入(如mod_php,mod_perl)和系統資源初始化(例如日誌文件、共用記憶體段、資料庫連接等)等工作。在運行階段,Apache主要工作是處理用戶的服務請求。 在這個階段,Apache放棄特權用戶級別,使用普通許可權,這主要是基於安全性的考慮,防止由於代碼的缺陷引起的安全漏洞。
通過Hook機制,將mod_php5的自定義函數註入請求處理迴圈中,參與php的處理
3.Apache2的mod_php5模塊說明
Apache中的module結構體,定義了很多成員
PHP中的mod_php5模塊,使用這個結構體定義,並賦值。其中有一個php_dir_cmds的成員,是個數組裡麵包括了幾個php的指令,例如:php_value,php_admin_value等
Apache定義的結構體:
typedef struct module_struct module; struct module_struct { int version; int minor_version; int module_index; const char *name; void *dynamic_load_handle; struct module_struct *next; unsigned long magic; void (*rewrite_args) (process_rec *process); void *(*create_dir_config) (apr_pool_t *p, char *dir); void *(*merge_dir_config) (apr_pool_t *p, void *base_conf, void *new_conf); void *(*create_server_config) (apr_pool_t *p, server_rec *s); void *(*merge_server_config) (apr_pool_t *p, void *base_conf, void *new_conf); const command_rec *cmds; void (*register_hooks) (apr_pool_t *p); }
PHP中對結構體的賦值:
AP_MODULE_DECLARE_DATA module php5_module = { STANDARD20_MODULE_STUFF, /* 巨集,包括版本,小版本,模塊索引,模塊名,下一個模塊指針等信息,其中模塊名以__FILE__體現 */ create_php_config, /* create per-directory config structure */ merge_php_config, /* merge per-directory config structures */ NULL, /* create per-server config structure */ NULL, /* merge per-server config structures */ php_dir_cmds, /* 模塊定義的所有的指令 */ php_ap2_register_hook /* 註冊鉤子,此函數通過ap_hoo_開頭的函數在一次請求處理過程中對於指定的步驟註冊鉤子 */ }; const command_rec php_dir_cmds[] = { AP_INIT_TAKE2("php_value", php_apache_value_handler, NULL, OR_OPTIONS, "PHP Value Modifier"), AP_INIT_TAKE2("php_flag", php_apache_flag_handler, NULL, OR_OPTIONS, "PHP Flag Modifier"), AP_INIT_TAKE2("php_admin_value", php_apache_admin_value_handler, NULL, ACCESS_CONF|RSRC_CONF, "PHP Value Modifier (Admin)"), AP_INIT_TAKE2("php_admin_flag", php_apache_admin_flag_handler, NULL, ACCESS_CONF|RSRC_CONF, "PHP Flag Modifier (Admin)"), AP_INIT_TAKE1("PHPINIDir", php_apache_phpini_set, NULL, RSRC_CONF, "Directory containing the php.ini file"), {NULL} };
我的練習:
1.C語言數組
int a[]={1,2,3,4};//整型數組
char *b[]={"tao","shi","han"};//字元串數組
printf("%d %s \n",a[2],b[0]);
2.typedef:給類型起一個別名
int main(){ //定義結構體 struct stu{ char *name; int age; int (*sum)(int); }; //給類型起個別名 typedef struct stu STU; //1.定義結構體 STU student; student.age=10; student.name="taoshihan"; printf("%s \n",student.name); }
3.幾個預定義巨集:
printf("%d\n",__LINE__);//返回當前行數
printf("%s\n",__FILE__);//返回當前源文件名稱
4.const:禁止修改變數的值,常量