37 1234
发新话题
打印

PHP与MySQL 5程序设计(第2版)

PHP与MySQL 5程序设计(第2版)

当前章节:目录
第1章  PHP概述...... 1
1.1  历史..... 1
1.1.1 PHP 4.. 2
1.1.2 PHP 5.. 3
1.2  PHP的一般特性..... 3
1.2.1 实用性..... 3
1.2.2 强大功能..... 4
1.2.3 可选择性..... 4
1.2.4 成本..... 5
1.3  小结..... 5
第2章  安装配置Apache和PHP... 6
2.1 安装..... 6
2.1.1 获得发行包..... 6
2.1.2 安装过程..... 7
2.1.3 测试安装..... 11
2.1.4 定制UNIX构建..... 12
2.1.5 定制Windows构建..... 12
2.1.6 常见错误..... 13
2.1.7 查看并下载文档..... 13
2.2 配置..... 13
2.2.1 管理PHP的配置指令..... 14
2.2.2 PHP的配置指令..... 15
2.3 小结..... 29
第3章  PHP基础...... 30
3.1 界定PHP代码..... 30
3.1.1 默认语法..... 30
3.1.2 短标记..... 31
3.1.3 脚本..... 31
3.1.4 ASP风格..... 32
3.1.5 嵌入多个代码块..... 32
3.2 注释..... 32
3.2.1 单行C++语法..... 32
3.2.2 Shell语法..... 32
3.2.3 多行C语法..... 33
3.3 输出..... 33
3.3.1 print()... 33
3.3.2 echo()... 34
3.3.3 printf()... 34
3.3.4 sprintf()... 35
3.4 数据类型..... 35
3.4.1 标量数据类型..... 35
3.4.2 复合数据类型..... 37
3.4.3 特殊数据类型..... 38
3.4.4 类型强制转换..... 38
3.4.5 类型自动转换..... 39
3.4.6 与类型有关的函数..... 40
3.4.7 类型标识符函数..... 40
3.5 标识符..... 41
3.6 变量..... 41
3.6.1 变量声明..... 42
3.6.2 变量作用域..... 43
3.6.3 PHP的超级全局变量..... 45
3.6.4 变量的变量..... 48
3.7 常量..... 49
3.8 表达式..... 49
3.8.1 操作数..... 50
3.8.2 操作符..... 50
3.9 字符串插入..... 54
3.9.1 双引号..... 55
3.9.2 单引号..... 55
3.9.3 Heredoc.. 56
3.10 控制结构..... 56
3.10.1 执行控制语句..... 57
3.10.2 条件语句..... 57
3.10.3 循环语句..... 59
3.10.4 文件包含语句..... 63
3.10.5 require_once()... 65
3.11 小结..... 65
第4章  函数...... 66
4.1 调用函数..... 66
4.2 创建函数..... 66
4.2.1 按值传递参数..... 67
4.2.2  按引用传递参数..... 68
4.2.3 默认参数值..... 68
4.2.4 可选参数..... 68
4.2.5 从函数返回值..... 69
4.2.6 嵌套函数..... 70
4.2.7 递归函数..... 70
4.2.8 变量函数..... 72
4.3 函数库..... 73
4.4 小结..... 74
第5章  数组...... 75
5.1 什么是数组..... 75
5.2 输出数组..... 76
5.3 创建数组..... 77
5.4 测试数组..... 79
5.5 增加和删除数组元素..... 79
5.6 定位数组元素..... 81
5.7 遍历数组..... 82
5.8 确定数组大小和唯一性..... 85
5.9 数组排序..... 86
5.10 合并、拆分、接合和分解数组..... 91
5.11 其他有用的数组函数..... 95
5.12 小结..... 96
第6章  面向对象的PHP... 97
6.1 OOP的好处..... 97
6.1.1 封装..... 97
6.1.2 继承..... 98
6.1.3 多态..... 98
6.2 关键的OOP概念..... 99
6.2.1 类..... 99
6.2.2 对象..... 99
6.2.3 字段..... 100
6.2.4 属性..... 102
6.2.5 常量..... 104
6.2.6 方法..... 105
6.3 类型提示..... 108
6.4 构造函数和析构函数..... 108
6.4.1 构造函数..... 108
6.4.2 析构函数..... 110
6.5 静态类成员..... 111
6.6 instanceof关键字..... 112
6.7 辅助函数..... 112
6.8 自动加载对象..... 114
6.9 小结..... 114
第7章  高级OOP特性...... 115
7.1 PHP不支持的高级OOP特性..... 115
7.2 对象克隆..... 116
7.2.1 克隆示例..... 116
7.2.2 __clone()方法..... 117
7.3 继承..... 118
7.3.1 类继承..... 118
7.3.2 继承和构造函数..... 120
7.4 接口..... 121
7.4.1 实现一个接口..... 122
7.4.2 实现多个接口..... 123
7.5 抽象类..... 124
7.6 反射..... 124
7.6.1 编写ReflectionClass类..... 125
7.6.2 编写ReflectionMethod类..... 127
7.6.3 编写ReflectionParameter类..... 128
7.6.4 编写ReflectionProperty类..... 129
7.6.5 反射的其他用途..... 130
7.7 小结..... 130
第8章  错误和异常处理...... 131
8.1 配置指令..... 131
8.2 错误日志..... 134
8.3 异常处理..... 135
8.3.1 为什么异常处理很方便..... 136
8.3.2 PHP的异常处理实现..... 137
8.4 小结..... 140
第9章  字符串和正则表达式...... 141
9.1 复杂(大括号)偏移语法..... 141
9.2 正则表达式..... 142
9.2.1 正则表达式语法(POSIX)..... 142
9.2.2 PHP的正则表达式函数
(POSIX扩展)..... 144
9.2.3 正则表达式语法(Perl风格)..... 146
9.3 其他字符串函数..... 151
9.3.1 确定字符串长度..... 152
9.3.2 比较两个字符串..... 152
9.3.3 处理字符串大小写..... 154
9.3.4 字符串与HTML相互转换..... 155
9.3.5 正则表达式函数的替代函数..... 159
9.3.6 填充和剔除字符串..... 164
9.3.7 字符和单词计数..... 165
9.4 使用PEAR:Validate_US... 167
9.4.1 安装Validate_US... 167
9.4.2 使用Validate_US... 168
9.5 小结..... 168
第10章  处理文件和操作系统...... 169
10.1 了解文件和目录..... 169
10.1.1 解析目录路径..... 169
10.1.2 文件类型和链接..... 171
10.1.3 计算文件、目录和磁盘大小..... 173
10.1.4 访问和修改时间..... 175
10.2 文件所有权和权限..... 176
10.3 文件I/O.... 178
10.3.1 资源的概念..... 178
10.3.2 换行..... 178
10.3.3 文件末尾..... 178
10.3.4 打开和关闭文件..... 179
10.3.5 读取文件..... 180
10.3.6 移动文件指针..... 184
10.3.7 写入文件..... 184
10.3.8 读取目录内容..... 185
10.4 执行Shell命令..... 186
10.5 系统级程序执行..... 187
10.5.1 清理输入..... 187
10.5.2 PHP的程序执行函数..... 188
10.6 小结..... 190
第11章  PEAR.... 191
11.1 流行的PEAR包..... 191
11.2 安装和更新PEAR... 193
11.2.1 安装PEAR... 193
11.2.2 PEAR和ISP公司..... 194
11.2.3 更新PEAR... 194
11.3 使用PEAR包管理器..... 194
11.3.1 查看安装的包..... 195
11.3.2 了解安装包的更多信息..... 195
11.3.3 安装PEAR包..... 196
11.3.4 使用PEAR包..... 197
11.3.5 升级PEAR包..... 198
11.3.6 卸载PEAR包..... 198
11.3.7 降级PEAR包..... 199
11.4 小结..... 199
第12章  日期和时间...... 200
12.1 UNIX时间戳..... 200
12.2 PHP的日期和时间库..... 200
12.3 日期函数..... 206
12.3.1 显示本地化的日期和时间..... 206
12.3.2 显示网页的最新修改日期..... 209
12.3.3 确定当前月份中的天数..... 209
12.3.4 计算当前日期后X天的日期..... 209
12.3.5 创建日历..... 210
12.4 PHP 5.1.. 213
12.4.1 Date基础..... 213
12.4.2 Date构造函数..... 213
12.4.3 访问方法和修改方法..... 214
12.4.4 验证函数..... 216
12.4.5 处理方法..... 216
12.5 小结..... 222
第13章  表单和导航提示...... 223
13.1  PHP和Web表单..... 223
13.1.1  简单示例..... 224
13.1.2  向函数传递表单数据..... 225
13.1.3  处理多值表单组件..... 226
13.1.4  用PHP生成表单..... 227
13.1.5  自动选择表单数据..... 228
13.1.6  PHP、Web表单和
JavaScript. 229
13.2  导航提示..... 231
13.2.1  用户友好的URL... 231
13.2.2  “面包屑型”轨迹..... 233
13.2.3  创建定制错误处理函数..... 237
13.3  小结..... 238
第14章  身份认证...... 239
14.1  HTTP认证概念..... 239
14.2  PHP认证..... 240
14.2.1  认证变量..... 240
14.2.2  认证方法..... 241
14.3  用户登录管理..... 248
14.3.1  密码指派..... 248
14.3.2  使用CrackLib库测试密码
易猜性..... 250
14.3.3  一次性URL和密码恢复..... 251
第15章  处理文件上传...... 254
15.1  通过HTTP协议上传文件..... 254
15.2  通过PHP处理上传..... 255
15.2.1  PHP的文件上传/资源指令..... 255
15.2.2  $_FILES数组..... 256
15.2.3  PHP的文件上传函数..... 256
15.2.4  上传错误消息..... 258
15.2.5  文件上传示例..... 258
15.3  利用PEAR:HTTP_Upload... 261
15.3.1  安装HTTP_Upload... 261
15.3.2  了解关于上传文件的更多
信息..... 262
15.3.3  将上传的文件移动到最终
目标..... 263
15.3.4  上传多个文件..... 263
15.4  小结..... 264
第16章  网络...... 265
16.1  DNS、服务器和服务..... 265
16.1.1  DNS... 265
16.1.2  服务..... 268
16.1.3      建立套接字连接..... 269
16.2  邮件..... 271
16.2.1  配置指令..... 271
16.2.2  发送纯文本电子邮件..... 272
16.2.3  使用额外的信息首部发送
电子邮件..... 272
16.2.4  将电子邮件发送给多个
接收者..... 273
16.2.5  发送HTML格式的电子邮件..... 273
16.2.6  发送附件..... 274
16.3  IMAP、POP3和NNTP... 275
16.3.1  需求..... 276
16.3.2  建立和关闭连接..... 276
16.3.3  了解更多关于邮箱和邮件
的信息..... 277
16.3.4  获取邮件..... 280
16.3.5  写邮件..... 286
16.3.6  发送邮件..... 286
16.3.7  邮箱管理..... 287
16.3.8  邮件管理..... 288
16.4  流..... 288
16.4.1  流包装器和上下文..... 289
16.4.2  流过滤器..... 290
16.5  常见网络任务..... 291
16.5.1  连接一台服务器..... 291
16.5.2  端口扫描器..... 292
16.5.3  子网转换器..... 293
16.5.4  测试用户带宽..... 294
16.6  小结..... 295
第17章  PHP和LDAP... 296
17.1  LDAP介绍..... 297
17.2  在PHP中使用LDAP... 297
17.2.1  连接到LDAP服务器..... 297
17.2.2  绑定到LDAP服务器..... 298
17.2.3  关闭LDAP服务器连接..... 299
17.2.4  获取LDAP数据..... 299
17.2.5  处理项值..... 301
17.2.6  统计所获取的项..... 302
17.2.7  获取属性..... 302
17.2.8  排序和比较LDAP项..... 305
17.2.9  处理项..... 306
17.2.10  回收内存..... 308
17.2.11  插入LDAP数据..... 309
17.2.12  更新LDAP数据..... 309
17.2.13  删除LDAP数据..... 310
17.2.14  配置函数..... 311
17.2.15  字符编码..... 312
17.2.16  处理区分名..... 312
17.2.17  错误处理..... 313
17.3  小结..... 314
第18章  会话处理器...... 315
18.1  什么是会话处理..... 315
18.1.1  cookie.. 315
18.1.2  URL重写..... 316
18.1.3  会话处理过程..... 316
18.2  配置指令..... 317
18.3  关键概念..... 320
18.3.1  开始会话..... 320
18.3.2  销毁会话..... 321
18.3.3  获取和设置会话ID.... 321
18.3.4  创建和删除会话变量..... 321
18.3.5  编码和解码会话数据..... 322
18.4  实际的会话处理示例..... 324
18.4.1  自动登录..... 324
18.4.2  最近浏览的文档索引..... 325
18.5  创建定制会话处理器..... 327
18.5.1  将定制会话函数加入到PHP
逻辑..... 327
18.5.2  基于MySQL的定制会话
处理器..... 328
18.6  小结..... 330
第19章  用Smarty模板化...... 331
19.1  什么是模板化引擎..... 331
19.2  Smarty介绍..... 333
19.3  安装Smarty.. 333
19.4  使用Smarty.. 334
19.5  Smarty的表现逻辑..... 336
19.5.1  注释..... 336
19.5.2  变量修饰符..... 336
19.5.3  控制结构..... 339
19.5.4  语句..... 342
19.6  创建配置文件..... 344
19.6.1  config_load... 345
19.6.2  引用配置变量..... 345
19.7  结合Smarty使用CSS... 346
19.8  缓存..... 347
19.8.1  处理缓存生命期..... 347
19.8.2  通过is_cached()消除处理
开销..... 348
19.8.3  为每个模板创建多个缓存..... 348
19.8.4  关于缓存的结束语..... 349
19.9  小结..... 350
第20章  Web服务...... 351
20.1  为什么使用Web服务..... 352
20.2  真正简单聚合..... 353
20.2.1  RSS语法..... 355
20.2.2  MagpieRSS... 356
20.3  SimpleXML... 361
20.3.1  SimpleXML函数..... 362
20.3.2  SimpleXML方法..... 363
20.4  SOAP... 365
20.4.1  NuSOAP... 366
20.4.2  PHP 5的SOAP扩展..... 374
20.5  使用PHP Web服务和C#客户..... 381
20.6  小结..... 383
第21章  安全PHP编程...... 384
21.1  安全地配置PHP... 384
21.1.1  安全模式..... 385
21.1.2  其他与安全有关的配置参数..... 386
21.2  隐藏配置细节..... 388
21.3  隐藏敏感数据..... 389
21.3.1  注意文档根目录..... 390
21.3.2  拒绝访问某些文件扩展名..... 390
21.4  清理用户数据..... 390
21.4.1  文件删除..... 390
21.4.2  跨网站脚本..... 391
21.4.3  清理用户输入:解决方案..... 392
21.5  数据加密..... 394
21.5.1  PHP的加密函数..... 394
21.5.2  mhash... 395
21.5.3  MCrypt. 396
21.6  小结..... 397
第22章  SQLite.. 398
22.1  SQLite介绍..... 398
22.1.1  安装SQLite.. 398
22.1.2  使用SQLite命令行界面..... 399
22.2  PHP的SQLite库..... 400
22.2.1  SQLite指令..... 400
22.2.2  打开连接..... 400
22.2.3  在内存中创建表..... 401
22.2.4  关闭连接..... 401
22.2.5  查询数据库..... 402
22.2.6  解析结果集..... 403
22.2.7  获取结果集细节..... 405
22.2.8  操作结果集指针..... 406
22.2.9  了解表模式的更多信息..... 408
22.2.10  操作二进制数据..... 408
22.2.11  创建和覆盖SQLite函数..... 409
22.2.12  创建聚集函数..... 410
22.3  小结..... 411
第23章  PDO介绍...... 412
23.1  为什么还要另一种数据库抽象层..... 413
23.2  使用PDO.... 413
23.2.1  安装PDO.... 414
23.2.2  PDO的数据库支持..... 414
23.2.3  连接到数据库服务器并选择
数据库..... 415
23.2.4  存取属性..... 416
23.2.5  错误处理..... 417
23.2.6  查询执行..... 417
23.2.7  准备语句..... 418
23.2.8  获取数据..... 421
23.2.9  设置绑定列..... 423
23.2.10  事务..... 424
23.3  小结..... 425
第24章  MySQL介绍...... 426
24.1  MySQL为什么如此流行..... 426
24.1.1  灵活性..... 426
24.1.2  强大功能..... 427
24.1.3  灵活的许可选择..... 428
24.1.4  超级活跃的用户群体..... 429
24.2  MySQL 4.. 429
24.3  MySQL 5.. 430
24.4  著名的MySQL用户..... 430
24.4.1  craigslist. 430
24.4.2  雅虎财经..... 431
24.4.3  维基百科..... 431
24.5  小结..... 431
第25章  安装和配置MySQL... 432
25.1  PHP和MySQL许可问题..... 432
25.1.1  Linux.. 433
25.1.2  Windows.. 433
25.2  下载MySQL... 433
25.3  安装MySQL... 434
25.3.1  Linux.. 434
25.3.2  Windows.. 437
25.4  设置MySQL管理员密码..... 439
25.5  启动和停止MySQL... 439
25.5.1  手工控制守护进程..... 439
25.5.2  自动启动和停止MySQL... 441
25.6  配置和优化MySQL... 442
25.6.1  mysqld_safe... 443
25.6.2  配置和优化参数..... 443
25.6.3  my.cnf文件..... 446
25.7  小结..... 448
第26章  众多MySQL客户端...... 449
26.1  标准客户端选项..... 449
26.2  连接选项..... 450
26.3  一般选项..... 450
26.4  mysql... 451
26.4.1  关键mysql选项..... 451
26.4.2  以交互模式使用mysql... 452
26.4.3  查看配置变量和系统状态..... 454
26.4.4  以批处理模式使用mysql... 455
26.4.5  有用的mysql提示..... 456
26.5  mysqladmin... 458
26.6  其他实用工具..... 459
26.6.1  mysqldump... 459
26.6.2  mysqlshow... 459
26.6.3  mysqlhotcopy... 460
26.6.4  mysqlimport... 460
26.6.5  myisamchk... 461
26.6.6  mysqlcheck... 461
26.7  第三方客户端程序..... 462
26.7.1  MySQL管理器..... 462
26.7.2  phpMyAdmin.. 463
26.7.3  MySQL查询浏览器..... 464
26.7.4  Navicat. 465
26.8  小结..... 466
第27章  MySQL存储引擎和数据类型...... 467
27.1  存储引擎..... 467
27.1.1  InnoDB... 468
27.1.2  MyISAM..... 468
27.1.3  MEMORY.... 470
27.1.4  MERGE... 471
27.1.5  BDB... 471
27.1.6  FEDERATED.... 471
27.1.7  ARCHIVE... 472
27.1.8  CSV.... 473
27.1.9  EXAMPLE... 473
27.1.10  BLACKHOLE... 473
27.1.11  存储引擎FAQ.... 473
27.2  数据类型和属性..... 475
27.2.1  数据类型..... 475
27.2.2  数据类型属性..... 479
27.3  操作数据库和表..... 481
27.3.1  操作数据库..... 481
27.3.2  操作表..... 483
27.3.3  修改表结构..... 485
27.3.4  INFORMATION_SCHEMA... 485
27.4  小结..... 487
第28章  保护MySQL的安全...... 488
28.1  首先应当做什么..... 488
28.2  保护mysqld守护进程..... 489
28.3  MySQL访问权限系统..... 489
28.3.1  权限系统的工作方式..... 490
28.3.2  访问信息存储在哪里..... 491
28.4  用户和权限管理..... 498
28.4.1  CREATE USER... 498
28.4.2  DROP USER... 499
28.4.3  RENAME USER... 499
28.4.4  GRANT和REVOKE命令..... 499
28.4.5  查看权限..... 503
28.5  限制用户资源..... 503
28.6  保护MySQL连接..... 504
28.6.1  授权选项..... 504
28.6.2  SSL选项..... 505
28.6.3  启动启用SSL的MySQL
服务器..... 506
28.6.4  使用启用SSL的客户端进行
连接..... 506
28.6.5  在my.cnf文件中存储SSL
选项..... 506
28.7  小结..... 507
第29章  PHP的MySQL扩展...... 508
29.1  预备工作..... 508
29.1.1  在Linux中启用MySQL扩展..... 508
29.1.2  在Windows中启用MySQL
扩展..... 508
29.1.3  用户权限..... 509
29.1.4  示例数据..... 509
29.2  PHP的MySQL命令..... 509
29.2.1  建立和关闭连接..... 509
29.2.2  在单独的文件中存储连接
信息..... 511
29.2.3  保护连接信息..... 511
29.3  选择数据库..... 512
29.4  查询MySQL... 512
29.5  获取和显示数据..... 513
29.6  插入数据..... 516
29.7  修改数据..... 517
29.8  删除数据..... 519
29.9  所选择的记录和受影响的记录..... 520
29.10  获取数据库和表的信息..... 521
29.11  获取字段信息..... 523
29.11.1  查看表属性..... 526
29.11.2  获取错误信息..... 527
29.12  辅助函数..... 528
29.13  小结..... 530
第30章  PHP的mysqli扩展...... 531
30.1  预备工作..... 532
30.1.1  在UNIX中启用mysqli
扩展..... 532
30.1.2  在Windows中启用mysqli
扩展..... 532
30.1.3  示例数据..... 532
30.2  使用mysqli扩展..... 532
30.2.1  连接MySQL服务器..... 532
30.2.2  连接错误报告..... 533
30.2.3  选择一个MySQL数据库..... 535
30.2.4  关闭MySQL连接..... 536
30.3  查询..... 536
30.3.1  查询执行..... 536
30.3.2  回收查询内存..... 537
30.3.3  准备结果集..... 538
30.3.4  解析结果..... 539
30.3.5  多个查询..... 542
30.3.6  准备语句..... 543
30.4  数据库事务..... 548
30.5  小结..... 549
第31章  存储例程...... 550
31.1  应当使用存储例程吗..... 550
31.1.1  存储例程的优点..... 550
31.1.2  存储例程的缺点..... 551
31.2  MySQL如何实现存储例程..... 551
31.2.1  存储例程权限表..... 551
31.2.2  创建存储例程..... 553
31.2.3  声明和设置变量..... 554
31.2.4  执行存储例程..... 555
31.2.5  多语句存储例程..... 556
31.2.6  从另一个例程中调用例程..... 562
31.2.7  修改存储例程..... 563
31.2.8  删除存储例程..... 563
31.2.9  查看例程状态..... 563
31.2.10  查看例程的创建语法..... 564
31.2.11  条件和处理器..... 564
31.3  将例程集成到Web应用程序..... 565
31.3.1  创建员工奖金界面..... 565
31.3.2  获取多条记录..... 566
31.4  小结..... 566
第32章  MySQL触发器...... 567
32.1  介绍触发器..... 567
32.1.1  为什么使用触发器..... 567
32.1.2  在事件前采取行动..... 568
32.1.3  在事件后采取行动..... 568
32.1.4  前触发器和后触发器..... 569
32.2  MySQL对触发器的支持..... 569
32.2.1  创建触发器..... 570
32.2.2  查看现有的触发器..... 571
32.2.3  修改触发器..... 572
32.2.4  删除触发器..... 572
32.2.5  级联触发器..... 573
32.3  将触发器集成到Web应用程序..... 574
32.4  小结..... 575
第33章  视图...... 576
33.1  视图概述..... 576
33.2  MySQL对视图的支持..... 577
33.2.1  创建和执行视图..... 577
33.2.2  查看视图信息..... 581
33.2.3  修改视图..... 582
33.2.4  删除视图..... 583
33.2.5  更新视图..... 583
33.3  将视图结合到Web应用程序中..... 583
33.4  小结..... 585
第34章  实用数据库查询...... 586
34.1  示例数据..... 586
34.2  用PEAR创建表格输出..... 587
34.2.1  安装HTML_align=center ... 587
34.2.2  创建一个简单表..... 587
34.2.3  创建更可读的行输出..... 589
34.2.4  根据数据库数据创建表格..... 589
34.2.5  一般化输出过程..... 591
34.3  排序输出..... 593
34.4  创建分页输出..... 594
34.5  列出页码..... 597
34.6  子查询..... 598
34.6.1  用子查询完成比较..... 599
34.6.2  用子查询确定存在性..... 599
34.6.3  用子查询维护数据库..... 600
34.6.4  在PHP中使用子查询..... 601
34.7  游标..... 601
34.7.1  游标基础..... 601
34.7.2  创建游标..... 602
34.7.3  打开游标..... 602
34.7.4  使用游标..... 602
34.7.5  关闭游标..... 603
34.7.6  在PHP中使用游标..... 604
34.8  小结..... 604
第35章  索引和搜索...... 605
35.1  数据库索引..... 605
35.1.1  主键索引..... 605
35.1.2  唯一索引..... 606
35.1.3  常规索引..... 607
35.1.4  全文索引..... 608
35.1.5  索引最佳实践..... 611
35.2  基于表单的搜索..... 611
35.2.1  执行简单搜索..... 612
35.2.2  扩展搜索功能..... 613
35.2.3  执行全文搜索..... 614
35.3  小结..... 615
第36章  事务...... 616
36.1  什么是事务..... 616
36.2  MySQL的事务功能..... 616
36.2.1  系统需求..... 617
36.2.2  表创建..... 617
36.2.3  InnoDB配置参数..... 618
36.3  示例项目..... 619
36.3.1  示例数据..... 620
36.3.2  执行示例事务..... 620
36.3.3  备份和恢复InnoDB表..... 622
36.3.4  用法提示..... 622
36.4  用PHP构建事务应用程序..... 622
36.5  小结..... 624
第37章  导入和导出数据...... 625
37.1  示例表..... 625
37.2  获得合适的媒介..... 625
37.3  导出数据..... 626
37.4  导入数据..... 628
37.4.1  利用LOAD DATA INFILE导入
数据..... 628
37.4.2  用mysqlimport导入..... 631
37.4.3  用PHP加载表数据..... 633
37.5  小结..... 634
索引(图灵网站下载)
网络无限,生活无限

