今天研究PHP注冊POST/GET大變量的時候,看到了關于這塊的一些東西,跟蹤了半天,先記錄下來,免得以后再如此麻煩的跟蹤.
處理器注冊:
- [mod_php5.c, mod_php5模塊初始化]
- php_init_handler(server_rec *s, pool *p)
- ->[main/SAPI.c]sapi_startup(&apache_sapi_module)
- ->[main/SAPI.c]
- sapi_globals_ctor(&sapi_globals)
- ->[main/php_content_types.c]php_setup_sapi_content_types(TSRMLS_C)
- ->[main/php_content_types.c
- php_post_entries如下]sapi_register_post_entries(php_post_entries
- TSRMLS_CC)
- ->[main/SAPI.c]sapi_register_post_entry(p
- TSRMLS_CC)
如下面的代碼,共注冊了倆個處理器,分別處理post數據和文件上傳.
注1:參看在PHP Module中獲取$_GET/$_POST/$_COOKIE的方法研究
- [main/rfc1867.h]
- #define
- MULTIPART_CONTENT_TYPE
- "multipart/form-data"
- [main/php_content_types.h]
- #define
- DEFAULT_POST_CONTENT_TYPE
- "application/x-www-form-urlencoded"
- [main/SAPI.c]
- struct
- _sapi_post_entry
- {
- char *content_type;
- uint
- content_type_len;
- void
- (*post_reader)(TSRMLS_D);
- void
- (*post_handler)(char *content_type_dup, void *arg
- TSRMLS_DC);
- };
- [main/php_content_types.c]
- static
- sapi_post_entry
- php_post_entries[] = {
- {
- DEFAULT_POST_CONTENT_TYPE, sizeof(DEFAULT_POST_CONTENT_TYPE)-1, sapi_read_standard_form_data, php_std_post_handler
- },
- {
- MULTIPART_CONTENT_TYPE, sizeof(MULTIPART_CONTENT_TYPE)-1, NULL, rfc1867_post_handler
- },
- {
- NULL, 0, NULL, NULL
- }
- };
- <?php
- #*********************************************************
- #文件名稱: yl_upload.class.php
- #功能描述: 印像上傳類
- #程序制作:留印(adleyliu)
- #聯系qq :14339095
- #聯系郵箱:adleyliu@163.com
- #最后更新: 2007-11-11
- #注:轉發時請保留此聲明信息,這段聲明不并會影響你的速度!
- #如有修改請將修改后的文件以郵件形式發送給作者一份,謝謝!
- #
- #*********************************************************
- /*
- //使用說明:
- //聲明一個上傳類
- $yl_upload = new yl_upload_class();
- //設置參數
- global $yl_filedata,$yl_directroy,$file_urldirectroy,$yl_settingsnew;
- global $yl_maxsize,$yl_sizeformat,$yl_arrext,$yl_ext;
- $yl_filedata = 'filedata';//表單名
- $yl_directroy = '../upload_file';//上傳主目錄
- $file_urldirectroy = 'upload_file';//文件url(在編輯器KindEditor中用到,請查看upload.php實例)
- $yl_settingsnew = 'month_'.date('Ym');//上傳主目錄1按版塊存入不同目錄,2按月份存入不同目錄,3按天存入不同目錄
- $yl_maxsize = 2097152; //這里以字節為單位(1024*2)*1024=2097152 = 2M
- $yl_sizeformat = 'k'; //顯示文件大小單位b,k,m
- $yl_arrext = array('gif','jpg','jpeg','png','bmp');//允許上傳文件類型
- $yl_ext = 0; //0原文件類型上傳,1統一為存為jpg
- //上傳
- $yl_upload -> yl_uploadfile();
- */
- class yl_upload_class
- {
- #*********************************************************
- #創建目錄函數
- #*********************************************************
- function createfolder($yl_path)
- {
- if (!file_exists($yl_path))
- {
- $this -> createfolder(dirname($yl_path));
- @mkdir($yl_path, 0777);
- }
- return $this -> createfolder;
- }
- #*********************************************************
- #獲取文件名稱,大小,類型,臨時文件名
- #*********************************************************
- function yl_getfilename($yl_type)
- {
- global $yl_filedata,$yl_directroy,$yl_settingsnew;
- global $yl_maxsize,$yl_sizeformat,$yl_arrext,$yl_ext;
- return $_FILES[$yl_filedata][$yl_type];
- }
- #*********************************************************
- #獲取文件大小
- #*********************************************************
- function yl_getfilesize()
- {
- global $yl_filedata,$yl_directroy,$yl_settingsnew;
- global $yl_maxsize,$yl_sizeformat,$yl_arrext,$yl_ext;
- if($this -> yl_getfilename('size') == 0){
- $this -> alert("請選擇上傳文件!");
- exit;
- }
- if($this -> yl_getfilename('size') > $yl_maxsize){
- $yl_maxsizek=$yl_maxsize/1024;
- $this -> alert("上傳文件超出限制范圍$yl_maxsizek.K!");
- exit;
- }
- switch (strtolower($yl_sizeformat)){
- case 'b':
- return $this -> yl_getfilename('size') . ' B';
- break;
- case 'k':
- return ($this -> yl_getfilename('size')/1024) . ' K';
- break;
- case 'm':
- return ($this -> yl_getfilename('size'))/(1024*1024) . ' M';
- }
- }
- #*********************************************************
- #獲得文件擴展名
- #*********************************************************
- function yl_getfiletype()
- {
- global $yl_filedata,$yl_directroy,$yl_settingsnew;
- global $yl_maxsize,$yl_sizeformat,$yl_arrext,$yl_ext;
- $yl_temp_arr = explode(".", $this -> yl_getfilename('name'));
- $yl_file_ext = array_pop($yl_temp_arr);
- $yl_file_ext = trim($yl_file_ext);
- $yl_file_ext = strtolower($yl_file_ext);
- //檢查擴展名
- if (in_array($yl_file_ext, $yl_arrext) === false) {
- $this -> alert("上傳文件類型被限制!");
- exit;
- }
- return $yl_file_ext;
- }
- #*********************************************************
- #上傳
- #*********************************************************
- function yl_uploadfile()
- {
- global $yl_filedata,$yl_directroy,$file_urldirectroy,$yl_settingsnew;
- global $yl_maxsize,$yl_sizeformat,$yl_arrext,$yl_ext;
- $yl_file_nameold = $this -> yl_getfilename('name');//原文件名
- $yl_file_namenews = date('Ymd').'_'.md5(date('YmdHis'));//重命名
- if($yl_ext == 0){
- $yl_file_names = $yl_file_namenews.'.'.$this -> yl_getfiletype();//改名
- }elseif ($yl_ext == 1){
- $yl_file_names = $yl_file_namenews.'.jpg';//統一改名為jpg
- }
- $yl_tmp_name = $this -> yl_getfilename('tmp_name');//服務器上臨時文件名
- $yl_file_size = $this -> yl_getfilesize();//獲取文件大小
- $yl_file_type = $this -> yl_getfiletype();//獲取文件類型
- $yl_file_path = $yl_directroy.'/'.$yl_settingsnew;//建立一個目錄
- //檢查目錄是否存在,不存在則創建
- if(@is_dir($yl_file_path) === false) {
- $this -> createfolder(''.$yl_file_path.'');//創建目錄
- }
- //檢查是否已上傳
- if(@is_uploaded_file($yl_tmp_name) === false) {
- $this -> alert("文件已上傳!");
- exit;
- }
- //檢查目錄寫權限
- if (@is_writable($yl_file_path) === false) {
- $this -> alert("上傳目錄沒有寫權限!");
- exit;
- }
- $yl_doupload = @copy($yl_tmp_name, ''.$yl_file_path.'/'.$yl_file_names.'');
- if($yl_doUpload === false)
- {
- $this -> alert("上傳失敗!");
- }else{
- echo '上傳成功';
- echo '<br>';
- echo '文件目錄:'.$yl_file_path.'';
- echo '<br>';
- echo '原文件名:'.$yl_file_nameold.'';
- echo '<br>';
- echo '新文件名:'.$yl_file_names.'';
- echo '<br>';
- echo '文件大小:'.$yl_file_size.'';
- echo '<br>';
- echo '文件類型:'.$yl_file_type.'';
- }
- return;
- }
- #*********************************************************
- #*刪除文件
- #*********************************************************
- function delfile()
- {
- global $yl_filedata,$yl_directroy,$yl_settingsnew;
- global $yl_maxsize,$yl_sizeformat,$yl_arrext,$yl_ext;
- $yl__dir = dirname(trim($yl_directroy));
- if( $this->_isDel( $yl__dir ) )
- {
- return @unlink( $yl_directroy ) ? true : false;
- }else{
- return false;
- }
- }
- #*********************************************************
- #刪除目錄 目錄下如果有文件不能刪除
- #*********************************************************
- function deldir( )
- {
- global $yl_filedata,$yl_directroy,$yl_settingsnew;
- global $yl_maxsize,$yl_sizeformat,$yl_arrext,$yl_ext;
- if( $this->_isdel($yl_directroy) && is_dir( $yl_directroy ) )
- {
- return @rmdir( $yl_directroy ) ? true : false;
- }else{
- return false;
- }
- }
- #*********************************************************
- #提示
- #*********************************************************
- function alert($yl_msg)
- {
- echo '<html>';
- echo '<head>';
- echo '<title>error</title>';
- echo '<meta http-equiv="content-type" c>';
- echo '</head>';
- echo '<body>';
- echo '<script type="text/網頁特效">alert("'.$yl_msg.'");;</script>';
- echo '</body>';
- echo '</html>';
- exit;
- }
- }
- ?>
新聞熱點
疑難解答