php的工作原理
① php學習手冊的目 錄
第一篇 基礎篇
第1章 了解PHP 18
1.1 什麼是PHP 19
1.2 選擇PHP的理由 19
1.3 如何學好編程 22
1.4 准備PHP的開發條件 24
1.4.1 下載PHP及相關軟體 24
1.4.2 代碼編輯工具 24
1.4.3 下載PHP用戶手冊 26
1.5 本章小結 26
第2章 准備開發PHP的條件 27
2.1 AppServ—Windows版PHP集成化安裝包 28
2.1.1 用AppServ搭建PHP開發環境 28
2.1.2 測試AppServ是否安裝成功 30
2.2 XAMPP—linux版PHP集成化安裝包 31
2.2.1 用XAMPP搭建PHP開發環境 32
2.2.2 在Linux操作系統下啟動、停止XAMPP 33
2.2.3 設置Linux版XAMPP中Mysql資料庫root用戶的密碼 33
2.2.4 在Linux操作系統下編寫第一個PHP程序 33
2.3 PHP開發環境的關鍵配置信息 34
2.3.1 Apache伺服器的基本配置 34
2.3.2 PHP.INI文件的基本配置 35
2.4 解決PHP的常見配置問題 36
2.4.1 解決Apache伺服器埠沖突 36
2.4.2 更改Apache伺服器
默認存儲的文件路徑 36
2.4.3 在PHP.INI文件中更改上傳文件的大小 37
2.4.4 增加PHP擴展模塊 37
2.4.5 檢測PHP是否支持MySQL資料庫 38
2.5 Dreamweaver開發工具 38
2.5.1 情景應用一——Dreamweaver中編碼格式的選擇 38
2.5.2 情景應用二——Dreamweaver創建表格 39
2.5.3 情景應用三——Dreamweaver創建表單 43
2.5.4 情景應用四——Dreamweaver創建站點 45
2.5.5 情景應用五——Dreamweaver創建第一個PHP程序 46
2.6 本章小結 47
第3章 了解Web頁面的設計 48
3.1 XHTML基礎 49
3.1.1 XHTML語言的語法 49
3.1.2 XHTML文件的結構 51
3.1.3 編輯文字版面 53
3.1.4 插入圖像與鏈接 55
3.1.5 編寫XHTML表格 57
3.1.6 設計XHTML表單 58
3.1.7 情景應用一——編寫用戶注冊信息頁 61
3.1.8 情景應用二:文件域上傳文件 62
3.2 CSS樣式應用 63
3.2.1 將CSS樣式嵌入到HTML中 63
3.2.2 CSS選擇符 65
3.2.3 常見的CSS樣式屬性 67
3.2.4 情景應用——打造經典的導航欄 72
3.3 設計頁面布局 74
3.3.1 <div>和<span>標記 74
3.3.2 區塊模型 74
3.3.3 區塊浮動 75
3.3.4 情景應用——設置一行兩列浮動布局 77
3.4 實戰練習 78
3.4.1 CSS+DIV設計網站首頁 78
3.4.2 DIV標簽設計論壇後台管理頁面 79
3.5 本章小結 81
第4章 PHP開發基礎 82
4.1 PHP的工作原理 83
4.2 學習運用代碼注釋 83
4.2.1 使用PHP注釋 84
4.2.2 使用HTML注釋 84
4.2.3 有效使用注釋 85
4.3 PHP的常量應用 85
4.3.1 聲明和使用常量 85
4.3.2 預定義常量 87
4.4 PHP的變數應用 88
4.4.1 理解變數 88
4.4.2 聲明變數 88
4.4.3 變數作用域 89
4.4.4 可變變數 91
4.5 PHP的數據類型 92
4.5.1 標量數據類型 92
4.5.2 復合數據類型 96
4.5.3 特殊數據類型 97
4.5.4 轉換數據類型 98
4.5.5 檢測數據類型 100
4.6 PHP的運算符 101
4.6.1 算術運算符 101
4.6.2 字元串運算符 102
4.6.3 賦值運算符 102
4.6.4 位運算符 103
4.6.5 遞增或遞減運算符 103
4.6.6 邏輯運算符 104
4.6.7 比較運算符 105
4.6.8 三元運算符 105
4.6.9 運算符的使用規則 106
4.7 PHP的自定義函數 107
4.7.1 定義和調用函數 108
4.7.2 在函數間傳遞參數 109
4.7.3 函數的返回值 110
4.8 實戰練習 111
4.8.1 網站中最新動態模塊的中文字元串截取 111
4.8.2 論壇發布內容模塊中對內容的格式化輸出 112
4.9 本章小結 113
第5章 PHP流程式控制制語句 115
5.1 程序三種控制結構 116
5.1.1 順序結構 116
5.1.2 選擇(分支)結構 116
5.1.3 循環結構 116
5.2 條件控制語句 117
5.2.1 if條件控制語句 117
5.2.2 switch多分支語句 119
5.2.3 情景應用一——if語句判斷美女徵婚條件 121
5.2.4 情景應用二——switch網頁框架 122
5.3 循環控制語句 123
5.3.1 while循環語句 124
5.3.2 do...while循環語句 124
5.3.3 for循環語句 125
5.3.4 foreach循環語句 127
5.3.5 情景應用一——while語句循環讀取資料庫中數據 128
5.3.6 情景應用二——for循環語句開發一個乘法口訣表 129
5.4 跳轉語句 130
5.4.1 break跳轉語句 130
5.4.2 continue跳轉語句 131
5.4.3 return跳轉語句 132
5.5 包含語句 133
5.5.1 include()語句 133
5.5.2 require()語句 134
5.5.3 include_once()語句 135
5.5.4 require_once()語句 135
5.5.5 include()語句和require()語句的區別 136
5.5.6 include_once()語句和require_once()語句的區別 138
5.6 實戰練習 138
5.6.1 刪除資料庫中指定的數據表 138
5.6.2 for循環語句實現多圖片上傳 139
5.7 本章小結 140
第6章 字元串操作 141
6.1 初識字元串 142
6.2 轉義、還原字元串 142
6.3 截取字元串 143
6.4 分割、合成字元串 145
6.5 替換字元串 146
6.5.1 str_ireplace()函數 146
6.5.2 substr_replace()函數 148
6.6 檢索字元串 148
6.6.1 strstr()函數 148
6.6.2 substr_count()函數 149
6.7 去掉字元串首尾空格和特殊字元 150
6.7.1 ltrim()函數 150
6.7.2 rtrim()函數 151
6.7.3 trim()函數 152
6.8 字元串與HTML轉換 152
6.9 情景應用 154
6.9.1 超長文本的分頁輸出 154
6.9.2 查詢關鍵字描紅 155
6.9.3 購物車中數據的讀取 156
6.10 實戰練習 157
6.10.1 PHP 5新型字元串輸出XML數據信息 157
6.10.2 圖像驗證碼的相關操作 158
6.11 本章小結 159
第7章 正則表達式 160
7.1 什麼是正則表達式 161
7.2 正則表達式的語法規則 162
7.2.1 行定位符(^和$) 162
7.2.2 單詞定界符(、B) 162
7.2.3 字元類([ ]) 163
7.2.4 選擇字元(|) 163
7.2.5 連字元(-) 163
7.2.6 排除字元([^]) 164
7.2.7 限定符(? * + {n,m}) 164
7.2.8 點號字元(.) 164
7.2.9 轉義字元() 165
7.2.10 反斜線() 165
7.2.11 括弧字元(()) 166
7.2.12 情景應用一——整合實用的正則表達式 166
7.2.13 情景應用二——調用正則表達式驗證中文 168
7.3 PCRE兼容正則表達式函數 169
7.3.1 字元串的匹配與查找 169
7.3.2 情景應用一——應用正則表達式匹配電話號碼格式 170
7.3.3 字元串的替換 172
7.3.4 情景應用二——應用正則表達式實現UBB使用幫助 173
7.3.5 字元串的分割 173
7.4 實戰練習 174
7.4.1 正則表達式驗證用戶
7.4.1 注冊信息的合理性 174
7.4.2 正則表達式驗證提交的
7.4.1 購買數量是否是正整數 176
7.5 本章小結 177
第8章 初探數組 178
8.1 數組概述 179
8.2 數組類型 179
8.3 聲明數組 180
8.3.1 用戶創建數組 180
8.3.2 函數創建數組 181
8.3.3 創建二維數組 181
8.4 遍歷、輸出數組 182
8.4.1 遍歷數組 183
8.4.2 輸出數組元素 184
8.5 PHP的數組函數 185
8.5.1 統計數組元素個數 185
8.5.2 向數組中添加元素 185
8.5.3 獲取數組中最後一個元素 186
8.5.4 刪除數組中重復元素 186
8.5.5 獲取數組中指定元素的鍵名 186
8.5.6 字元串與數組的轉換 187
8.5.7 情景應用——讀取網上調查中的數據 188
8.6 PHP的全局數組 189
8.6.1 $_SERVER[ ]全局數組 189
8.6.2 $_GET[ ]和$_POST[ ]全局數組 190
8.6.3 $_COOKIE全局數組 190
8.6.4 $_ENV[ ]全局數組 191
8.6.5 $_REQUEST[ ]全局數組 191
8.6.6 $_SESSION[ ]全局數組 191
8.6.7 $_FILES[ ]全局數組 191
8.6.8 情景應用——$_FILES[ ]全局數組在文件上傳中的應用 191
8.7 實戰練習 193
8.7.1 生成在線考試題 193
8.7.2 通過獲取客戶端IP地址限制投票次數 193
8.8 本章小結 195
第9章 日期與時間 196
9.1 PHP的時間觀念 197
9.1.1 在PHP.INI文件中設置時區 197
9.1.2 通過date_default_timezone_set函數設置時區 197
9.2 UNIX時間戳 198
9.2.1 獲取任意日期、時間的時間戳 198
9.2.2 獲取當前時間戳 199
9.2.3 日期、時間轉換為UNIX時間戳 199
9.3 日期和時間處理 201
9.3.1 格式化日期和時間 201
9.3.2 獲取日期和時間信息 202
9.3.3 檢驗日期和時間的有效性 203
9.4 情景應用 204
9.4.1 獲取系統當前時間和時間戳 204
9.4.2 比較兩個時間的大小 204
9.4.3 倒計時 205
9.5 實戰練習 205
9.5.1 計算程序的運行時間 205
9.5.2 網頁鬧鍾 206
9.6 本章小結 207
第二篇 核心篇
第10章 文件和目錄處理技術 210
10.1 基本的文件處理技術 211
10.1.1 打開一個文件 211
10.1.2 讀取文件內容 214
10.1.3 向文件中寫入數據 218
10.1.4 關閉文件指針 220
10.2 目錄操作技術 220
10.2.1 打開指定目錄 220
10.2.2 讀取目錄結構 221
10.2.3 關閉目錄指針 222
10.3 文件的上傳技術 223
10.3.1 開啟文件上傳功能 223
10.3.2 全局變數$_FILES應用 224
10.3.3 將上傳文件移動到指定目錄 225
10.3.4 文件下載技術 226
10.4 情景應用 227
10.4.1 通過文本文件統計網站訪問量 227
10.4.2 規范化的文件上傳 229
10.5 實戰練習 231
10.5.1 從文本文件中讀取注冊服務條款 231
10.5.2 規范化的多文件上傳 232
10.6 本章小結 233
第11章 圖形圖像處理技術 234
11.1 了解GD2函數庫 235
11.2 設置GD2函數庫 235
11.3 學習常用的圖像處理技術 235
11.3.1 創建畫布 236
11.3.2 顏色處理 237
11.3.3 繪制文字 237
11.3.4 輸出圖像 239
11.3.5 銷毀圖像 240
11.3.6 情景應用一——在照片上書寫文字 240
11.3.7 情景應用二——GD2函數生成圖像驗證碼 241
11.4 運用Jpgraph類庫繪制圖像 242
11.4.1 Jpgraph類庫簡介 242
11.4.2 Jpgraph的安裝 242
11.4.3 情景應用一——柱狀圖展示2010年第一季度編程詞典銷量 243
11.4.4 情景應用二——折線圖分析2010年公司銷售額 245
11.4.5 情景應用三——多餅形圖分析2010年圖書銷量 246
11.5 實戰練習 248
11.5.1 GD2函數生成帶有干擾線的圖像驗證碼 248
11.5.2 Jpgraph創建折線圖分析圖書銷售走勢 249
11.5.3 Jpgraph創建3D餅形圖展示部門業績比較 250
11.6 本章小結 251
第12章 Cookie和會話控制 252
12.1 會話的操作 253
12.1.1 創建會話 253
12.1.2 配置PHP的會話 255
12.2 會話的高級應用 259
12.2.1 SESSION臨時文件 259
12.2.2 SESSION緩存 259
12.2.3 SESSION資料庫存儲 261
12.3 Cookie的操作 263
12.3.1 設置Cookie 264
12.3.2 訪問Cookie 265
12.3.3 刪除Cookie 266
12.4 情景應用 267
12.4.1 登錄驗證 267
12.4.2 Cookie自動登錄 269
12.5 實戰練習 270
12.5.1 防止頁面刷新 270
12.5.2 控制客戶端Cookie 271
12.6 本章小結 272
第13章 面向對象 273
13.1 一切皆是對象 274
13.1.1 什麼是類 274
13.1.2 對象的由來 274
13.1.3 面向對象的特點 275
13.2 類的聲明 275
13.2.1 類的定義 275
13.2.2 成員屬性 276
13.2.3 成員方法 277
13.3 類的實例化 277
13.3.1 創建對象 278
13.3.2 訪問類中成員 278
13.3.3 特殊的訪問方法——「$this」和「::」 279
13.3.4 構造方法和析構方法 280
13.4 面向對象的封裝特性 281
13.4.1 public(公共成員) 282
13.4.2 private(私有成員) 282
13.4.3 protected(保護成員) 283
13.5 面向對象的繼承特性 283
13.5.1 類的繼承——extends關鍵字 283
13.5.2 類的繼承——parent::關鍵字 284
13.5.3 覆蓋父類方法 285
13.6 抽象類和介面 286
13.6.1 抽象類 286
13.6.2 介面 287
13.7 面向對象的多態性 289
13.7.1 通過繼承實現多態 289
13.7.2 通過介面實現多態 290
13.8 面向對象的關鍵字 290
13.8.1 final關鍵字 291
13.8.2 static關鍵字——聲明靜態類成員 291
13.8.3 clone關鍵字——克隆對象 292
13.8.4 對象比較 293
13.8.5 instanceof關鍵字——對象類型檢測 293
13.9 面向對象的魔術方法 293
13.9.1 _set()和_get()方法 294
13.9.2 _isset()和_unset()方法 294
13.9.3 _call()方法 294
12.9.4 _toString()方法 295
13.9.5 _autoload()方法 295
13.9.6 情景應用一——封裝一個資料庫連接類 296
13.9.7 情景應用二——封裝一個資料庫操作類 297
13.10 實戰練習 298
13.10.1 分頁類 299
13.10.2 萬用表格 300
13.11 本章小結 301
第14章 MySQL資料庫設計 302
14.1 MySQL概述 303
14.1.1 MySQL的特點 303
14.1.2 SQL和MySQL 303
14.2 MySQL伺服器的啟動和關閉 304
14.2.1 啟動MySQL伺服器 304
14.2.2 連接MySQL伺服器 305
14.2.3 關閉MySQL伺服器 305
14.3 操作MySQL資料庫 306
14.3.1 創建新資料庫 306
14.3.2 選擇指定資料庫 306
14.3.3 刪除指定資料庫 306
14.4 操作MySQL數據表 307
14.4.1 創建一個表 307
14.4.2 查看數據表結構 308
14.4.3 修改數據表結構 309
14.4.4 重命名數據表 310
14.4.5 刪除指定數據表 310
14.5 操作MySQL數據 311
14.5.1 向數據表中添加數據(INSERT) 311
14.5.2 更新數據表中數據(UPDATE) 312
14.5.3 刪除數據表中數據(DELETE) 312
14.5.4 查詢數據表中數據 313
14.5.5 情景應用一——數據排序 316
14.5.6 情景應用二——limit控制輸出數據的開始位置和記錄數 316
14.6 MySQL數據類型 316
14.6.1 數字類型 317
14.6.2 字元串類型 317
14.6.3 日期和時間數據類型 319
14.7 用phpMyAdmin管理MySQL資料庫 319
14.7.1 管理資料庫 319
14.7.2 管理數據表 320
14.7.3 管理數據記錄 322
14.7.4 導入/導出數據 324
14.8 實戰練習 325
14.8.1 批量添加記錄(LOAD DATA和MYSQLIMPORT) 325
14.8.2 在phpMyAdmin中重置MySQL伺服器登錄密碼 326
14.9 本章小結 326
第15章 資料庫編程技術 327
15.1 PHP操作MySQL資料庫的步驟 328
15.2 PHP操作MySQL資料庫的方法 329
15.2.1 mysql_connect()函數連接MySQL伺服器 329
15.2.2 mysql_select_db()函數選擇MySQL資料庫 330
15.2.3 mysql_query()函數執行SQL語句 330
15.2.4 mysql_fetch_array()函數將結果集返回到數組中 331
15.2.5 mysql_fetch_row()函數從結果集中獲取一行作為枚舉數組 333
15.2.6 mysql_num_rows()函數獲取查詢結果集中的記錄數 333
15.3 管理MySQL資料庫中的數據 334
15.3.1 向資料庫中添加數據 334
15.3.2 編輯資料庫數據 335
15.3.3 從資料庫中刪除數據 336
15.3.4 批量數據操作 336
15.4 情景應用 337
15.4.1 通用查詢 337
15.4.2 分組統計 338
15.4.3 對查詢結果分頁顯示 339
15.4.4 站內搜索 340
15.5 實戰練習 341
15.5.1 對查詢結果進行跳轉分頁顯示 341
15.5.2 高級查詢 341
15.6 本章小結 342
第三篇 高級篇
第16章 PDO資料庫抽象層 346
16.1 什麼是PDO 347
16.1.1 PDO概述 347
16.1.2 PDO特點 347
16.1.3 安裝PDO 347
16.2 PDO連接資料庫 348
16.2.1 PDO構造函數 348
16.2.2 情景應用一——連接MySQL資料庫 348
16.2.3 情景應用二——連接MS SQL Server資料庫 349
16.2.4 情景應用三——連接Oracle資料庫 350
16.3 PDO中執行SQL語句 350
16.3.1 exec()方法 351
16.3.2 query()方法 351
16.3.3 預處理語句——prepare()和execute() 352
16.3.4 情景應用一——通過PDO向資料庫中添加數據 353
16.3.5 情景應用二——通過PDO更新資料庫中數據 354
16.4 PDO中獲取結果集 355
16.4.1 fetch()方法 355
16.4.2 fetchAll()方法 357
16.4.3 fetchColumn()方法 358
16.5 PDO中捕獲SQL語句中的錯誤 359
16.5.1 使用默認模式——PDO::ERRMODE_SILENT 359
16.5.2 使用警告模式——PDO::ERRMODE_WARNING 360
16.5.3 使用異常模式——PDO::ERRMODE_EXCEPTION 361
16.6 PDO中錯誤處理 362
16.6.1 errorCode()方法 362
16.6.2 errorInfo()方法 363
16.7 PDO中事務處理 364
16.8 PDO中存儲過程 366
16.9 實戰練習 367
16.9.1 PDO讀取MS SQL Server資料庫中數據 367
16.9.2 PDO讀取Oracle資料庫中數據 368
16.10 本章小結 369
第17章 ADODB資料庫抽象層 370
17.1 ADODB概述 371
17.1.1 ADODB的優點與缺點 371
17.1.2 ADODB的安裝與操作流程 371
17.2 連接資料庫系統和資料庫 372
17.2.1 連接資料庫系統——ADONewConnection()函數 372
17.2.2 資料庫持久化連接——PConnect()函數 372
17.2.3 資料庫非持久化連接——Connect()函數 372
17.2.4 情景應用一——ADODB連接MySQL資料庫 373
17.2.5 情景應用二——ADODB連接Access資料庫 374
17.2.6 情景應用三——ADODB連接MS SQL Server資料庫 374
17.2.7 情景應用四——ADODB連接Oracle資料庫 375
17.3 通過公共變數控制數據的存取方式 376
17.4 ADODB執行SQL語句 377
17.4.1 執行SQL語句——execute()函數 377
17.4.2 控制SELECT查詢語句的起始位置——SelectLimit()函數 378
17.4.3 添加、更新數據——GetInsertSQL()、GetUpdateSQL()函數 379
17.4.4 操作SQL語句的其他方法 380
17.5 ADODB控制結果集 380
17.5.1 控制指針的方法 381
17.5.2 控制結果集內容的方法 382
17.5.3 日期格式和數據類型的轉換 383
17.6 ADODB中的分頁 384
17.6.1 ADODB分頁函數 384
17.6.2 一個小巧的分頁函數——ADODB_Pager()函數 385
17.7 ADODB中的錯誤處理 386
17.7.1 ADODB中的錯誤處理函數 386
17.7.2 ADODB中自定義的錯誤處理機制 387
17.7.3 情景應用——通過日誌文件存儲錯誤信息 388
17.8 ADODB中的事務處理 389
17.9 實戰練習 390
17.9.1 封裝ADODB連接資料庫類 390
17.9.2 封裝ADODB操作資料庫類 391
17.9.3 封裝ADODB分頁類 392
17.9.4 通過事務處理機制保證數據轉換的順利完成 393
17.10 本章小結 395
第18章 PHP的字元編碼 396
18.1 了解網頁字元編碼 397
18.1.1 ASCII 字元集 397
18.1.2 ISO 8859 字元集 397
18.1.3 GB2312與GBK編碼 398
18.1.4 Unicode字元集 398
18.1.5 UTF-8編碼 398
18.2 PHP網頁的字元編碼 399
18.2.1 設置編碼格式 399
18.2.2 轉換編碼格式 400
18.2.3 檢測字元串的編碼 402
18.3 PHP開發中的亂碼問題 403
18.3.1 解決頁面中的亂碼問題 403
18.3.2 資料庫中的字元集編碼問題 405
18.3.3 避免截取中文字元串時出現亂碼 406
18.4 PHP區域化設置 407
18.4.1 PHP網頁的區域化 407
18.4.2 使用setlocale()函數設置區域化 408
18.5 實戰練習 409
18.5.1 避免截取超長文本時出現亂碼 409
18.5.2 了解PHP編碼規則 410
18.5.3 了解PHP編碼風格 410
18.6 本章小結 412
第19章 程序調試與錯誤處理 413
19.1 基本調試策略 414
19.2 常見錯誤分析 414
19.2.1 語法錯誤 414
19.2.2 定義錯誤 417
19.2.3 邏輯錯誤 418
19.2.4 運行錯誤 419
19.2.5 環境錯誤 421
19.3 PHP.INI中的錯誤處理機制 422
19.3.1 控制錯誤顯示及顯示方式 423
19.3.2 控制錯誤的級別 423
19.4 程序調試方法 424
19.4.1 應用DIE語句調試 424
19.4.2 應用mysql_error()語句輸出錯誤信息 425
19.4.3 應用try{}catch{}M語句拋出並捕獲異常 425
19.5 錯誤處理技巧 427
19.5.1 隱藏錯誤 427
19.5.2 自定義錯誤頁面 427
19.5.3 延長伺服器執行時間——處理超時錯誤 428
19.6 情景應用 429
19.6.1 如何分析、解決PHP與MySQL連接錯誤 429
19.6.2 解決資料庫亂碼問題 431
19.7 實戰練習 432
19.7.1 封裝屬於自己的異常處理類 432
19.7.2 使用錯誤處理器記錄日誌 433
19.8 本章小結 434
第20章 Smarty模板技術 435
20.1 走進Smarty模板引擎 436
20.1.1 Smarty模板引擎下載 437
20.1.2 Smarty模板引擎安裝 437
20.1.3 Smarty模板引擎配置 437
20.1.4 情景應用一——走進Smarty模板引擎 439
20.1.5 情景應用二——封裝Smarty模板的配置方法 440
20.2 Smarty模板設計——靜態頁處理 442
20.2.1 基本語法(注釋、函數和屬性) 442
20.2.2 Smarty模板設計變數 443
20.2.3 變數調節器 444
20.2.4 情景應用一——Smarty模板中日期、時間的格式化輸出 445
20.2.5 情景應用二——通過組合修改器分隔多個變數調節器 445
20.2.6 內建函數(動態文件、模板文件的包含和流程式控制制語句) 446
20.2.7 情景應用三——Smarty模板創建網頁框架 448
20.2.8 情景應用四——section語句循環輸出資料庫中的數據 450
20.2.9 自定義函數 451
20.2.10 配置文件 454
20.3 Smarty程序設計——動態文件操作 455
20.3.1 SMARTY_PATH常量 455
20.3.2 Smarty程序設計變數 455
20.3.3 Smarty方法 456
20.3.4 Smarty緩存 456
20.3.5 情景應用——開啟網站注冊頁面的緩存 458
20.4 實戰練習 460
20.4.1 Smarty+ADODB完成數據的分頁輸出 460
20.4.2 Smarty中通過truncate方法截取字元串 461
20.4.3 用Register_Function方法注冊模板函數 462
20.4.4 Smarty模板中的關鍵字描紅 464
20.5 本章小結 464
第四篇 實戰篇
第21章 企業網站開發模板 466
21.1 明日企業網概述 467
21.2 開發背景 467
21.3 需求分析 467
21.4 功能結構 468
21.5 資料庫設計 469
21.5.1 資料庫概念設計 469
21.5.2 創建資料庫及數據表 470
21.6 技術攻關 471
21.6.1 Smarty模板 471
21.6.2 最簡單的網頁框架 473
21.6.3 ADODB類庫 473
21.6.4 封裝分頁類 474
21.7 首頁設計 475
21.7.1 首頁概述 475
21.7.2 首頁技術分析 476
21.7.3 首頁的實現過程 476
21.8 產品展示設計 478
21.8.1 產品展示概述 478
21.8.2 產品展示技術分析 478
21.8.3 產品展示實現過程 479
21.9 後台管理系統設計 480
21.9.1 後台管理系統概述 481
21.9.2 後台管理系統技術分析 481
21.9.3 後台管理系統實現過程 482
21.10 程序調試與錯誤處理 486
21.10.1 SQL語句的返回機制 486
21.10.2 錯誤處理 487
21.11 開發總結 488
附錄 專業術語表 489
② php包括web前端么 以後分別是負責怎麼樣的工作
PHP和WEB前端的工作原理
1、PHP是屬於動態語言,主要處理本地和伺服器的命令解析並且輸出給用戶
2、WEB前端屬於靜態語言,主要的工作是直接展現效果給瀏覽者
③ APS,PHP都是什麼意思
APS技術的組成
ASP硬碟保護技術,是由內嵌於主板上的加速度感應晶元和預裝在系統中的震動預測管理軟體組成。通過對ThinkPad本本的角度、震動、撞擊的監測(即對橫縱加速度變化的監測),來決定是否將硬碟磁頭從工作狀態收回到磁頭停止區,從而減小撞擊對硬碟的損害,保護硬碟及硬碟內的數據。震動預測管理軟體從加速感應晶元中接收到相應的信號,通過分析判斷出哪些是對硬碟有害的,哪些是規律性的運動。震動預測管理軟體會忽略對硬碟不能造成傷害的規律性運動,而對於可能會對硬碟造成損害的運動,震動預測管理軟體會立刻將信息傳遞給硬碟,使磁頭迅速收回到停止區。當本本處於關機狀態或系統處於啟動狀態時,APS功能並不會被啟動。
APS技術的工作原理
當筆記本電腦硬碟工作時,硬碟磁頭在磁碟上方運動,進行數據讀取,當撞擊力在持續2毫秒內小於200G時,一般可以靠ThinkPad本本本身的外殼與防震設計來減震,避免對硬碟造成損害。而當撞擊力在持續2毫秒內超過200G後,損害將會隨著撞擊能量的加大而加大。
硬碟處於非工作狀態時,磁頭處於停止區,硬碟在1毫秒內最大可以承受800G的沖擊。當撞擊超過800G/1毫秒後,損害將會隨著撞擊能量的加大而加大(見圖右邊的函數圖)。也就是說如果可以及時將硬碟磁頭歸位到停止區,則硬碟可以忍受比在工作狀態下更大的沖擊而不受損害。IBM APS技術就是基於上述原理,在預測到有可能發生撞擊後,及時地將磁頭移動到停止區以保護硬碟。
根據大量實際調查顯示,筆記本電腦在工作狀態下跌落的情況絕大部分是從桌面或膝蓋上跌落,即從120cm以下高度跌落(通常人的膝蓋高度為50cm,桌面高度為80cm),如何能在ThinkPad本本發生撞擊之前就將磁頭歸位,成為了問題的關鍵所在。
1.磁頭歸位的時間問題
經測試,磁頭的歸位時間從接到控制信號到完成操作,根據磁頭所處的磁軌位置不同,大約為100毫秒到500毫秒。對於20cm高度內自由下落的情況,一般可以靠筆記本電腦的外殼與防震設計抵禦撞擊力,所以我們僅需要關注20cm以上的跌落情況。而筆記本電腦從20cm至120cm高度掉落下來的時間是202毫秒至495毫秒,再加上筆記本電腦掉落之前的短暫延遲時間,試驗表明通常預計發生的時間會多於下跌時間。這就保證磁頭能在筆記本電腦發生撞擊之前及時歸位,有效地保護磁碟。
2.沖擊力問題
筆記本電腦要承受怎樣的撞擊,硬碟才會受到超過800G的沖擊力呢?我們知道,硬碟受到的沖擊力是由多項因素決定的。首先是筆記本電腦下落的相對高度與初始速率,而一般筆記本電腦在工作狀態下跌落的情況絕大部分是從膝蓋或桌面上跌落到地板上,相對高度不超過120cm,垂直方向的初始速率基本可以忽略不計;其次是筆記本電腦撞擊的表面,硬質無彈性的表面(如水泥地板)可以造成更大的沖擊力,軟質有彈性的表面(如木地板或鋪著地毯的地板)可以略微緩沖碰撞,從而造成較小的沖擊;再次是筆記本電腦本身的外殼設計和防震設計。
為了量化在各種情況下硬碟受到的沖擊力,IBM實驗室特別針對從膝蓋上跌落和從桌面上跌落兩種情景進行了大量的實際測試。相關實驗數據顯示,從膝蓋高度(50cm)或從桌面高度(80cm)翻落到硬質無彈性的水泥地板上,由於有外殼以及沖擊吸收墊保護,硬碟受到的沖擊力超過200G的幾率約為50%,而超過800G的幾率不超過2%。
3.規律性顛簸問題
APS功能一旦開啟,就一直在監測ThinkPad本本的運動。但用戶常常需要移動辦公,如在汽車、火車或飛機等交通工具上使用筆記本電腦,因此顛簸是在所難免的,這些震動要是常觸發APS使磁頭歸位,則ThinkPad用戶在使用本本時就會感到本本運行是斷斷續續的,影響了工作效率。不過APS技術已經考慮到這個問題,它具有忽略重復震動的功能,能消除移動用戶的顧慮。交通工具顛簸造成的沖擊力一般並不足以損害硬碟,所以大多數的顛簸都不會觸發APS功能使磁頭歸位,從而有效保證了ThinkPad用戶使用筆記本電腦的流暢性。
智能化的震動預測、有提前量的磁頭歸位操作,APS的這些重要特性都保證了ThinkPad本本的硬碟以及盤內數據不會輕易受到各種撞擊的影響。
php
PHP,一個嵌套的縮寫名稱,是英文超級文本預處理語言(PHP:Hypertext Preprocessor)的縮寫。PHP 是一種 HTML 內嵌式的語言,PHP與微軟的ASP頗有幾分相似,都是一種在伺服器端執行的嵌入HTML文檔的腳本語言,語言的風格有類似於C語言,現在被很多的網站編程人員廣泛的運用。PHP 獨特的語法混合了 C、java、Perl 以及 PHP 自創新的語法。它可以比 CGI 或者 Perl 更快速的執行動態網頁。用PHP做出的動態頁面與其他的編程語言相比,PHP是將程序嵌入到HTML文檔中去執行,執行效率比完全生成HTML標記的CGI要高許多;與同樣是嵌入HTML文檔的腳本語言JavaScript相比,PHP在伺服器端執行,成分利用了伺服器的性能;PHP執行引擎還會將用戶經常訪問的PHP程序駐留在內存中,其他用戶在一次訪問這個程序時就不需要誠信編譯程序了,只要直接執行內存中的代碼就可以了,這也是PHP高效率的體現之一。PHP具有非常強大的功能,所有的CGI或者JavaScript的功能PHP都能實現,而且支持幾乎所有流行的資料庫以及操作系統。
PHP 最初是1994年Rasmus Lerdorf創建的,剛剛開始只是一個簡單的用Perl語言編寫的程序,用來統計他自己網站的訪問者。後來又用C語言重新編寫,包括可以訪問資料庫。在1995年以Personal Home Page Tools (PHP Tools) 開始對外發表第一個版本,Lerdorf寫了一些介紹此程序的文檔,並且發布了PHP1.0。在這早期的版本中,提供了訪客留言本、訪客計數器等簡單的功能。以後越來越多的網站使用了PHP,並且強烈要且增加一些特性,比如循環語句和數組變數等等,在新的成員加入開發行列之後,在1995年中,PHP2.0發布了。第二版定名為PHP/FI(Form Interpreter)。PHP/FI加入了對mSQL的支持,從此建立了PHP在動態網頁開發上的地位。到了1996年底,有15000個網站使用 PHP/FI;時間到了1997年中,使用PHP/FI的網站數字超過五萬個。而在1997年中,開始了第三版的開發計劃,開發小組加入了 Zeev Suraski 及 Andi Gutmans,而第三版就定名為PHP3。2000年,PHP4.0又問世了,其中增加了許多新的特性。
PHP的特性包括:
開放的源代碼:所有的PHP源代碼事實上都可以得到。
PHP是免費的。
基於伺服器端:由於PHP是運行在伺服器端的腳本,可以運行在UNIX、LINUX、WINDOWS下。
嵌入HTML:因為PHP可以嵌入HTML語言,所以學習起來並不困難。
簡單的語言:PHP堅持腳本語言為主,與Java以C++不同。
效率高:PHP消耗相當少的系統資源。
圖像處理:用PHP動態創建圖像
PHP 3與PHP 4的比較
PHP3跟Apache伺服器緊密結合的特性;加上它不斷的更新及加入新的功能;而且幾乎支持所有主流與非主流資料庫;再以它能高速的執行效率,使得PHP在1999年中的使用站點已經超過了150000萬。加上它的源代碼完全公開,在 Open Source意識抬頭的今天,它更是這方面的中流砥柱。不斷地有新的函數庫加入,以及不停地更新的活力,使得PHP無論在UNIX、LINUX或是Windows的平台上都可以有更多新的功能。它提供豐富的函數,使得在程序設計方面有著更好的支持。
PHP4.0整個腳本程序的核心大幅更動,讓程序的執行速度,滿足更快的要求。在最佳化之後的效率,已較傳統CGI或者ASP等程序有更好的表現。而且還有更強的新功能、更豐富的函數庫。無論您接不接受,PHP 都將在 Web CGI 的領域上,掀起巔覆性的革命。對於一位專業的Web Master 而言,它將也是必修課程之一。
PHP 4.0是更有效的,更可靠的動態Web頁開發工具,在大多數情況運行比 PHP 3.0要快,其腳本描述更強大並且更復雜, 最顯著的特徵是速率比的增加。PHP4.0這些優異的性能是PHP 腳本引擎重新設計產生的結果:引擎由 AndiGutmans 和 Zeev Suraski從底層全面重寫。PHP4.0 腳本引擎 ——Zend 引擎,使用了一種更有效的編譯——執行方式, 而不是PHP 3.0 採用的執行 ——當解析時模型。
PHP4在3.0版的基礎上增加或增強了許多有用的特徵,主要如下:
(1)別名:在PHP4中,可以利用引用為變數賦值,這給編程帶來了很大的靈活性。
(2)擴充了API 模塊:PHP 4.0 為擴展的 API 模塊的提供了擴展PHP介面模塊, 它比舊的 API 版本顯著地快。 PHP 模塊已有的及最常用的介面多數被轉換到使用這個擴展的介面。
(3)自動資源釋放:PHP4增加了引用計數功能,這種新技術的引入使PHP4具有了自動內存管理功能,減輕了開發人員的負擔。
(4)布爾類型:PHP 4.0 支持布爾類型。
(5)進程生成:在 UNIX 環境下的 PHP 4.0 提供了一個很智能和通用的生成進程, 使用了一種名為基於automake/libtool的系統生成技術。
(6)COM/DCOM 支持:PHP 4.0 提供 COM/DCOM 支持 ( 僅用於Windows 環境 ) 可以無縫地存取和訪問 COM 對象。
(7)與PHP 3.0 兼容性很好:PHP 4.0 是與 PHP 3.0 代碼向後兼容性接近100% 。由於 PHP 4 的改進的體系結構,兩者有一些細微的差別,但是大多數人將可能永遠不可能遇上這種情況。
PHP介紹
(8)配置:PHP4重新設計和增強了PHP。ini文件,這使得用PHP。ini來配置PHP顯得極為容易,這個文件可以在運行時被Apache(unix系統)或由Windows 注冊(Windows 環境)。
(9)加密支持:PHP4實現了完整的加密, 這些加密功能是一個完整的mycrypt庫,並且 PHP 4.0 支持哈希函數。Blowfish,TripleDES,MD5,並且SHA1 也是可使用的一些加密演算法。
(10)類型檢查:PHP 4.0 支持同一操作符用於評類型檢查:===( 3 等號運算符 ), 為在兩個值和其類型之間作檢查。例如, 3 ===3 將視為假 ( 類型是不同的 ), 而 3 ==3 ( 相等判斷 ) 將視為真。
(11)FTP 支持:PHP 4.0 支持 FTP 。通常, 你會為通過一個數據機連接下載一個大文件提供一個介面。然而, 如果你確實有需要,可以使用PHP 。
(12)PHP4新增函數或功能增強函數:PHP 4.0 新增了許多函數,同時也將許多現有的函數功能進行了增強,以下是一些例子。 array_count_values() eval() foreach() nclude() ob_end_clean() ob_end_flush() ob_get_contents() ob_start() strip_tags() unset()
(13)here列印:PHP 4.0 的Here列印是與Perl類似的, 盡管完全不相同。Here是列印大容量文章的一個有用的方法,例如在 HTML文件中,不會漏掉任何一個字元,例如目錄標記。
(14)HTTP Session fallback 系統:為 HTTP Session管理的一個 fallback 系統在 PHP 4.0被實現 。預設情況下,Session標識符由cookies存儲。如果沒有cookies支持或一項cookies任務失敗,Session標識符自動被創建並在 URL 的查詢字元串中被攜帶。
(15)ISAPI 支持:PHP 4.0 能作為一個個性化的 ISAPI 模塊作為 IIS插件 。這比 PHP 3.0 更有效, 它作為一個外部的程序來運行。
(16)內存:PHP 4.0 能更有效的使用內存, 導致較少的內存佔用消耗,這主要歸功於引用計數技術的實現。
(17)其他類成員函數:在 PHP 4.0 你能在成員函數本身的作用域或全局范圍內調用其他類的成員函數。例如,你能用一個子函數覆蓋父函數,並在子函數中調用父函數。
(18)多維數組:在 PHP 4.0 ,利用GET,POST,Cookies的進行的數據傳輸支持多維數組。
(19)個性化的 HTTP Session支持:HTTP Session處理, 包括 fallback 系統管理,在 PHP 4.0被它的新庫函數實現 。在版本 3.0 中處理Session要求使用 PHPLIB 和第三方的庫函數, 它比把Session直接地由 PHP 支持慢了許多。
(20)個性化的 Java 支持:PHP 4.0 支持和java的交互。這種個性化的Java 支持為PHP 在 Java 對象上創建和使用方法提供一個簡單並且有效的工具。
21)對象和數嵌套組:PHP 4.0 實現了功能更加強大的對象, 移去了 PHP 3.0存在的種種句法限制。對象能在數組以內被嵌套並且反過來也如此, 可以根據你的需要實現嵌套。
(22)面向對象的編程:PHP 4.0 為面向對象的編程和構造類及對象提供擴展的功能和新特徵。PHP4實現了對象重載,引用技術等新技術。
(23)對象重載支持:對象重載語法允許第三方的基於面向對象的類庫使用 PHP4 的面向對象的特徵存取他們自身的功能。使用這個特徵的一個 COM 模塊已經被實現了。
(24)輸出緩沖支持:PHP 提供了一個輸出緩沖函數集合。輸出緩沖支持允許你寫包裹函數功能壓縮緩沖區。在 PHP4 的輸出緩沖支持允許 HTML 頭信息存放, 無論 HTML的正文是否輸出。頭信息( (header(), content type, and cookies ) 不採用緩沖 。
(25)增加了PCRE 庫:PHP 4.0 包括一個 Perl 兼容的正則表達式 (PCRE ) 庫, 和正常regex庫一起與 PHP 綁定。split 和replace PCRE 功能被支持。PCRE 和 Perl 正規表達式之間有一些細微差別。
(26)PHP.ini 文件:PHP.ini文件在 PHP4.0 被重新設計, 使用的 PHP 的配置PHP.ini是更容易並且更有效的。全部文件能被Apache 在運行時間操作 ( 在 Apache環境 下 ) 或由 Windows 注冊表 ( 在 Windows 下面 ) 。被加入PHP.ini文件的配置指令自動地在所有相關的模塊中被支持。
(27)引用計數:PHP 4.0 為系統中的每個數值提供了引用計數, 包括資源。一旦一個資源不再被任何變數引用,它自動地被釋放以節省內存資源。利用這個特徵的最明顯的例子一個內置SQL查詢的循環語句。在PHP 3.0中 ,每次遞歸另外的 SQL 結果集合重復申請內存,直到腳本執行完畢,這些結果集合佔用的內存才被釋放。
(28)支持引用:通過引用可以改變一個變數的值。
(29)函數的運行時綁定:PHP 4.0 的運行時間綁定功能允許你在他們被聲明以前調用, 無論聲明是否在代碼以後或是在運行時間。
(30)類的運行時信息:PHP 4.0 支持在運行時刻存取下列類信息:一個對象的類名,一個對象的父類的類名字,以及對象函數所在的名字。
(31)伺服器抽象層:為支持Web伺服器提供了增強型 SAPI ( 伺服器 API ) 介面,是 PHP 4。0 不可分的一部分。這個伺服器抽象層,提供了通用的WEB伺服器介面支持,支持多線程WEB伺服器,為大多數的WEB伺服器提供透明的支持, 這些伺服器包括 Apache ,IIS ( ISAPI ), 以及 AOL 伺服器。
(32)語法的點亮顯示:PHP 4.0 語法的點亮顯示允許開發者看見源代碼而不是腳本, 這個功能比PHP 3。0中的更有效。它跑得更快,更執行得更好,並且產生更緊湊的HTML代碼。
(33)由引用改變變數的值:PHP 4.0 由引用支持可變的賦值, 「關聯」的2個變數之中個的任何一個的值被改變,另外的變數的值同樣被改變,這類似與C中的指針類型。
(34)在引用字元串中的變數引用:PHP 4.0 增強了在引用字元串中的變數引用。
PHP 在資料庫方面的豐富支持,也是它迅速走紅的原因之一,它支持下列的資料庫或是數據文件:
· Adabas D
· DBA
· dBase
· dbm
· filePro
· Informix
· InterBase
· mSQL
· Microsoft SQL Server
· MySQL
· Solid
· Sybase
· ODBC
· Oracle 8
· Oracle
· PostgreSQL
而在 Internet 上它也支持了相當多的通訊協議 (protocol),包括了與電子郵件相關的 IMAP, POP3;網管系統 SNMP;網路新聞 NNTP;帳號共用 NIS;全球信息網 HTTP 及 Apache 伺服器;目錄協議 LDAP 以及其它網路的相關函數。
除此之外,用 PHP 寫出來的 Web 後端 CGI 程序,可以很輕易的移植到不同的操作系統上。例如,先以 Linux 架的網站,在系統負荷過高時,可以快速地將整個系統移到 SUN 工作站上,不用重新編譯 CGI 程序。面對快速發展的 Internet,這是長期規劃的最好選擇。
一個PHP實例
<html>
<head>
<title>First program</title>
</head>
<body>
<?php
echo "hello, worldn";
?>
</body>
</html>
④ php模板引擎工作中,loop的工作原理是什麼我知道模板中的數據是用替換功能做的。但是不知道模板
你是指循環嗎?還是使用替換實現循環功能,每個模板引擎的語法都可能不同,下面是我隨便定的模板語法
例如模板中是
{loop:var:k}
......
{/loop}
使用引擎替換成
<?php foreach( $var as $k) { ?>
......
<?php } ?>
就實現了對數組$var循環了。
⑤ PHP分頁原理是怎麼樣的
1、前言
分頁顯示是一種非常常見的瀏覽和顯示大量數據的方法,屬於web編程中最常處理的事件之一。對於web編程的老手來說,編寫這種代碼實在是和呼吸一樣自然,但是對於初學者來說,常常對這個問題摸不著頭緒,因此特地撰寫此文對這個問題進行詳細的講解,力求讓看完這篇文章的朋友在看完以後對於分頁顯示的原理和實現方法有所了解。本文適合初學者閱讀,所有示例代碼均使用php編寫。
2、原理
所謂分頁顯示,也就是將資料庫中的結果集人為的分成一段一段的來顯示,這里需要兩個初始的參數:
每頁多少條記錄($PageSize)?
當前是第幾頁($CurrentPageID)?
現在只要再給我一個結果集,我就可以顯示某段特定的結果出來。
至於其他的參數,比如:上一頁($PreviousPageID)、下一頁($NextPageID)、總頁數($numPages)等等,都可以根據前邊這幾個東西得到。
以mysql資料庫為例,如果要從表內截取某段內容,sql語句可以用:select * from table limit offset, rows。看看下面一組sql語句,嘗試一下發現其中的規率。
前10條記錄:select * from table limit 0,10
第11至20條記錄:select * from table limit 10,10
第21至30條記錄:select * from table limit 20,10
……
這一組sql語句其實就是當$PageSize=10的時候取表內每一頁數據的sql語句,我們可以總結出這樣一個模板:
select * from table limit ($CurrentPageID - 1) * $PageSize, $PageSize
拿這個模板代入對應的值和上邊那一組sql語句對照一下看看是不是那麼回事。搞定了最重要的如何獲取數據的問題以後,剩下的就僅僅是傳遞參數,構造合適的sql語句然後使用php從資料庫內獲取數據並顯示了。以下我將用具體代碼加以說明。
3、簡單代碼
請詳細閱讀以下代碼,自己調試運行一次,最好把它修改一次,加上自己的功能,比如搜索等等。
<?php
// 建立資料庫連接
$link = mysql_connect("localhost", "mysql_user", "mysql_password")
or die("Could not connect: " . mysql_error());
// 獲取當前頁數
if( isset($_GET['page']) ){
$page = intval( $_GET['page'] );
}
else{
$page = 1;
}
// 每頁數量
$PageSize = 10;
// 獲取總數據量
$sql = "select count(*) as amount from table";
$result = mysql_query($sql);
$row = mysql_fetch_row($result);
$amount = $row['amount'];
// 記算總共有多少頁
if( $amount ){
if( $amount < $page_size ){ $page_count = 1; } //如果總數據量小於$PageSize,那麼只有一頁
if( $amount % $page_size ){ //取總數據量除以每頁數的余數
$page_count = (int)($amount / $page_size) + 1; //如果有餘數,則頁數等於總數據量除以每頁數的結果取整再加一
}else{
$page_count = $amount / $page_size; //如果沒有餘數,則頁數等於總數據量除以每頁數的結果
}
}
else{
$page_count = 0;
}
// 翻頁鏈接
$page_string = '';
if( $page == 1 ){
$page_string .= '第一頁|上一頁|';
}
else{
$page_string .= '<a href="/?page=1>";第一頁</a>|<a href="/?page='."($page-1).'>上一頁</a>|';
}
if( ($page == $page_count) || ($page_count == 0) ){
$page_string .= '下一頁|尾頁';
}
else{
$page_string .= '<a href="/?page='."($page+1).'>下一頁</a>|<a href="/?page='."$page_count.'>尾頁</a>';
}
// 獲取數據,以二維數組格式返回結果
if( $amount ){
$sql = "select * from table order by id desc limit ". ($page-1)*$page_size .", $page_size";
$result = mysql_query($sql);
while ( $row = mysql_fetch_row($result) ){
$rowset[] = $row;
}
}else{
$rowset = array();
}
// 沒有包含顯示結果的代碼,那不在討論范圍,只要用foreach就可以很簡單的用得到的二維數組來顯示結果
?>
4、OO風格代碼
以下代碼中的資料庫連接是使用的pear db類進行處理
<?php
// FileName: Pager.class.php
// 分頁類,這個類僅僅用於處理數據結構,不負責處理顯示的工作
Class Pager
{
var $PageSize; //每頁的數量
var $CurrentPageID; //當前的頁數
var $NextPageID; //下一頁
var $PreviousPageID; //上一頁
var $numPages; //總頁數
var $numItems; //總記錄數
var $isFirstPage; //是否第一頁
var $isLastPage; //是否最後一頁
var $sql; //sql查詢語句
function Pager($option)
{
global $db;
$this->_setOptions($option);
// 總條數
if ( !isset($this->numItems) )
{
$res = $db->query($this->sql);
$this->numItems = $res->numRows();
}
// 總頁數
if ( $this->numItems > 0 )
{
if ( $this->numItems < $this->PageSize ){ $this->numPages = 1; }
if ( $this->numItems % $this->PageSize )
{
$this->numPages= (int)($this->numItems / $this->PageSize) + 1;
}
else
{
$this->numPages = $this->numItems / $this->PageSize;
}
}
else
{
$this->numPages = 0;
}
switch ( $this->CurrentPageID )
{
case $this->numPages == 1:
$this->isFirstPage = true;
$this->isLastPage = true;
break;
case 1:
$this->isFirstPage = true;
$this->isLastPage = false;
break;
case $this->numPages:
$this->isFirstPage = false;
$this->isLastPage = true;
break;
default:
$this->isFirstPage = false;
$this->isLastPage = false;
}
if ( $this->numPages > 1 )
{
if ( !$this->isLastPage ) { $this->NextPageID = $this->CurrentPageID + 1; }
if ( !$this->isFirstPage ) { $this->PreviousPageID = $this->CurrentPageID - 1; }
}
return true;
}
/***
*
* 返回結果集的資料庫連接
* 在結果集比較大的時候可以直接使用這個方法獲得資料庫連接,然後在類之外遍歷,這樣開銷較小
* 如果結果集不是很大,可以直接使用getPageData的方式獲取二維數組格式的結果
* getPageData方法也是調用本方法來獲取結果的
*
***/
function getDataLink()
{
if ( $this->numItems )
{
global $db;
$PageID = $this->CurrentPageID;
$from = ($PageID - 1)*$this->PageSize;
$count = $this->PageSize;
$link = $db->limitQuery($this->sql, $from, $count); //使用Pear DB::limitQuery方法保證資料庫兼容性
return $link;
}
else
{
return false;
}
}
/***
*
* 以二維數組的格式返回結果集
*
***/
function getPageData()
{
if ( $this->numItems )
{
if ( $res = $this->getDataLink() )
{
if ( $res->numRows() )
{
while ( $row = $res->fetchRow() )
{
$result[] = $row;
}
}
else
{
$result = array();
}
return $result;
}
else
{
return false;
}
}
else
{
return false;
}
}
function _setOptions($option)
{
$allow_options = array(
'PageSize',
'CurrentPageID',
'sql',
'numItems'
);
foreach ( $option as $key => $value )
{
if ( in_array($key, $allow_options) && ($value != null) )
{
$this->$key = $value;
}
}
return true;
}
}
?>
<?php
// FileName: test_pager.php
// 這是一段簡單的示例代碼,前邊省略了使用pear db類建立資料庫連接的代碼
require "Pager.class.php";
if ( isset($_GET['page']) )
{
$page = (int)$_GET['page'];
}
else
{
$page = 1;
}
$sql = "select * from table order by id";
$pager_option = array(
"sql" => $sql,
"PageSize" => 10,
"CurrentPageID" => $page
);
if ( isset($_GET['numItems']) )
{
$pager_option['numItems'] = (int)$_GET['numItems'];
}
$pager = @new Pager($pager_option);
$data = $pager->getPageData();
if ( $pager->isFirstPage )
{
$turnover = "首頁|上一頁|";
}
else
{
$turnover = "<a href='?page=1&numItems=".$pager->numItems."'>首頁</a>|<a href="/?page=".$pager->PreviousPageID."&numItems=".$pager->numItems."'>上一頁</a>|";
}
if ( $pager->isLastPage )
{
$turnover .= "下一頁|尾頁";
}
else
{
$turnover .= "<a href="/?page=".$pager->NextPageID."&numItems=".$pager->numItems."'>下一頁</a>|<a href="/?page=".$pager->numPages."&numItems=".$pager->numItems."'>尾頁</a>";
}
?>
需要說明的地方有兩個:
這個類僅僅處理數據,並不負責處理顯示,因為我覺得將數據的處理和結果的顯示都放到一個類里邊實在是有些勉強。顯示的時候情況和要求多變,不如自己根據類給出的結果處理,更好的方法是根據這個Pager類繼承一個自己的子類來顯示不同的分頁,比如顯示用戶分頁列表可以:
<?php
Class MemberPager extends Pager
{
function showMemberList()
{
global $db;
$data = $this->getPageData();
// 顯示結果的代碼
// ......
}
}
/// 調用
if ( isset($_GET['page']) )
{
$page = (int)$_GET['page'];
}
else
{
$page = 1;
}
$sql = "select * from members order by id";
$pager_option = array(
"sql" => $sql,
"PageSize" => 10,
"CurrentPageID" => $page
);
if ( isset($_GET['numItems']) )
{
$pager_option['numItems'] = (int)$_GET['numItems'];
}
$pager = @new MemberPager($pager_option);
$pager->showMemberList();
?>
第二個需要說明的地方就是不同資料庫的兼容性,在不同的資料庫里截獲一段結果的寫法是不一樣的。
mysql: select * from table limit offset, rows
pgsql: select * from table limit m offset n
......
所以要在類里邊獲取結果的時候需要使用pear db類的limitQuery方法。
ok,寫完收功,希望花時間看完這些文字的你不覺得是浪費了時間。
⑥ php底層原理 php是如何運行的
1、PHP動態語言執行過程:拿到一段代碼後,經過詞法解析、語法解析等階段後,源程序會被翻譯成一個個指令(opcodes),然後ZEND虛擬機順次執行這些指令完成操作。PHP本身是用C實現的,因此最終調用的也是C的函數,實際上,我們可以把PHP看做一個C開發的軟體。
2、PHP的4層運行體系:
(1)Zend引擎:Zend整體用純C實現,是PHP的內核部分,他將PHP代碼翻譯(詞法、語法解析等一系列編譯過程)為可執行opcode的處理並實現相應的處理方法、實現了基本的數據結構(如:hashtable、OO)、內存分配機制及管理、提供了相應的api方法供外部調用,是一切的核心,所有的外圍功能均圍繞Zend實現。
(2)Extensions:圍繞著Zend引擎,extensions通過組件式的方式提供各種基礎服務,我們常見的各種內置函數(array系列)、標准庫等都是通過extension來實現,用戶也可以根據需要實現自己的extension的典型應用)。
(3)Sapi:Sapi全稱,也就是服務端應用編程介面,Sapi通過一系列鉤子函數,使得PHP可以和外圍交互數據,這是PHP非常優雅和成功的設計,通過sapi成功的將PHP本身和上層應用解耦隔離,PHP可以不再考慮如何針對不同應用進行兼容,而應用本身也可以針對自己的特點實現不同的處理方式。
(4)上層應用:這就是我們平時編寫的PHP程序,通過不同的spai方式得到各種各樣的應用模式,如何通過webserver實現web應用、在命令行下已腳本方式運行等等。
⑦ php和apache工作原理
- - 1000個人。那要看你的伺服器支持多大的流量了!你覺得1000個人。你的小電腦不會爆伺服器么、至於怎麼工作。就要學習網路基礎了。網路中的請求響應。和數據包的發送。
⑧ php如何把自身進程設置為系統進程
進程管理-防止進程成為僵屍進程
創建好了進程,那麼怎麼對子進程進行管理呢?
使用信號,對子進程的管理,一般有兩種情況:(推薦學習:PHP編程從入門到精通)
posix_kill():此函數並不能顧名思義,它通過向子進程發送一個信號來操作子進程,在需要要時可以選擇給子進程發送進程終止信號來終止子進程;
pcntl_waitpid():等待或返回fork的子進程狀態,如果指定的子進程在此函數調用時已經退出(俗稱僵屍進程),此函數將立刻返回,並釋放子進程的所有系統資源,此進程可以避免子進程變成僵屍進程,造成系統資源浪費;
孤兒進程:父進程掛了,子進程被pid=1的init進程接管(wait/waitpid),直到子進程自身生命周期結束被系統回收資源和父進程 採取相關的回收操作
僵屍進程:子進程exit退出,父進程沒有通過wait/waitpid獲取子進程狀態,子進程佔用的進程號等描述資源符還存在,產生危害:例如進程號是有限的,無法釋放進程號導致未來可能無進程號可用
**父進程中使用:pcntl_wait或者pcntl_waitpid的目的就是防止worker成為僵屍進程
作用:使用pcntl_wait()後,在子進程死掉後,父進程也會被停止**
最後我們通過下圖來簡單的總結和描述這個多進程實現的過程:
.png
進程管理-進程間通信
隊列:如Redis,推薦
socket:推薦
管道:實現復雜,且管道(pipe),使用文件形式存在,存在硬碟IO性能瓶頸
信號:承載信息量少,不好管理
進程管理-切換為守護進程
使用&實現
php deadloop.php &
相關資源:Nginx使用的php-fpm的兩種進程管理方式及優化-其它代碼類資源...
打開CSDN APP,看更多技術內容
php 進程管理,PHP 進程管理器 PHP-FPM_阿喵看海外的博客
php-fpm是PHP的一個進程管理器。php下面的眾多work進程皆有php-fpm進程管理器管理。 php-fpm的工作原理 php-fpm全名是PHP FastCGI進程管理器。php-fpm啟動後會先讀php.ini,然後再讀相應的conf配置文件,conf配置可以覆蓋php.ini的配置。
繼續訪問
php-fpm解讀-進程管理的三種模式_april2nd的博客_php-fpm...
php-fpm進程管理一共有三種模式:ondemand、static、dynamic,我們可以在同一個fpm的master配置三種模式,看下圖1。php-fpm的工作模式和nginx類似,都是一個master,多個worker模型。每個worker都在accept本pool內的監聽套接字(linux已不存在驚...
繼續訪問
淺談PHP進程管理
這篇文章是對之前一篇文章的補充和改進, 創建一個主(master)進程,主進程安裝定時器,每隔5分鍾檢測一次隊列長度,根據隊列長度計算需要的worker進程, 然後創建或者殺掉子進程。這樣做的好處是防止隊列堆積,任務得不到及時處理。更新業務代碼,只需要reload操作即可。 整個流程有以下知識點: 創建守護進程的步驟: 設置默認文件許可權 fork一個進程,父進程退出 調用setsid創建一個新的會話 將當前工作目錄更改為根目錄 關閉不再需要的文件描述符 使用信號實現定時器 上一篇定時器依賴於系統的定時任務,這次使用鬧鍾信號實現,php 5.3.0以下的版本依賴於ticks,
php 腳本 fpm緩存,PHP生命周期及fpm(FastCGI進程管理器)的運作方式
PHP在web方式中如何改了文件就立即生效的,重要的幾個概念:sapi: 可以簡單的理解為php引擎對外的一個統一介面,使得php可以和外部程序進行交互php的生命周期中關鍵四個調用: MINT -> RINT -> RSHUTDOWN -> MSHUTDOWNfpm: fastcgi進程管理器fpm方式的流程就是:fpm通過sapi介面與php進程交互1.fpm啟動會調用各擴展...
繼續訪問
Linux下搭建PHP開發環境,Php-Fpm進程管理。_黑夜開發者的博客
目前PHP項目開發幾種比較流行的架構搭建中,LNMP在性能方面是最好的,正因為如此,使得LNMP架構逐漸流行起來,今天,前面提到了Nginx部署,由於項目實際環境的需要,今天就在說一下怎麼部署PHP。 環境 ...
繼續訪問
php而為,為高負載而生的 PHP 進程管理器 —— PHP-PM (PPM)
PHP-PM 可以用於php應用程序的進程管理,增壓和負載均衡.它使用 ReactPHP 實現php的事件驅動和非阻塞I/O。 它是基於 ReactPHP,最好是工作在基於請求-響應式的框架,像Symfony的HTTPKernel。這樣做是為了減少php啟動(包括變數聲明,載入和...
繼續訪問
最新發布 php進程管理
php 進程管理 tasks 過多
繼續訪問
PHP進程實現&管理
運行環境為Linux,模式為CLI DEMO /*要創建的子進程*/ $manager = [ 'work1', 'work2', 'work3', ]; /*當前進程名稱*/ $status = file_exists('/proc/' . getmypid() . '/status'); $bash = '-'; if ($status) { $bash = file('/proc/' . getmypid() . '/status', FILE_IGNORE.
繼續訪問
php的管理進程管理利器--php-fpm_weixin_33778778的博客
mod_php 模式是將php模塊安裝到apache中,所以每一次apache結束的請求呢,都會產生一條進程,這個進程就完整的包括php的各種運算計算等操作。 從圖中我們很清晰的可以看到,apache每接收一個請求,都會產生一個進程來連接php通過sapi來完成請求...
繼續訪問
php-frm進程管理,PHP內核探索-進程管理
進程管理方式首先我們了解一下php的三種不同的進程管理方式:static:靜態管理進程。在啟動時,master按照pm.max_children配置fork出對應數量的work進程,即work的進程是固定不變的。dynamic:動態管理進程。在fpm啟動時先按照pm.start_servers初始化一定數量的work進程,運行期間如果master發現空閑work進程低於pm.min_spare_s...
繼續訪問
理解php-fpm的兩種執行方式
前段時間配置php-fpm的時候,無意間發現原來他還有兩種執行方式。與Apache一樣,他的進程數也是可以根據設置分為動態和靜態的。關於Apache的工作方式及對應的設置方法,我已經在《Ubuntu下配置Apache的Worker模式》一文中寫出,這里不再多說。 而php-fpm也是同樣存在兩種方式,一種是直接開啟指定數量的php-fpm進程,不再增加或者減少;另一...
繼續訪問
php進程原理_PHP進程管理器php-fpm的工作原理
PHP進程管理器php-fpm的工作原理發布時間:2020-07-21 17:46:39來源:億速雲閱讀:133作者:小新今天小編給大家分享的是PHP進程管理器php-fpm的工作原理,相信很多人都不太了解,為了讓大家更加了解,所以給大家總結了以下內容,一起往下看吧。一定會有所收獲的哦。php-fpm是什麼php-fpm是PHP的一個進程管理器。php下面的眾多work進程皆有php-fpm進程管...
繼續訪問
如何管理php常駐進程,一看就懂系列之 如何實現與控制php常駐進程-Go語言中文社區...
前言關於如何實現與控制php常駐進程,不管是google還是上進行搜索,都沒有感覺看起來賞心悅目的解答,於是決定自己動手總結下。有同學會問了,整這個干甚?簡單的說就是,可以讓一個php腳本一直處於運行的狀態。從而實現將項目中某些耗時操作非同步化,進隊列後由php腳本取出再執行。有同學又會問了,直接在伺服器直接命令「php test.php &」,不就可以實現了?那麼這樣做的話有三點...
繼續訪問
PHP-FPM(PHP進程管理器)
PHP-FPM
繼續訪問
php 進程管理,從 0 到 1 優雅的實現 PHP 多進程管理
_| |_ __ __ _ _ __ _ _| |_ ___| '_ \ / _` | '__| | | | __/ _ \| | | | (_| | | | |_| | || (_) ||_| |_|\__,_|_| \__,_|\__\___/ .TIGERB.cnAn object-oriented multi process manager for PHPVersion: 0...
繼續訪問
php-fpm進程管理的三種模式
轉載自 php-fpm解讀-進程管理的三種模式 —程序媛大麗 標明轉載以示尊重 感謝原作者的分享。 php-fpm進程管理一共有三種模式:ondemand、static、dynamic,我們可以在同一個fpm的master配置三種模式,看下圖1。php-fpm的工作模式和nginx類似,都是一個master,多個worker模型。每個worker都在accept本pool內的監聽套接字(linu...
繼續訪問
php 進程管理那點事
之前本地開發和環境一直用的集成環境,最近新項目 集成了php7+nginx 跑了一段時間發現偶爾 有php進程退出的情況 排查原因 nginx log: 1111 upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after ...
繼續訪問
從0到1優雅的實現PHP多進程管理
_ | | _ __ __ _ _ __ _ _| |_ ___ | '_ \ / _` | '__| | | | __/ _ \ | | | | (_| | | | |_| | || (_) | |_| |_|\__,_|_| \__,_|\__\___/ ...
繼續訪問
熱門推薦 php-fpm安裝、配置與優化
轉載自:https://www.zybuluo.com/phper/note/89081 1、php中fastcgi和php-fpm是什麼東西 最近在研究和學習php的性能方面的知識,看到了factcgi以及php-fpm,發現我對他們是少之又少的理解,可以說幾乎是一無所知,想想還是蠻可怕的。決定仔細的學習一下關於這方面的知識。 參考和學習了以下文章: 1. mod_php和
繼續訪問
php-fpm的兩種進程管理模式
php-fpm的兩種進程管理模式 php-fpm的進程數也是可以根據設置分為動態和靜態的。 一種是直接開啟指定數量的php-fpm進程,不再增加或者減少; 另一種則是開始的時候開啟一定數量的php-fpm進程,當請求量變大的時候,動態的增加php-fpm進程數到上限,當空閑的時候自動釋放空閑的進程數到一個下限。 這兩種不同的執行方式,可以根據伺服器的實際需求來進行調整。 這里先說一下涉及
繼續訪問
7、Php-Fpm進程管理
1、進程管理 php-fpm採用的是master-worker的進程方式。其中, master負責監聽埠,等待鏈接;其次,注冊信號,可以通過信息好master進行管理 worker負責處理具體的邏輯 如下圖所示 2、信號管理 master進程可以理解如下信號 信號 含義 INT, TERM 立刻終止 ...
繼續訪問
php進程式控制制
簡介 PHP的進程式控制制支持實現了Unix方式的進程創建, 程序執行, 信號處理以及進程的中斷。 進程式控制制不能被應用在Web伺服器環境,當其被用於Web服務環境時可能會帶來意外的結果。 這份文檔用於闡述每個進程式控制制函數的通常用法。關於Unix進程式控制制的更多信息建議您查閱 系統文檔中關於fork(2),waitpid(2),signal(2)等的部分或更全面的參考資料比如 《Unix環境高級編程》
繼續訪問
php進程管理
php 進程管理
⑨ PHP 的 require函數
require()是php的內置函數,作用是引入或者包含外部php文件。
工作原理:當本身php文件被執行時,則外部文件的內容就將被包含進該自身php文件中;當包含的外部文件發生錯誤時,系統將拋出錯誤提示,並且停止php文件的執行。
注意:使用require時,一個文件存在錯誤的話,那麼程序就會中斷執行了,並顯示致命錯誤。
比如cl.php,ts.php兩個文件,ts.php要用到cl.php文件中的函數,需要在ts.php中引入或者包含cl.php即可.示例如下:
cl.php
<?php
functionshow(){
echo"cl.php文件中的show方法被調用了!";
}
?>
ts.php
<?php
require'cl.php';
show();
?>
運行結果:
⑩ php 二次開發的原理是什麼
二次開發就是在前人開發完成的基礎上,添加一些自己所需要的新的功能;對前人開發的代碼盡可能的不去修改,容易引起蝴蝶效應!二次開發可以大量的節省開發所需的時間,節省大量的項目開發開銷。