TOP

当前章节:前言

最好的编程图书应该不是纯粹地讲述理论,而是要切合实际。虽然我没有幻想自己会成为当代最伟大的技术作家,但在写书过程中,我一直都以此为目标,着力让所写的内容能用到实处。以本书的篇幅来看,很明显,我在竭尽所能地提供这种实用性。也就是说,如果你希望获得PHP编程语言和MySQL数据库服务器的实践经验,对它们有全面的了解,并且想知道如何结合这些卓越的技术创建数据库驱动的动态Web应用程序,那么本书正合你所需。
在本书第一版出版后的18个月中,PHP和MySQL社区依旧持续“狂热”地工作着,使得这两项卓越技术又有了显著的发展。因此,这一版增加了很多新内容,篇幅也增加了100多页。这一版总共添加了七章全新的内容,其中三章主要介绍PHP有关的主题,包括PHP扩展与应用库(PEAR)、日期和时间功能以及PHP数据对象(PDO)扩展。另外四章涵盖了PHP 5的mysqli扩展、MySQL 5新的存储例程、触发器和视图功能。此外,所有原来的章节都经过了认真的修订,有些还进行了大幅修改,使第一版的内容得到了更新和改进。
如果你初学PHP,强烈推荐从第1章开始阅读,因为首先要掌握PHP的基础知识,这对于阅读后面的章节很有好处。如果你已经掌握了PHP,但却是第一次接触MySQL,可以考虑从第24章开始阅读。如果对PHP和MySQL都稍有了解或者已经有深入的了解,这些中级和高级读者可以有选择地阅读;毕竟这不是一本浪漫小说。我尽力合理地划分各章的内容,无论你怎么读本书,都能很快地了解各章的主题,而无需先掌握其他章节的内容(除了介绍技术基础知识的章节外)。
另外,不论是新手还是资深的PHP和MySQL开发人员,都能从本书中获益。前面已经提到,我有意将本书组织为一种可以兼作教程和参考书的混合形式。我很清楚你是花自己辛苦挣得的钱来购买本书的,所以我努力将这些内容以合理的方式组织,不仅是在前几次仔细研读时有用,将来也同样会有用。
代码下载
要理解本书介绍的概念,最有效的办法就是使用书中的代码亲自尝试。为方便起见, http://www.apress.com提供了包含所有示例的ZIP文件,可以自由下载。
与我联系!
我非常希望收到读者的来信,与我联系并向我提出建议、意见和问题。可以随时给我发电子邮件:wj@wjgilmore.com。另外,也可经常访问http://www.wjgilmore.com,这里有我最新项目和文章的链接。
致谢
写书是一项艰苦的工作,虽然封面上只出现一位作者的名字,但如果没有大家的努力,本书将不可能出版。
我非常感谢Gary Cornell又给了我一次机会,使我能为这样优秀的计算机图书出版社写书。助理出版人Dominic Shakeshaft在我写书期间,给予了我坚定的支持和鼓励。项目经理Beth Christmas和Laura Cheu在我出现困惑时,充分施展了他们的才华,以极大的耐心为我排忧解难,得以保证本书的出版进度。Matt Wade用其敏锐的目光搜寻着每一处细节,使代码质量得到显著提高。他还帮助我补充了很多内容,许多没有相关文档的PHP和MySQL特性原本在书中并未提及,但在他的帮助下,这些空白已经填补。Bill McManus坚持不懈地将我语无伦次的行文整理得井井有条。编辑Matt Moodie在我即将完稿之际,帮助我进行了后期的审阅。优秀的设计师Kurt Krames又设计出一幅美丽的封面。当然,还有所有其他不仅为此书更为所有Apress图书作出卓越贡献的同仁们,谢谢你们。
我还要真诚地感谢PHP和MySQL开发社区的朋友们,正是大家多年来一直勤勉地工作,才使这两项非常特殊的技术稳步发展。
最后(当然感激并不是最少的),我要感谢我的家人和这里的朋友们,他们有时会把我从电脑前拖走,使我得以休息。
本书出现的错误都是我造成的,是我一人之过。
网络无限,生活无限

TOP

当前章节:1.1 历史

本章使你能够更好地掌握PHP基础,对PHP的起源、普及性及用户有深入的了解。这些信息为讨论PHP的特性(包括PHP 5的新特性)奠定了基础。通过本章你将了解到:
  ● 一个由加拿大开发人员开发的网页访问计数器如何造就了世界上最流行的脚本语言之一。
  ● PHP的开发人员怎样一次次地改进这种语言,最终发布了迄今为止最佳的版本——PHP 5。
  ● PHP的哪些特性让程序员新手和专家趋之若鹜。
1.1  历史
最初的PHP要追溯到1995年,当时一个名叫Rasmus Lerdorf的独立软件开发承包人开发了一个Perl/CGI脚本,可以让他了解有多少访问者阅读了他的在线简历。他的脚本执行两项任务:将访问者信息记入日志,显示网页访问者的数量。Web虽然现在已经家喻户晓,但在当时却很年轻,所以类似的工具以前从未有过,于是人们向Lerdorf发送电子邮件咨询他的这个脚本。自此Lerdorf开始分发他的工具集,并称之为个人主页(PHP)。
由于对PHP工具集的呼声很高,这促使Lerdorf继续开发这种语言。他增加了一个能把在HTML表单中输入的数据转换为符号变量的功能,从而允许导出到其他系统,这或许算得上是早期最突出的一次改进。为此,他选择用C而不是Perl代码来进行后续的开发。对PHP工具集的不断增补在1997年11月达到了顶峰,这时发行了PHP 2.0,即“个人主页——表单解释器”(PHP-FI)。由于PHP不断普及,所以2.0版本得到了来自全世界程序员的大量改进和提高。
这个新PHP版本非常流行,很快就有一个核心开发团队加入到Lerdorf。他们保持了原先在HTML中直接加入代码的概念,重新编写了解析引擎,这就诞生了PHP 3.0。到1998年6月发行版本3.0为止,已经有超过5万个用户在使用PHP改进其网页。
注解   1997年还出现了一个变化,PHP的含义由Personal Home Page(个人主页)变成了Hypertext Preprocessor(超文本预处理器)的缩写词。

接下来的两年中,开发继续狂热地进行着,又增加了成百上千项功能,用户数量也在飞速增长。在1999年初,Netcraft(http://www.netcraft.com/)公布了一个保守的估计,称用户数已经超过了100万,这说明PHP已经成为了世界上最流行的脚本语言之一。它的广泛流传甚至超出了开发人员最乐观的期望,并且很快用户们准备用PHP开发功能更强大的应用程序。两位核心开发人员(Zeev Suraski和Andi Gutmans)开始主动地彻底重新考虑PHP的工作方式,最终改写了PHP的解析器,称之为Zend脚本引擎。这些工作的最终成果就是PHP 4的发布。
注解   Zend技术有限公司(http://www.zend.com/)位于以色列,它除了领导开发Zend引擎和指导PHP语言的整体开发外,还提供了一套开发和部署PHP的工具,包括Zend Studio、Zend Encoder和Zend Optimizer等。更多信息请访问Zend的网站。

1.1.1 PHP 4
2000年5月22日,第一次正式宣布再次开发之后的大约18个月,发布了PHP 4.0。许多人都认为PHP 4的发布是这种语言在企业级开发环境下的正式亮相,这个观点也由于PHP的迅速普及得到了佐证。仅仅在发布后的几个月内,Netcraft(http://www.netcraft.com/)估计就有超过360万个域安装了PHP。
1. 特性
PHP 4包括了以下几项企业级的改进:
  ● 改进了资源处理:可扩展性是版本3.X的主要缺点之一。这主要是因为设计者低估了这种语言,没考虑到它会大量用于大规模应用程序。最初并没有打算用这种语言开发企业级网站,但后来确实有这样的尝试,这就使得开发人员开始重新考虑这种语言的机制。最终促使在版本4中对资源处理进行了大幅改进。
  ● 面向对象的支持:版本4在一定程度上结合了面向对象的功能,尽管一般认为这只是一个很平常的实现。不过,对于使用传统面向对象程序设计(OOP)语言的用户来说,这个新特性在吸引这些用户方面起到了非常重要的作用。除了对象重载和运行时类信息,PHP还支持标准的类和对象开发方法。版本5支持更复杂的OOP实现,第5章将介绍这方面的内容。
  ● 内置的会话处理支持:版本3.X通过第三方包PHPLIB(http://phplib.sourceforge.net)来支持HTTP会话处理,在版本4中HTTP会话处理则是内置的功能。这个特性使得开发人员可以相当高效轻松地跟踪用户活动和偏好。第15章将介绍PHP的会话处理功能。
  ● 加密:MCrypt(http://mcrypt.sourceforge.net)库引入到默认发行包中,为用户提供了完全加密和散列加密,使用的加密算法包括Blowfish、MD5、SHA1和三重DES等。第18章将讨论PHP的加密功能。
  ● ISAPI支持:对ISAPI的支持使用户能够将PHP与微软的IIS Web服务器(作为一个ISAPI模块)结合使用,大大提高了性能和安全性。
  ● 内置COM/DCOM支持:对Windows用户来说,另一个好处是PHP 4能够访问和实例化COM对象。这项功能扩展了与Windows应用程序的互操作性。
  ● 内置Java支持:这也是PHP在互操作性方面的一大进步,版本4.0支持PHP应用程序绑定Java对象。
  ● 与Perl兼容的正则表达式(PCRE)库:Perl语言一直以来在字符串解析领域雄霸天下,占据着统治地位。开发人员知道,如果想让PHP得到广泛认可,强大的正则表达式功能会起到重要作用。他们的做法只是集成Perl的功能,而不是重新开发,并将PCRE库的包集成在PHP的默认发行包中(版本4.2.0)。第9章将详细介绍这个重要的特性,并介绍经常引起混淆的正则表达式语法。
除了这些特性外,版本4还添加了几百项功能,大大提升了这种语言的能力。本书中,我们将讨论其中大部分功能,因为这些功能在版本5中仍然很重要。
2. 缺点
在PHP语言的发展历程上,PHP 4代表着一次巨大的飞跃。这个新版本带来的新功能、强大能力和可扩展性对开发新手和老手都产生了不小的震动,这也使PHP在Web脚本领域确立了牢固的地位。但是,要想让用户对哪种语言矢志不渝是很困难的事情;程序员通常会有这样一种想法“你最近为我做了什么”。PHP开发团队牢记这一点,因为不久以后他们就开始着手开展另一个里程碑性的任务,要在Web脚本领域推出一个重量级语言(就像一个800磅的大猩猩):PHP 5。
1.1.2 PHP 5
版本5是PHP语言发展历程中的另一座分水岭。虽然前面的主要版本已经增加了许多库,版本5则在现有的功能上又进行了许多改进,并且增加了成熟的编程语言体系结构才有的一些特性:
  ● 极大地提高了面向对象能力:PHP的面向对象体系结构得到了改进,这是版本5最突出的特点。版本5增加了很多功能,如显式构造函数和析构函数、对象克隆、类抽象、变量作用域和接口等。另外,PHP在处理对象管理方面也有重大改进。第6章和第7章将详细介绍这些内容。
  ● try/catch异常处理:具有讽刺意味的是,在结构化编程语言中设计错误处理策略时,不仅非常容易出错,而且很难保持一致。为了解决这个问题,版本5开始支持异常处理。在许多语言中,如C++、C#、Python和Java等,异常处理长期以来一直都是错误管理方面的中流砥柱,它为建立标准化的错误报告逻辑提供了一种绝佳的方法。这种方便的新方法将在第8章中介绍。
  ● 改进的字符串处理:之前版本的PHP默认地将字符串看作数组,这也反映了PHP原先的数据类型观点不够严密。这种策略在版本5中有所调整,引入了一种专门的字符串偏移量(offset)语法,而以前的方法已经废弃不用。第9章将讨论这种新语法带来的新特性、变化和效果。
  ● 改进的XML和Web服务支持:现在的XML支持建立在libxml2库基础上,还引入一个很新但非常有前途的扩展包来解析和处理XML:SimpleXML。此外,PHP 5还支持SOAP扩展。第20章将介绍这两个新扩展,并介绍一些很棒的第三方Web服务扩展。
  ● 对SQLite的内置支持:开发人员的脚步一直没有停止,还为功能强大但很简洁的SQLite数据库服务器(http://www.sqlite.org/)提供了支持。如果开发人员需要一些重量级数据库产品中才有的特性,同时不希望带来相应的管理开销,SQLite就能为这些开发人员提供一个方便的解决方案。第22章将介绍PHP为这个强大的数据库引擎提供的支持。
版本5中还提供了其他的大量改进和增补,其中许多特性都将在本书的相应位置介绍。
随着版本5的发布,PHP的普及到达了历史最高点。至本书写作时,已经有将近1900万个域安装了PHP(Netcraft,http://www.netcraft.com/)。根据E-Soft公司(http://www.securityspace
.com/)的数据,PHP是迄今为止最流行的Apache模块,在所有Apache安装中大约有54%都安装了PHP。
到目前为止,本章只讨论了每个PHP版本特有的一些特性。各个版本还有一些共同的特点,它们在吸引和保住庞大的用户群方面起到了非常重要的作用。下一节我们将学习这些基本特性。
网络无限,生活无限

TOP

当前章节:1.2 PHP的一般特性

1.2  PHP的一般特性
每位用户使用PHP来实现关键业务应用程序时可能都有自己特定的原因,不过有人认为这些原因主要可以分为4类:实用性、强大功能、可选择性和成本。
1.2.1 实用性
自始以来,PHP就是以实用性为目的而创建的。毕竟,Lerdorf最初的意图不是设计一门全新的语言,而只是为了解决一个没有现成解决方案的问题。此外,PHP早期的发展并非明确地希望改进语言本身,而只是要为用户增加功能。其结果就是建立了一个最低需求(minimalist)语言,不仅对用户的需求很低,对语言的语法需求也很低。对于刚入门的人来说,一个有用的PHP脚本可能只包含一行代码;与C不同,它不需要导入库函数。例如,下面的代码就是一个完整的PHP脚本,其目的是以类似于September 23, 2005的格式输出当前的日期:

PHP语言很强调紧凑性,这还反映在它能嵌套函数。例如,通过在一行代码中按特定的顺序调用函数,可以对一个值进行一系列修改。下面的例子中,将生成一个由5个字母或数字字符组成的伪随机串,如a3jh8:

PHP是一种类型松散的语言,这意味着不需要明确地创建变量、指派类型或撤销变量,当然也没有绝对禁止做这些操作。PHP在内部处理这些情况,脚本中使用变量时PHP会动态创建变量,并使用最优推测规则自动指派变量的类型。例如,PHP认为下面的一组语句是完全合法的:

PHP还会在脚本结束时自动撤销变量,将资源返回给系统。从这些方面来看,由于PHP在内部处理了编程的许多管理方面的问题,这就允许开发人员集中精力去完成最终的目标,也就是开发一个实用的应用程序。
1.2.2 强大功能
在前面介绍PHP 5时就已经提到,这个新版本相对于以前的版本更重视质量,而非数量。以前的主要版本向PHP的默认库增加很多特性,每次发行新版本都会增加几百项新功能。目前,PHP有113个可用的库,总共有1000余项功能。也许,你知道PHP能访问数据库、处理表单信息以及动态创建页面,但你可能不知道PHP还有以下功能:
  ● 创建并处理Macromedia Flash、图片和PDF文件。
  ● 将密码与字典数据和容易破解的模式进行比较,评估密码的可猜测性。
  ● 与轻量级目录访问协议(LDAP)通信。
  ● 使用基于POSIX和Perl的正则表达式库解析最复杂的字符串。
  ● 通过存储在纯文本文件、数据库或Microsoft活动目录中的登录凭证来鉴别用户身份。
  ● 与多种协议通信,包括IMAP、POP3、NNTP和DNS等。
  ● 与大量信用卡处理解决方案通信。
当然,后面的章节将尽可能地涵盖PHP的各项有趣而且有用的特性。
1.2.3 可选择性
PHP开发人员很少只局限于一种实现方案。相反,这个语言为用户提供了充分的选择。例如,考虑一下PHP对数据库的支持。PHP为不少于25种数据库产品提供了内置支持,包括Adabas D、dBase、Empress、FilePro、FrontBase、Hyperwave、IBM DB2、Informix、Ingres、Interbase、mSQL、direct MS-SQL、MySQL、Oracle、Ovrimos、PostgreSQL、Solid、Sybase、UNIX dbm和Velocis。此外,也可以利用抽象层功能来访问Berkeley DB类型的数据库。最后,还有两个数据库抽象层可用,一个称为dbx模块,另一个是通过PEAR的PEAR DB。
PHP强大的字符串解析功能也为用户提供了丰富的可选择性。除了超过85个字符串处理函数之外,PHP还支持基于POSIX和Perl的正则表达式格式。这种灵活性使不同水平的用户都能获益,不仅能够(利用字符串处理函数)立即开始完成复杂的字符串操作,还可以(利用正则表达式)将有类似功能的程序(如Perl和Python)快速移植到PHP。
你更喜欢函数式编程语言吗?还是采用面向对象范型(object-oriented paradigm)的语言?PHP对二者都提供了全面的支持。虽然PHP最初只是一种函数式语言,但开发人员很快就意识到提供流行的OOP范型的重要性,并开始实现一种可扩展的解决方案。
这里反复强调的重点是,PHP允许你充分利用目前掌握的技能,只需投入很少的时间就能很快地开始PHP开发。这种策略在整个语言中频频出现,这里提到的只是其中很少的一部分例子。
1.2.4 成本
PHP从一开始就对使用、修改和再分发没有任何限制。最近几年,满足这种开放许可限制的软件称为开源软件(open-source software)。开源软件和因特网就像面包和黄油一样密不可分。开源项目如Sendmail、Bind、Linux和Apache都在因特网的发展方面起到了非常重要的作用。虽然媒体最为追捧的是开源软件可以自由使用,但它还有另外几个同样重要的特点(甚至更重要):
  ● 没有大多数商业产品所要求的许可限制:商业软件往往有许多许可限制,而开源软件的用户没有这些限制。虽然在许可权限上存在差异,但一般来讲,用户都能自由地修改和重新分发开源软件,还能将开源软件整合到其他产品中。
  ● 开放式开发和审计过程:虽然也曾有过一些意外事件,但开源软件在安全方面还是享有很好的声誉。这种高标准正是开放式开发和审计过程的结果。因为任何人都能自由使用源代码,所以安全漏洞和潜在的问题会很快被发现并得以修复。开源倡导者Eric S. Raymond很好地总结了这项优点,他说:“只要有足够的眼睛,所有的bug都无处遁形。”
  ● 鼓励参与:开发团队不限于某个组织。任何感兴趣的人,只要具有相应的能力,都可以自由地加入到项目中。由于不对成员进行限制,这就大大增加了项目的人才储备,必然能贡献出更高质量的产品。
网络无限,生活无限

TOP

1.3 小结

1.3  小结对于本书将介绍的这种绝妙语言,本章可算是一个铺垫。我们首先回顾了PHP的历史,接下来概要介绍版本4和版本5的核心特性,作为后续章节的开场白。
第2章准备让你亲自动手来完成PHP的安装和配置过程。虽然读者通常认为这样的章节如同隔靴搔痒,但在这个过程中其实可以学到很多东西。就像专业的自行车手或者赛车手一样,程序员如果对调整和维护过程有实际经验,通常要好过那些没有这些经验的程序员,因为他们能更好地理解软件的行为和特异问题。准备好了吗?开始吧。
网络无限,生活无限

TOP

当前章节:2.1 安装

这一章你将学习如何安装和配置PHP,还能在这个过程中学习如何安装Apache Web服务器。如果你没有可以自己支配的可操作Apache/PHP服务器,这里介绍的内容将对使用后面章节中的示例非常重要。不仅如此,你还能从中积累经验。本章将学习以下内容:
  ● 如何在UNIX和Windows平台上安装Apache和PHP(作为Apache服务器模块);
  ● 如何测试安装,确保所有组件能够正常运行;
  ● 常见的安装隐患和解决方案;
  ● PHP最常用的配置指令,介绍这些配置指令的用途、作用域和默认值;
  ● 修改PHP配置指令的各种方法。
2.1 安装
本节将一步步地完成所有必要的步骤来安装一个能实际运行的Apache/PHP服务器。在这一节的最后,你就能执行PHP脚本,并在浏览器中查看执行的结果。
2.1.1 获得发行包
在开始安装之前,需要下载源代码。本节将介绍如何进行下载源代码。
1. 下载Apache
Apache的普及和开源许可几乎让所有UNIX开发人员都在其各自的发行包中加入了这个软件。但是,由于Apache发布新版本的速度很快,你应当访问Apache网站,下载最新的版本。写这本书时,以下这个页面列出了53个不同地区的260个镜像:

浏览这个页面,点击适当的链接来选择合适的镜像。弹出的页面会包含Apache软件基金会(Apache Software Foundation)资助的所有项目。选择httpd链接,你看到的页面将包括最新的Apache版本和各种相关的项目及工具。发行包有两种格式:
  ● 源代码:如果你的目标服务器平台是UNIX,就要考虑下载源代码。虽然使用一种方便的二进制版本肯定没错,但花一些时间学习如何编译源代码将会给你的配置带来更大的灵活性。如果你的目标平台是Windows,而且你也希望编译源代码,要注意可以下载另一个用于Win32平台的源代码。但是需要说明,本章不讨论Win32源代码的安装过程,而会重点介绍更常用的(也是推荐的)二进制安装程序。
  ● 二进制:在写本书时,已经有可用于15种操作系统的二进制版本。如果你的目标平台是Windows,要考虑下载相应的二进制版本。对于其他平台,请考虑编译源代码,因为从长远来看,源代码发行包能提供更大的灵活性。
注解   在编写本书时,提供SSL支持的Apache 2 Win32二进制版本尚不可用,但等你读到这本书时可能就可用了。不过,倘若仍然不可用,而你确实需要Windows上的SSL支持,就需要从源代码构建。

那么,应当下载哪个Apache版本呢?虽然Apache 2早在三年多之前就已经发行,但版本1.X仍在广泛使用。事实上,大多数共享服务器ISP还没有移植到版本2.X。不愿升级并不是说版本2.X有问题,这只是因为版本1.X相当稳定,而且提供了强大的功能。对于标准应用程序,几乎觉察不出两个版本之间的外部区别,因此要考虑使用Apache 2,利用其更强的稳定性。事实上,如果你计划在Windows下运行Apache来进行开发或部署,那么推荐你选择版本2,因为它完全重写了之前的Windows发行包,比以前的版本更加稳定。
2. 下载PHP
虽然现在大多数Linux发行包都捆绑了PHP,你还是应当从PHP网站下载最新的稳定版本。为减少下载时间,请从位于50多个国家和地区的100多个官方镜像中选择下载,这个列表位于:http://www.php.net/mirrors.php
选择与你最近的镜像之后,浏览下载页面,在以下3种发行包中选择一种:
  ● 源代码:如果目标服务器平台是UNIX,或者计划在Windows平台上编译源代码,就请选择这种发行包格式。并不推荐在Windows上从源代码行构建,本书也不讨论这个内容。除非你的具体情况确实需要特定的配置,否则,预构建的Windows二进制版本都能满足需要。这种发行包以bz2和gz格式压缩。记住其内容是相同的;不同的压缩格式只是为了方便你使用。
  ● Windows下的zip包:这种二进制包包括CGI二进制包和各种服务器模块。如果你计划在Windows中结合使用PHP和Apache,就应当下载这种发行包,因为它将作为后面的安装指南的重点。
  ● Windows下的安装程序:它只包括CGI二进制包,为安装和配置PHP提供了一个方便的Windows安装程序界面,支持IIS、PWS和Xitami服务器的自动配置。虽然也可以与Apache一起使用,但不推荐这种做法。倘若要与Apache一起使用,请选择Windows下的zip包版本。
如果你有兴趣使用最新的PHP开发快照,可以从http://snaps.php.net/下载源代码和二进制版本。要记住,这个网站提供的一些版本不能用于生产阶段。
2.1.2 安装过程
因为本章的主要内容是PHP,而不是Apache服务器,所以Apache构建过程中的许多特性不在这一章深入讨论,这超出了本章的范围。如果想了解有关这些特性的更多信息,请花一些时间研读一下Apache文档,或者请参考Peter Wainwright所著的Pro Apache, Third Edition (Apress,2004)。
注解    PHP和MySQL的许可存在冲突,所以已经从PHP 5中去除了MySQL库。因此,要同时使用PHP 5和MySQL,需要采取一些必要的步骤,使PHP 5能使用MySQL库。第25章将更详细地讨论这个内容。此外,一定要仔细阅读本章中关于使用PHP和MySQL的许可信息。

1. 在Linux/UNIX上安装Apache和PHP
本节将指导你从源代码构建Apache和PHP,目标平台是UNIX。你需要一个成熟的ANSI-C编译器和构建系统,这是大多数发行包中都很常见的两个工具。此外,PHP需要Flex(http://www.gnu.org/software/flex/flex.html)和Bison(http://www.gnu.org/software/ bison/bison.html)包,而Apache至少需要Perl 5.003。再次说明,大多数(甚至全部)现代UNIX平台上都有这3个工具。最后,要求在目标服务器上有root权限才能完成构建过程。
为方便起见,开始安装过程之前,可以考虑将两个包移在一个相同的位置,比如/usr/src/。安装过程如下:
(1) 解压Apache和PHP:

(2) 配置和构建Apache。最少需要两个选项。第一个是--enable-so,它告诉Apache启用加载共享模块的功能。第二个是--with-mpm=worker,它告诉Apache使用称为worker的多线程化多处理模块。根据特定的需要,还可能考虑使用多处理模块prefork。更多有关信息请参见Apache文档。

(3) 安装Apache:

(4) 配置、构建和安装PHP(如果要了解如何修改默认安装,以及如何在PHP中结合第三方扩展,根据不同的操作系统,有关信息请参见2.1.4节或2.1.5节):

注意   PHP的UNIX版本依赖于一些工具才能正确地编译,如果服务器上没有这些工具,配置过程就会失败。其中最有名的包,包括Bison解析器生成器、Flex词法分析生成器、GCC编译器集合,以及m4宏处理器。遗憾的是,很多发行包在自动安装这些工具时会失败,必须在安装操作系统时或在安装PHP之前手动地增加这些包。因此,如果出现关于这些包的错误,记住这是很正常的,只要按必要的步骤在系统中安装这些包就可以。

(5) 将php.in-dist文件复制到默认位置,把它重命名为php.ini。php.ini文件包含了几百个负责调整PHP行为的指令。2.2节将详细介绍php.ini的作用和内容。需要指出,可以把这个配置文件放在任意位置,但是如果没有把它放在默认位置上,则需要使用--with-config-file-path选项来配置PHP。注意,还有一个可由你自己支配的默认配置文件:php.ini-recommended。这个文件用于配置各种非标准的设置,使得你的安装更加安全和优化,不过,这个配置可能与一些遗留的应用程序不完全兼容。可以考虑用这个文件代替php.in-dist。

(6) 打开httpd.conf文件,验证其中有下面几行代码(httpd.conf文件位于APACHE_INSTALL_ DIR/conf/httpd.conf)。如果没有这几行,就把以下代码添加到httpd.conf文件中,可以分别放在其他LoadModule和AddType项的后面。

不管你相信与否,安装就这么简单!用以下命令重启Apache服务器:

接下来可以看2.1.3节。
提示   第(6)步中的AddType指令将一个MIME类型绑定到某个或某些扩展名。.php扩展名只是一种建议;你可以使用任何扩展名,包括.html、.php5,甚至.jason。此外,还可以指定多个扩展名,只要所有扩展名都包括在一行中,并用空格分隔即可。有些用户使用PHP时喜欢用.html扩展名,要记住,这样最终会导致一个后果,每次请求HTML文件时都会把文件交由PHP解析。也许有些人会认为这样方便,但这会以性能下降为代价。

2. 在Windows上安装Apache和PHP
以前基于Windows的Apache版本没有针对Windows平台进行优化,不过,Apache 2的Win32版本经过了完全重写,以利用Windows平台特有的特性。即使你不准备在Windows上部署应用程序,但对于那些希望使用Windows而不是其他平台的用户来说,这提供了一个极好的本地化测试环境。安装过程如下:
(1) 双击apache_X.X.XX-win32-x86-no_ssl.msi图标,启动Apache安装程序。
(2) 安装过程以一个欢迎屏幕开始。花点时间阅读一下这个屏幕,然后点击Next。
(3) 接下来显示许可协议。仔细阅读整个许可协议。如果你同意许可条款,点击Next。
(4) 接下来显示的屏幕中包含了与Apache服务器有关的各项。花点时间阅读一下这些信息,然后点击Next。
(5) 你将看到一些与服务器操作有关的项,包括网络域、服务器名和管理员Email地址。如果你知道这些信息,现在就请填上;否则,就在前两项中使用localhost,最后一项可以先填写一个任意的电子邮件地址。以后可以在httpd.conf文件中修改这些信息。安装程序还会提示你希望为所有用户提供Apache服务,还是仅作为当前用户的服务。如果你希望Apache自动与操作系统一起启动(推荐做法),就请选择将Apache作为所有用户的服务。完成设置后,点击Next。
(6) 安装程序会提示你选择安装类型:典型或定制。除非有特殊的原因你不想安装Apache文档,否则请选择典型安装,并点击Next。如果不安装文档,请选择定制,点击Next,在下一个屏幕中,取消Apache Document选项。
(7) 安装程序提示你选择目标文件夹。默认情况下为C:\Program Files\Apache Group。可以修改为C:\,这样就会创建一个安装目录C:\Apache2\。无论选择什么目录,要记住,本章为了方便将使用C:\Apache2\目录。点击Next。
(8) 点击Install完成安装。以上是Apache的安装过程。下面要安装PHP。
(9) 解压PHP包,将内容放在C:\php5\上。你可以选择任何所希望的安装目录,但是要避免使用包含空格的路径。为保持一致,本章将使用C:\php5\作为安装目录。
(10) 使Apache能够使用php5ts.dll文件。最简单的办法是,将PHP安装路径增加到Window的Path环境变量中。为此,找到开始→设置→控制面板→系统,选择“高级”标签,点击环境变量按钮。在环境变量对话框中,滚动系统变量面板,直到找到Path。双击这一行,在编辑系统变量对话框中,将C:\php5追加到路径中,如图2-1所示。

图2-1  修改Windows的Path

(11) 切换到C:\apache2\conf,打开httpd.conf进行编辑。
(12) 向httpd.conf文件增加以下3行内容。可以紧挨着增加到LoadModule块的下面,这个块位于Global Environment部分的最后。

提示   第(12)步的AddType指令将一个MIME类型绑定到某个或某些扩展名。.php扩展名只是一种建议;你可以使用任何扩展名,包括.html、.php5,甚至.jason。此外,还可以指定多个扩展名,只要所有扩展名都包括在一行中,并用空格分隔即可。有些用户使用PHP时喜欢用.html扩展名,要记住,这样最终会导致一个后果,每次请求HTML文件时都会把文件交由PHP解析。也许有些人会认为这样方便,但这会以性能下降为代价。

(13) 将php.ini-dist文件重命名为php.ini,保存到C:\php5目录。php.ini文件包含很多负责调整PHP行为的指令。2.2节将详细介绍php.ini的作用和内容。需要指出,可以将这个配置文件放在任何位置,但如果选择了非默认的位置,就需要使用--with-config-file-path选项配置PHP。注意,还有一个可由你自己支配的默认配置文件:php.ini-recommended。这个文件用于配置各种非标准的设置,使得你的安装更加安全和优化,不过这个配置可能与一些遗留的应用程序不完全兼容。可以考虑用这个文件代替php.in-dist。
(14) 如果使用Windows NT、2000或XP,请找到开始→设置→控制面板→管理工具→服务。
(15) 在列表中找到Apache,确认它已经启动。如果没有启动,请点亮这个标签,点击位于标签左边的“启动服务”图标。如果已经启动,则点亮标签,点击“重新启动服务”按钮,这样对httpd.conf文件的修改就会生效。接下来,右键点击Apache,选择属性。确保启动类型设置为“自动”。如果你仍在使用Windows 95/98,则需要通过开始菜单中的快捷方式手动地启动Apache。
2.1.3 测试安装
要验证PHP是否成功安装,最好的办法就是尝试执行一个PHP脚本。打开文本编辑器,增加以下内容。然后将这个文件保存到Apache的htdocs目录中,命名为phpinfo.php:

现在打开浏览器,键入URL访问这个文件:

如果一切正常,应当能看到与图2-2类似的结果。

图2-2  PHPphpinfo()函数的输出

提示    phpinfo()函数会提供与PHP安装有关的一组有用的信息。

救命!出现了一个错误!
即使在构建过程中没有遇到明显的错误,也有可能看不到phpinfo()漂亮的输出,对此可能有以下几个原因:
  ● 在构建过程结束后没有启动或重新启动Apache。
  ● phpinfo.php文件中存在输入错误。如果浏览器中出现一条解析错误消息,那么几乎可以肯定原因就在这里。
  ● 构建过程中出现了错误。可以重新构建(或在Windows上重新安装),仔细查看出现的错误。如果运行的是Linux/UNIX,在重新配置和重新构建之前,不要忘记从每个分发目录执行一次make clean。
2.1.4 定制UNIX构建
虽然基本PHP安装对大多数初级用户来说已经足够了,但你可能很快就希望对默认的配置做一些调整,还有可能希望尝试一些第三方扩展(默认发行包中没有这些扩展包)。通过执行下面的命令,可以看到配置选项(200余个)的完整列表:

要对构建过程进行调整,只需要向PHP的configure命令增加一个或多个参数,必要时还要提供相应的值。例如,假定你希望启用PHP的FTP功能(这个功能默认情况下是禁用的),只需如下修改PHP构建过程的配置步骤:

再举一个例子,假定你希望启用PHP的Java扩展,只需修改第4步:

对于新手来说,通常会有一个误解,认为只要包含额外的标志就能通过PHP自动得到这个功能,实际上可不一定。要记住,还需要安装最终负责启用扩展包支持的软件。对于前面启用Java扩展包的例子,就需要安装Java开发包(JDK)。
2.1.5 定制Windows构建
PHP的Windows安装总共有45个扩展包,都位于INSTALL_DIR\ext\目录下。但是,要真正使用这些扩展包,需要取消php.ini文件中的相应注释。例如,如果希望启用PHP的IMAP扩展,需要在php.ini文件中做两个很小的调整:
(1) 打开位于Windows目录下的php.ini文件。要确定php.ini文件在哪一个目录下,请参见2.1.2节中“在Windows上安装Apache和PHP”的第(13)步。找到extension_dir指令,将其赋为C:\php5\ext\。如果你在其他目录中安装PHP,则要做相应修改。
(2) 找到下面这行代码:;extension=php_imap.dll。删除前面的分号,取消这一行的注释。保存并关闭文件。
(3) 重新启动Apache,就可以在PHP中使用这个扩展了。要记住,有些扩展在正常使用前还需要做更多的修改。对php.ini文件的讨论请参见2.2节。
2.1.6 常见错误
第一次在线访问PHP页面时,经常会遇到一些初级的问题。这一节将讨论其中最常见的一些问题:
  ● 修改Apache的配置文件后,在重新启动前并不会立即生效。因此,在向这个配置文件增加了必要的PHP内容后,要确保重启Apache。
  ● 修改Apache的配置文件时,可能偶尔会引入非法字符,导致Apache无法重启。如果Apache无法启动,请查看一下你所做的修改。
  ● 验证文件的扩展名确实是httpd.conf文件中所指定的PHP特定扩展名。例如,如果只定义了.php作为可识别的扩展名,就不要在.html中嵌入PHP代码。
  ● 确保已经在文件中界定了PHP代码,否则这些代码会输出到浏览器。
  ● 创建名为index.php的文件后,力图作为默认目录索引来调用时,将不会成功。请记住,默认情况下Apache只能识别index.html。因此,需要向Apache的DirectoryIndex指令增加index.php。
2.1.7 查看并下载文档
Apache和PHP项目都提供了示范文档,非常详细地涵盖了这两种技术的几乎每一个方面。可以分别在http://httpd.apache.org/http://www.php.net/查看最新的版本,或者下载到本地计算机上进行阅读。
1. 下载Apache手册
每个Apache分行包都附有XML和HTML格式的最新文档,共提供了6种语言(英语、法语、德语、日语、韩语和俄语)的版本。该文档位于安装根目录的docs目录下。
如果需要升级本地版本,或需要其他格式的版本,如PDF、Microsoft帮助(CHM),或者需要在线浏览,请访问以下网站:

2. 下载PHP手册
有24种语言的PHP文档,而且有各种格式,包括单个HTML页面,多个HTML页面,Microsoft HTML帮助(CHM)格式,以及扩展HTML帮助格式。这些版本都由基于Docbook的主文件生成。如果需要转换为其他的格式,可以在PHP项目的CVS服务器获得这些文件。PHP文档位于安装根目录的manual目录下。
如果需要升级本地版本,或者需要其他格式的版本,请访问以下页面并点击适当的链接:
网络无限,生活无限

TOP

当前章节:2.2 配置(1)

2.2 配置
如果已经走到了这里,那么恭喜你!现在你已经有了一个可以使用的Apache和PHP服务器了。不过,可能还需要完成另外几项运行时修改,这样才能让软件如你所愿正常运转。大多数修改都通过Apache的httpd.conf文件和PHP的php.ini文件完成。两个文件包含了大量配置指令,Apache和PHP的行为就分别由其相应文件中的配置指令共同控制。本章后面将重点讨论PHP中最常用的配置指令,介绍这些指令的作用、作用域和默认值。
2.2.1 管理PHP的配置指令
在学习每个指令的细节之前,本节将演示处理这些指令的各种方法,可以通过php.ini文件、httpd.conf和.htaccess文件完成,也可以直接通过PHP脚本进行处理。
1. php.ini文件
PHP有两个配置模板:php.ini-dist和php.ini-recommended。2.1节建议使用后者,因为其中的许多参数都已经设置为推荐值。如果采纳这个建议,在保证安装安全以及调整安装时,就能节省大量的时间和精力,因为这个文件中有大约240个不同的配置参数。虽然默认值有助于快速地部署PHP,但你可能还想对PHP的行为做另外的调整,因此有必要对这个文件有所了解,学习其中的许多配置参数。下面的2.2.2节将详细介绍这些参数,解释其作用、作用域和取值。
与Apache的httpd.conf文件或MySQL的my.cnf(Windows下是my.ini)类似,php.ini文件是PHP的全局配置文件。这个文件处理了PHP在12个不同方面的行为:
  ● 语言选项;
  ● 安全模式;
  ● 语法突出显示;
  ● 杂项;
  ● 资源限制;
  ● 错误处理和日志;
  ● 数据处理;
  ● 路径和目录;
  ● 文件上传;
  ● Fopen包装器;
  ● 动态扩展;
  ● 模块设置。
在2.2.2节中,我们将讨论以上所列的每一项,并介绍各项的参数。但是,在此之前,先花一点时间来回顾php.ini文件的一般语法。php.ini文件是一个纯文本文件,只包含注释和“参数=值”赋值对。下面是php.ini文件中的一个示例片段:

以分号开头的行是注释,这里safe_mode参数的值赋为Off。
提示   如果很清楚某个配置参数的作用,可以考虑将其注释删除,使文件的内容简化,从而减少以后的编辑时间。

修改将何时生效,这取决于你安装PHP的方式。如果作为CGI二进制包安装PHP,那么每次调用PHP时都会重新读取php.ini文件,因此修改将立即生效。如果作为Apache模块安装PHP,则只会在Apache守护进程第一次启动时读取php.ini。因此,如果以后一种方式安装PHP,就必须重启Apache,这样修改才会生效。
2. Apache的httpd.conf.htaccess文件
当PHP作为Apache模块运行时,就可以通过httpd.conf或.htaccess文件修改许多指令。为此,可以在“名=值”对前面加上以下某个关键字作为前缀:
  ● php_value:设置指定指令的值。
  ● php_flag:设置指定布尔指令的值。
  ● php_admin_value:设置指定指令的值。它与php_value不同,不能用在.htaccess文件中,也不能在虚拟主机或.htaccess中被覆盖。
  ● php_admin_flag:设置指定布尔指令的值。它与php_flag不同,不能用在.htaccess文件中,也不能在虚拟主机或.htaccess中被覆盖。
3. 在执行脚本中
第三种处理PHP配置变量的方式是通过ini_set( )方法来完成,这也是最本地化(localized)的方式。例如,假设要修改PHP中给定脚本的最大执行时间,只需在脚本最上面加入如下命令:

4. 配置指令作用域
任何地方都能修改配置指令吗?这个问题很好。答案是否定的,原因有很多,大多与安全有关。每个指令都有自己的作用域,指令只能在其作用域中修改。总共有4个作用域:
  ● PHP_INI_PERDIR:指令可以在php.ini、httpd.conf或.htaccess文件中修改。
  ● PHP_INI_SYSTEM:指令可以在php.ini和httpd.conf文件中修改。
  ● PHP_INI_USER:指令可以在用户脚本中修改。
  ● PHP_INI_ALL:指令可以在任何地方修改。
2.2.2 PHP的配置指令
以下各小节将介绍PHP的一些核心配置指令。除了一般定义外,每节还提供了配置指令的作用域和默认值。因为你大部分时间都会处理php.ini中的这些变量,所以我们将以这些指令在php.ini文件中出现的顺序来介绍。
注意,本节中介绍的指令大多只与PHP的一般行为有关;还有些指令与扩展包有关,或者与其他值得关注的问题(将在本书后面介绍)有关,这些指令不会在这一节讨论,而会在适当的章节中出现。例如,MySQL的配置指令将在第25章介绍。
1. 语言选项
第一部分指令用于确定语言最基本的一些行为。你肯定想花些时间来熟悉这些配置有哪些选择。
l   engine (On, Off)
作用域:PHP_INI_ALL;默认值:On。
这个参数只是负责确定PHP引擎是否可用。如果关闭,就根本不能使用PHP。显然,如果你计划使用PHP,就应当启用这个设置(保持为On)。
l   zend.ze1_compatibility_mode (On, Off)
作用域:PHP_INI_ALL;默认值:Off。
出版本书时,PHP 5.0已经发行了18个月,尽管如此,PHP 4.X仍在广泛地使用着。这个升级周期之所以拖延,可以归结于PHP 4和PHP 5之间的一些不兼容性。但是,许多开发人员可能不知道,只需启用zend.ze1_compatibility_mode指令,就可以在PHP 5中顺利地运行PHP 4应用程序,而没有任何问题。因此,要在PHP 5驱动的服务器上使用特定于PHP 4的应用程序,就可以用这个指令。
l   short_open_tag (On, Off)
作用域:PHP_INI_ALL;默认值:On。
PHP脚本部分要包围在转义语法中。有4种不同的转义格式,最短的一种就是短开放标记,如下:

你会发现,它与XML的语法相同,有些情况下这会出现问题。因此,提供了一种禁用这种格式的方法。启用short_open_tag(On)时,允许使用短标记;如果禁用short_open_tag(Off),就不允许使用短标记。
l   asp_tags (On, Off)
作用域:PHP_INI_ALL;默认值:Off。
PHP支持ASP风格的脚本定界符,如下:

如果你有使用ASP的背景,并且希望继续使用这种定界符语法,就可以启用这个标记。
l   precision (integer)
作用域:PHP_INI_ALL;默认值:12。
PHP支持很多数据类型,其中也包括浮点数。precision参数指定在浮点数中显示的有效数字个数。注意这个值在Win32系统中设置为14位,在UNIX下设置为12位。
l   y2k_compliance (On, Off)
作用域:PHP_INI_ALL;默认值:Off。
谁会忘记几年前Y2K带来的恐慌呢?为了消除非Y2K兼容(non–Y2K-compliant)软件所带来的问题,耗费的精力实在太大了。虽然可能性不太,但确实还有人在使用过时的不兼容浏览器。如果出于一些特殊的原因,你确定有些网站用户的确如此,则要禁用y2k_compliance参数;否则就应启用这个参数。
l   output_buffering ((On, Off) 或 output_buffering (integer))
作用域:PHP_INI_SYSTEM;默认值:Off。
有一定PHP经验的人(即使经验很少)可能都非常熟悉下面两个消息:

HTTP首部已经发回给请求用户后,如果脚本还试图修改HTTP首部,此时就会出现这些消息。最常见的情况是,已经向浏览器发回了一些输出,之后程序员又试图向用户发送一个cookie。这是不可能实现的,因为HTTP首部(对用户不可见,但浏览器要使用)总是在这些输出的前面。对于这个讨厌的问题,PHP 4.0提供了一个解决办法,引入了输出缓冲(output buffering)的概念。启用输出缓冲时,输出缓冲会告诉PHP在脚本完成后一次发送所有输出。这样,对HTTP首部的任何后续改变都可以通过脚本进行,因为HTTP首部还没有发送出去。启用output_buffering指令将打开输出缓冲。或者还可以设置缓冲区所能包含的最大字节数,来限制输出缓冲区的大小(从而隐含地启用输出缓冲)。
如果不希望使用输出缓冲,就应当禁用这个指令,因为它会使性能稍稍下降。当然,对于HTTP首部问题,最简单的解决方法是尽可能在传送其他内容之前,先传送首部信息。
l   output_handler (string)
作用域:PHP_INI_ALL;默认值:Null。
这个有趣的指令告诉PHP,在把输出返回给请求用户之前,将所有输出传递给一个函数。例如,假设你希望在输出返回给浏览器之前先压缩所有输出,就可以设置这个参数。所有兼容HTTP/1.1的主流浏览器都支持这个特性。可以如下为output_handler赋值:

ob_gzhandler()是PHP的压缩处理函数,位于PHP的输出控制库中。要记住,要将output_ handler设置为ob_gzhandler(),同时启用zlib.output_compression(在下面讨论),这是不允许的。
l   zlib.output_compression ((On, Off)) 或 zlib.output_compression ((integer))
作用域:PHP_INI_SYSTEM;默认值:Off。
在输出返回给浏览器之前先压缩,可以节省带宽和时间。现在大多数浏览器都支持这个HTTP/1.1特性,在大多数应用程序中都能安全地使用。将zlib.output_compression设置为On就可以启用自动的输出压缩。此外,通过为zlib.output_compression赋一个整数值,可以同时启用输出压缩,并设置压缩缓冲区大小(以字节为单位)。
l   zlib.output_handler (string)
作用域:PHP_INI_SYSTEM;默认值:Null。
如果zlib库不可用,zlib.output_handler将指定特定的压缩库。
l   implicit_flush (On, Off)
作用域:PHP_INI_SYSTEM;默认值:Off。
启用implicit_flush时,每次调用print()或echo()之后,以及每个嵌入的HTML块完成后,将自动清除或刷新其内容的输出缓冲区。当服务器需要非常长的时间来编译结果或完成某个计算时,这可能很有用。在这些情况下,可以利用这个特性向用户输出状态的更新,而不是等待服务器完成整个过程后才输出。
l   unserialize_callback_func (string)
作用域:PHP_INI_ALL;默认值:Null。
利用这条指令,在请求实例化一个未定义的类时,能控制逆串行化器(unserializer)的响应。对于大多数用户来说,这个指令无关紧要,因为如果PHP的错误报告设置为适当的级别,PHP就会对这些情况输出一个警告。
l   serialize_precision (integer)
作用域:PHP_INI_ALL;默认值:100。
serialize_precision指令确定在串行化双精度和单精度浮点数时小数点后存储的位数。把这个参数设置为适当的值可以确保当这些数字逆串行化时,不会丢失精度。
l   allow_call_time_pass_reference (On, Off)
作用域:PHP_INI_SYSTEM;默认值:On。
函数通过可以按两种方式传递:传值和传引用。可以在函数定义中指定每个参数在函数调用时如何传递给函数,这是推荐的方式。不过,也可以启用allow_call_time_pass_reference,强制所有参数在函数调用时都按引用传递。
第4章将讨论PHP函数,其中将介绍函数参数如何按值和按引用传递,并说明按值和按引用传递参数的影响。
网络无限,生活无限

TOP

当前章节:2.2 配置(2)

2. 安全模式
在多用户环境中部署PHP时(如ISP的共享服务器上),可能要限制PHP的功能。可以想见,如果为所有用户提供PHP的所有功能,会暴露服务器的漏洞,还可能会破坏服务器的资源和文件。在共享服务器上使用PHP时,作为防护,PHP可以采用一种受限模式或安全模式运行。
启用安全模式有很多影响,包括自动禁用很多功能和可能不安全的各种特性,如果这些功能和特性在本地脚本中被误用,很有可能造成破坏。禁用的函数和特性包括parse_ini_file()、chmod()、chown()、chgrp()、exec()、system()和反引号操作符。启用安全模式还能确保所执行脚本的所有者与脚本访问的文件或目录的所有者相一致。
此外,启用安全模式还可以通过其他PHP配置指令激活另外一些限制,这一节将分别介绍这些指令。
l   safe_mode (On, Off)
作用域:PHP_INI_SYSTEM;默认值:Off。
启用这个安全模式指令将使PHP在上述约束条件下运行。
l   safe_mode_gid (On, Off)
作用域:PHP_INI_SYSTEM;默认值:Off。
启用安全模式时,如果还启用了safe_mode_gid,在打开文件时就会强制完成GID(组ID)检查。禁用safe_mode_gid时,会强制完成一个更为严格的UID(用户ID)检查。
l   safe_mode_include_dir (string)
作用域:PHP_INI_SYSTEM;默认值:Null。
启用safe_mode和safe_mode_gid时,safe_mode_include_dir为避免UID/GID检查提供了一个安全的避风港。当打开的文件位于指定的目录中时,将忽略UID/GID检查。
l   safe_mode_exec_dir (string)
作用域:PHP_INI_SYSTEM;默认值:Null。
启用安全模式时,safe_mode_exec_dir参数会限制通过exec()函数只能执行指定目录中的可执行程序。例如,如果希望限制为只能执行/usr/local/bin下的函数,可以使用指令:

l   safe_mode_allowed_env_vars (string)
作用域:PHP_INI_SYSTEM;默认值:PHP_。
启用安全模式时,可以使用safe_mode_allowed_env_vars指令限制用户能通过PHP脚本修改哪些操作系统级环境变量。例如,如下设置safe_mode_allowed_env_vars指令,则只允许修改以PHP_或MYSQL_开头的变量:

要记住,这个指令的值为空表示用户可以修改任何环境变量。
l   safe_mode_protected_env_vars (string)
作用域:PHP_INI_SYSTEM;默认值:LD_LIBRARY_PATH。
利用safe_mode_protected_env_vars指令,可以明确地防止修改某些环境变量。例如,如果希望防止用户修改PATH和LD_LIBRARY_PATH变量,可以使用以下指令:

l   open_basedir (string)
作用域:PHP_INI_SYSTEM;默认值:Null。
与Apache的DocumentRoot相似,PHP的open_basedir指令可以建立一个基目录,所有文件操作都限制在此目录中。这会防止用户进入到服务器的其他受限区中。例如,假设所有Web素材都位于目录/home/www中。为防止用户通过一些简单的PHP命令查看以及可能操作诸如etc/passwd等文件,可以考虑将open_basedir设置为:

注意,这个指令的影响并不依赖于safe_mode指令。
l   disable_functions (string)
作用域:PHP_INI_SYSTEM;默认值:Null。
在某些环境下,你可能希望完全禁用某些默认函数,如exec()和system()。将这些函数赋给disable_functions参数就能实现禁用,如下:

注意,这个指令的影响并不依赖于safe_mode指令。
l   disable_classes (string)
作用域:PHP_INI_SYSTEM;默认值:Null。
PHP采纳了面向对象范型,根据由此提供的新功能,可以想见,用不了多久就会有非常多的类库。但是,你可能不希望启用这些类库中的某些类。通过disable_classes指令可以防止使用这些类。例如,如果希望禁用两个特定的类:administrator和janitor,可以使用如下指令:

注意,这个指令的影响并不依赖于safe_mode指令。
l   ignore_user_abort (Off, On)
作用域:PHP_INI_ALL;默认值:On。
在浏览器某个页面时,也许页面完全加载之前你就退出或关闭了浏览器,这种情况是不是屡屡发生呢?通常这样做并无害处。但是,如果服务器正在更新重要的用户信息,或者正在完成一个商业交易,会怎么样呢?启用ignore_user_abort会让服务器忽略由于用户或浏览器引起的中断所造成的会话中止。
3. 语法突出显示
PHP可以突出显示源代码。通过将PHP脚本的扩展名赋为.phps(这是默认的扩展名,下面将了解到,这是可以修改的),或者利用show_source()或highlight_file()函数,就可以启用此功能。要使用.phps扩展名,需要向httpd.conf中增加以下代码:

对于突出显示的源代码,通过以下6个指令,可以控制其中字符串、注释、关键字、背景、默认文本和HTML部分的颜色。例如,通常称为“黑色”的颜色可以分别表示为rgb(0,0,0)、#000000或black。
l   highlight.string (string)
作用域:PHP_INI_ALL;默认值:#DD0000。
l   highlight.comment (string)
作用域:PHP_INI_ALL;默认值:#FF9900。
l   highlight.keyword (string)
作用域:PHP_INI_ALL;默认值:#007700。
l   highlight.bg (string)
作用域:PHP_INI_ALL;默认值:#FFFFFF。
l   highlight.default (string)
作用域:PHP_INI_ALL;默认值:#0000BB。
l   highlight.html (string)
作用域:PHP_INI_ALL;默认值:#000000。
4. 杂项
杂项这一类中只包含一个指令:expose_php。
l   expose_php (On, Off)
作用域:PHP_INI_SYSTEM;默认值:On。
如果攻击者能够得到任何一条关于Web服务器的信息,都会增加他成功破坏服务器的机会。一个简单的办法是通过服务器签名获得有关服务器特点的关键信息。例如,在默认情况下,Apache会在每个响应首部中广播如下信息:

通过禁用expose_php,能防止Web服务器签名(如果启用)广播上述事实(即已经安装了PHP)。虽然还需要更多的措施来确保充分的服务器保护,但不管怎样,强烈建议保护这些服务器属性。
注解    可以在httpd.conf文件中将ServerSignature设置为Off,这会禁止Apache广播其服务器签名。

5. 资源限制
虽然PHP 5在资源处理功能方面有长足的进步,但还是要当心,应确保PHP脚本不会由于程序员或用户的动作而独占服务器资源。受这种过度耗费资源影响的三个方面是脚本执行时间、脚本输入处理时间和内存。这些方面可以通过以下3个指令来控制。
l   max_execution_time (integer)
作用域:PHP_INI_ALL;默认值:30。
max_execution_time参数对PHP脚本可以执行的时间设置了一个上限,以秒为单位。如果将这个参数设置为0,将取消所有最大限制。注意,通过PHP命令(如exec()和system())执行的外部程序所花费的时间不算在此限制之内。
l   max_input_time (integer)
作用域:PHP_INI_ALL;默认值:60。
max_input_time参数对PHP脚本解析请求数据所用的时间设置了一个限制,以秒为单位。使用PHP的文件上传特性上传大文件时,这个参数尤其有用。文件上传将在第15章讨论。
l   memory_limit (integer)M
作用域:PHP_INI_ALL;默认值:8M。
memory_limit参数确定PHP脚本可以分配的最大内存量,以MB为单位。
6. 错误处理和日志
PHP为报告和记录PHP在编译时和运行时生成的错误、警告和提示(以及某些用户动作所导致的错误)提供了一种方便灵活的方法。开发人员可以控制报告的敏感度,这些信息是否显示在浏览器中及如何显示,信息将记录在文件中还是系统日志中(在UNIX下是syslog,在Windows下是事件日志)。下面15个指令将控制错误处理行为。
l   error_reporting (string)
作用域:PHP_INI_ALL;默认值:Null。
error_reporting指令确定PHP错误报告敏感度的级别。有13个预定的错误级别,每一个都唯一对应于应用程序或服务器的功能。这些级别列在表2-1中。
可以把error_reporting设置为任何单个级别,或者使用布尔操作符组合这些级别。例如,假设只想报告错误,可以使用如下设置:

如果要跟踪所有错误,但不报告用户生成的警告和提示,可以使用如下设置:

在应用程序开发和初始布署阶段,应当将敏感度设置为最高级别,或E_ALL。但是,一旦解决了所有主要bug之后,就要考虑降低敏感度。

表2-1 PHP的错误报告级别

描    述

E_ALL
报告所有错误和警告
E_ERROR
报告致命的运行时错误
E_WARNING
报告非致命的运行时错误
E_PARSE
报告编译时解析错误
E_NOTICE
报告运行时注意消息,如未初始化变量
E_STRICT
PHP版本可移植性建议
E_CORE_ERROR
报告在PHP启动时发生的致命错误
E_CORE_WARNING
报告在PHP启动时发生的非致命错误
E_COMPILE_ERROR
报告致命的编译时错误
E_COMPILE_WARNING
报告非致命的编译时错误
E_USER_ERROR
报告用户引发的致命错误消息
E_USER_WARNING
报告用户引发的非致命错误消息
E_USER_NOTICE
报告用户引发的注意消息

l   display_errors (On, Off)
作用域:PHP_INI_ALL;默认值:On。
启用display_errors时,将输出error_reporting指定级别之上的所有错误。在开发阶段要考虑启用这个参数。当部署应用程序时,所有错误都应当记录为日志,这可以通过启用log_errors并使用error_log指定日志目标来实现。
l   display_startup_errors (On, Off)
作用域:PHP_INI_ALL;默认值:Off。
禁用display_startup_errors时,可防止将PHP启动过程中的错误显示给用户。
l   log_errors (On, Off)
作用域:PHP_INI_ALL;默认值:Off。
错误消息对于确定PHP应用程序执行期间可能产生的问题很有意义。启用log_errors时,则告诉PHP应当记录这些错误,可以记录在某个文件中,或者记录到syslog中。具体的目标由另一个参数error_log来确定。
l   log_errors_max_len (integer)
作用域:PHP_INI_ALL;默认值:1024。
这个参数确定一条日志消息的最大长度,以字节为单位。将此参数设置为0则不限制最大长度。
l   ignore_repeated_errors (On, Off)
作用域:PHP_INI_ALL;默认值:Off。
如果你经常查看日志,应该知道,有些错误发生在同一文件的同一行,实在没有必要重复记录。禁用此参数就可以防止记录这些重复的错误。
l   ignore_repeated_source (On, Off)
作用域:PHP_INI_ALL;默认值:Off。
这相当于ignore_repeated_errors参数的一个变种,如果禁用ignore_repeated_source,在忽略重复错误时将不考虑错误来源。这表示每个错误消息最多只记录一次。
l   report_memleaks (On, Off)
作用域:PHP_INI_ALL;默认值:Off。
这个参数只在PHP以调试模式编译时才有效,它将确定是否显示或记录内存泄漏。除了要处于调试模式,错误级别还必须至少是E_WARNING。
l   track_errors (On, Off)
作用域:PHP_INI_ALL;默认值:Off。
启用track_errors会让PHP在$php_error_msg变量中存储最近的错误消息。这个变量的作用域仅限于出现错误的特定脚本内。
l   html_errors (On, Off)
作用域:PHP_INI_SYSTEM;默认值:On。
默认情况下,PHP把错误消息包围在HTML标记内。有时,你可能不希望PHP这样做,所以可以通过html_errors参数来禁用这种行为。
l   docref_root (string)
作用域:PHP_INI_ALL;默认值:Null。
如果启用html_errors,PHP就会包括一个指向错误详细描述(位于官方手册)的链接,这就会指向官方手册。不过,最好不要链接到官方网站,而应指向手册的本地副本。本地手册的位置由docref_root指定的路径来确定。
l   docref_ext (string)
作用域:PHP_INI_ALL;默认值:Null。
用于提供关于错误的额外信息时,docref_ext参数会告诉PHP本地手册页面的扩展名(参见docref_root)。
l   error_prepend_string (string)
作用域:PHP_INI_ALL;默认值:Null。
如果希望在输出错误之前向用户传递附加的信息,就可以利用error_prepend_string参数,在自动生成的错误输出前面加上一个字符串(包含格式化标记)。
l   error_append_string (string)
作用域:PHP_INI_ALL;默认值:Null。
如果希望在输出错误之后向用户传递附加的信息,就可以利用error_append_string参数,在自动生成的错误输出后面加上一个字符串(包含格式化标记)。
l   error_log (string)
作用域:PHP_INI_ALL;默认值:Null。
如果启用log_errors,error_log指令将指定消息目标。PHP支持将错误记录到指定文件和操作系统日志中。在Windows下,将error_log设置为syslog会把消息记录到事件日志中。
网络无限,生活无限

TOP

当前章节:2.2 配置(3)

7. 数据处理
这一节介绍的参数将影响PHP处理外部变量的方式;外部变量就是通过一些外部源传递给脚本的变量。GET、POST、cookie、操作系统和服务器都可以用于提供外部数据。本节介绍的其他参数能确定PHP的默认字符集、PHP的默认MIME类型,以及外部文件是否会自动增加到PHP所返回输出的前面或后面。
l   arg_separator.output (string)
作用域:PHP_INI_ALL;默认值:&。
PHP能自动生成URL,并使用标准的&符号分隔输入变量。但是,如果需要改变这个约定,就可以使用arg_separator.output指令。
l   arg_separator.input (string)
作用域:PHP_INI_ALL;默认值:&。
&是POST或GET方法用来分隔输入变量的标准字符。虽然在PHP应用程序中改变这个约定的可能性不大,但确实可以使用arg_separator.input指令改变分隔符。
l   variables_order (string)
作用域:PHP_INI_ALL;默认值:Null。
variables_order指令确定ENVIRONMENT、GET、POST、COOLIE和SERVER变量的解析顺序。虽然看起来似乎关系不大,但如果启用了register_globals(不推荐),这些值的顺序会导致不可预料的结果,因为后面的变量会覆盖前面解析的值。
l   register_globals (On, Off)
作用域:PHP_INI_SYSTEM;默认值:Off。
如果你用过PHP 4之前的版本,那么提起这个指令足以让人谈虎色变。在PHP 4.2.0中,默认为禁用这个指令,迫使许多长期使用PHP的用户彻底地重新思考其Web应用程序开发方法(有些情况下还要重新编写应用程序)。这个改变虽然导致了很大的混乱,但最终却是为开发人员着想,可以使应用程序有更好的安全性。如果你是个新手,那么什么是最重要的呢?
在历史上,所有外部变量都自动在全局作用域注册。即所有COOKIE、ENVIRONMENT、GET、POST和SERVER类型的变量都是全局可用的。因为它们是全局可用的,所以也可以在全局范围内修改。虽然这对于有些人来讲非常方便,却带来了安全隐患,因为有些变量本来只能使用cookie来管理,现在通过URL也能进行修改。例如,假设有一个唯一标识用户的会话标识符,要通过一个cookie在页面之间传递。除了这个会话标识符所标识的用户,其他人不应看到最终映射到该用户的数据。该用户可以打开cookie复制会话标识符,并粘贴到URL的后面,如下:

然后这个用户可以将此链接通过电子邮件发送给其他用户。如果没有其他安全限制(比如IP鉴别),第二个用户就可以看到原本机密的数据。禁用register_globals就可以防止这种情况发生。因为尽管这些外部变量保留在全局范围内,但每个变量都必须与其类型一起引用。例如,前面示例中的sessionid变量只能如下使用:

试图使用其他方式(例如GET或POST)修改此参数时,会在全局范围内生成一个相应的新变量($_GET['sessionid']或$_POST['sessionid'])。3.6.3节将全面介绍COOKIE、ENVIRONMENT、GET、POST和SERVER类型的外部变量。虽然禁用register_globals确实是个好办法,但是要保护应用程序,你要记住的并非只是这一点。第21章将详细介绍PHP应用程序的安全性。
l   register_long_arrays (On, Off)
作用域:PHP_INI_SYSTEM;默认值:Off。
这个指令确定是否继续使用已经废弃的语法(如HTTP_*_VARS)来注册各种输入数组(ENVIRONMENT、GET、POST、COOKIE、SYSTEM)。出于对性能的考虑,推荐禁用这个指令。
l   register_argc_argv (On, Off)
作用域:PHP_INI_SYSTEM;默认值:On。
通过GET方法传入变量信息与向可执行文件传递参数类似。许多语言以argc和argv的形式处理这种参数。argc是参数个数,argv是包含参数的索引数组。如果希望声明变量$argc和$argv,并模拟这个功能,请启用register_argc_argv。
l   post_max_size (integer)M
作用域:PHP_INI_SYSTEM;默认值:8M。
在请求之间传递数据的两种方法中,POST更利于传输大量数据,如通过Web表单所传递的内容。但是,出于对安全性和性能的考虑,可能希望对通过这种方法向PHP脚本传递的数据量加一个上限;这可以使用post_max_size来实现。
注解   单引号和双引号在编程领域一直以来就有特殊的作用。因为它们通常都用作字符串分隔符和用于书面语中。编程中需要一种方法来区分这二者,以消除混淆。解决办法很简单:对不用来分隔字符串的所有引号转义,否则将出现不可预知的错误。考虑如下的例子:
            
             哪个引号用来分隔字符串,而哪个引号用来分隔约翰所说的话?PHP不知道,除非对某些引号转义,如下:
            
            对非分隔符的引号转义,这称为启用魔法引号(enabling magic quote)。这个过程可以自动完成,即启用指令magic_quotes_gpc(本节将介绍),也可以使用函数addslashes()和stripslashes()手动完成。推荐使用后者,因为这样你能完全控制应用程序。但是有时你的应用程序可能希望对引号自动转义,就需要相应地启用这种行为。
            在这方面,确定PHP行为的三个参数是:magic_quotes_gpc、magic_quotes_runtime和magic_quotes_sybase。

l   magic_quotes_gpc (On, Off)
作用域:PHP_INI_SYSTEM;默认值:On。
这个参数确定是否对GET、POST和cookie方法传输的数据启用魔法引号。启用时,所有单引号、双引号、反斜线和空字符都使用反斜线自动转义。
l   magic_quotes_runtime (On, Off)
作用域:PHP_INI_ALL;默认值:Off。
启用此参数时,所有来自外部资源(如数据库或文本文件)的数据中的引号都会自动转义(使用反斜线)。
l   magic_quotes_sybase (On, Off)
作用域:PHP_INI_ALL;默认值:Off。
此参数只在启用magic_quotes_runtime时有效。如果启用了magic_quotes_sybase,所有来自外部资源的数据都将使用一个单引号而不是反斜线进行转义。如果数据来自Sybase数据库,这就非常有用,因为Sybase数据库的转义字符不是反斜线,而是非传统的单引号。
l   auto_prepend_file (string)
作用域:PHP_INI_SYSTEM;默认值:Null。
在PHP脚本执行前,要创建页眉模板或导入代码库,通常使用include()或require()函数来完成。可以在auto_prepend_file指令中指定文件名和相应的路径,自动完成此过程,在脚本中预先导入这些函数。
l   auto_append_file (string)
作用域:PHP_INI_SYSTEM;默认值:Null。
在PHP脚本执行后自动插入页脚模板时,通常使用include()或require()函数来完成。可以在auto_append_file指令中指定文件名和相应的路径,自动完成此过程,在脚本中预先导入这些函数。
l   default_mimetype (string)
作用域:PHP_INI_ALL;默认值:SAPI_DEFAULT_MIMETYPE。
MIME类型为划分因特网文件类型提供了一种标准方法。通过PHP应用程序可以提供任何文件类型,其中最常见的是text/html。但是,如果以其他方式使用PHP,如使用WML(无线标记语言,Wireless Markup Language)应用程序的内容生成器,就需要相应地改变MIME类型。为此,可以修改default_mimetype指令。
l   default_charset (string)
作用域:PHP_INI_ALL;默认值:SAPI_DEFAULT_CHARSET。
从版本4.0b4起,PHP会在Content-type首部中输出字符编码方式。默认情况下是iso-8859-1,它支持英语、西班牙语、德语、意大利语和葡萄牙语等语言。但是,如果应用程序要支持日语、中文或希伯来语等语言,就要相应地修改default_charset指令,更新字符集设置。
l   always_populate_raw_post_data (On, Off)
作用域:PHP_INI_PERDIR;默认值:On。
启用always_populate_raw_post_data指令时,会使PHP为变量$HTTP_RAW_POST_DATA赋一个串,其中包含以POST方法传递的名/值对,即使表单变量没有相应的值。例如,假设启用了此指令,而且和创建了一个包含两个文本字段的表单。一个字段是用户名,另一个字段是用户的电子邮件地址。在表单动作中,只执行一条命令:

如果两个字段都不填,点击提交按钮,将得到如下输出:


如果填写两个字段,再点击提交按钮,将得到如下输出:


8. 路径和目录
本节将介绍确定PHP默认路径设置的指令。这些路径用于导入函数库和扩展包,以及确定用户Web目录和Web文档根目录。
l   include_path (string)
作用域:PHP_INI_ALL;默认值:PHP_INCLUDE_PATH。
此参数指定的路径是include()、require()和fopen_with_path()等函数使用的基本路径。可以指定多个目录,各目录之间用分号分隔,如下面的例子所示:

默认情况下,此参数设置为环境变量PHP_INCLUDE_PATH所定义的路径。
注意,在Windows下,以上使用斜线的地方要使用反斜线,路径前要加驱动器盘符。例如:

l   doc_root (string)
作用域:PHP_INI_SYSTEM;默认值:Null。
此参数确定提供所有PHP脚本的默认位置。此参数非空时才会使用。
l   user_dir (string)
作用域:PHP_INI_SYSTEM;默认值:Null。
user_dir指令指定在使用/~username约定打开文件时,PHP所使用的绝对目录。例如,当user_dir设置为/home/users时,如果用户试图打开文件~/gilmore/collections/books.txt,PHP就知道绝对路径是/home/users/gilmore/collections/books.txt。
l   extension_dir (string)
作用域:PHP_INI_SYSTEM;默认值:PHP_EXTENSION_DIR。
extension_dir指令告诉PHP可加载的扩展包(模块)的位置。在默认情况下,其值为./,这表示可加载扩展包与所执行脚本位于相同的位置。在Windows环境下,如果没有设置extension_dir,则默认为C:\PHP-INSTALLATION-DIRECTORY\ext\。在UNIX环境下,此目录的位置取决于几个因素,不过一般来说,很可能是PHP-INSTALLATION-DIRECTORY/lib/php/extensions/no-debug-zts- RELEASE-BUILD-DATE/。
l   enable_dl (On, Off)
作用域:PHP_INI_SYSTEM;默认值:On。
enable_dl()函数允许用户在运行时加载PHP扩展包;即在脚本执行期间加载。
9. 文件上传
PHP支持通过POST方法上传和管理文本文件及二进制文件。有3个指令支持这个功能,本节将分别介绍。
提示   PHP的文件上传功能将在第15章介绍。

l   file_uploads (On, Off)
作用域:PHP_INI_SYSTEM;默认值:On。
file_uploads指令确定是否启用PHP的文件上传功能。
l   upload_tmp_dir (string)
作用域:PHP_INI_SYSTEM;默认值:Null。
每一次文件上传到服务器时,大多数操作系统都将其放在临时目录中。可以通过upload_tmp_dir指令指定文件上传所用的目录。
l   upload_max_filesize (integer)M
作用域:PHP_INI_SYSTEM;默认值:2M。
upload_max_filesize指令设置PHP上传机制所处理的文件大小上限,以MB为单位。
10. fopen包装器
这部分介绍5个指令,这些指令与访问和处理远程文件有关。
l   allow_url_fopen (On, Off)
作用域:PHP_INI_ALL;默认值:On。
启用allow_url_fopen使得PHP可以将远程文件看作是本地文件。启用时,如果远程服务器上的文件有正确的权限,PHP脚本能够访问和修改这些文件。
l   from (string)
作用域:PHP_INI_ALL;默认值:Null。
from指令在名字上可能会有些误导,实际上它确定的是用于完成FTP连接的匿名用户密码,而不是标识。因此,如果from的值为:

那么,在进行鉴别时,要将用户名anonymous和密码