11.07.2015 Views

封面

封面

封面

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

PHP 新 闻《PHPer》网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 8/87


培 训 新 闻 : 学 专 业 课 程 获 权 威 认 证培 训 新 闻《PHPer》学 专 业 课 程 获 权 威 认 证——PHPChina PCTP 培 训 认 证 介 绍随 着 PHP 技 术 的 不 断 发 展 ,PHP 技 术 的 应 用 越 来 越 广 泛 也 更 加 深 入 , 对 编 程人 员 的 要 求 越 来 越 高 ,PCTI 入 门 课 程 已 经 不 能 满 足 企 业 的 需 要 , 应 广 大 PHP爱 好 者 的 要 求 和 国 内 互 联 网 企 业 对 PHP 高 级 编 程 人 员 的 急 需 ,PHPChina 推出 了 PCTP(PHPChina Training— Professional) 高 级 认 证 课 程 , 本 课 程 适 合 对象 为 对 PHP 有 一 定 基 础 或 者 从 事 过 PHP 开 发 相 关 工 作 想 继 续 深 入 学 习 的 编 程 人 员 。PCTP 课 程 内 容 简 介PCTP 认 证 证 书 样 本首 先 , 我 们 纵 向 来 看 整 个 PCTP 的 内 容 安 排 ,PCTP 课 程 包 含 4 大 块 技 术 内 容 , 即 :PHP5在 Web 开 发 中 高 级 技 术 、 数 据 库 技 术 、Zend 产 品 和 软 件 工 程 以 及 项 目 管 理 内 容 。1. PHP5 的 应 用 随 着 时 间 的 推 移 已 经 取 代 PHP4,PHP5 中 相 对 比 较 完 善 的 面 向 对 象 技 术也 不 断 应 用 在 Web 开 发 中 ; 数 据 抽 象 层 介 绍 了 ADODB 和 PDO, 这 是 数 据 库 与 PHP之 间 的 完 美 结 合 , 可 以 大 大 提 高 开 发 效 率 , 两 种 方 式 各 有 优 点 ;Mail 和 模 板 同 样 是PHP 中 的 热 点 , 特 别 是 模 板 的 应 用 , 模 板 的 种 类 , 在 此 , 我 们 主 要 以 比 较 完 善 和 应 用比 较 广 泛 的 Smarty 为 例 讲 解 ;Web 服 务 算 是 PHP 的 扩 展 功 能 , 这 也 体 现 了 PHP 趋 于强 大 的 特 点 , 在 PHP5 中 改 进 了 XML、SAX、DOM、XSLT、SimpleXML 等 扩 展 。2. 数 据 库 技 术 是 应 用 开 发 的 基 础 技 术 ,80% 以 上 的 应 用 系 统 需 要 使 用 数 据 库 来 存 放 业 务数 据 , 当 然 数 据 库 技 术 也 是 个 非 常 复 杂 的 技 术 , 这 里 主 要 是 针 对 数 据 库 在 Web 开 发中 的 应 用 , 内 容 包 括 数 据 库 优 化 、 规 范 化 、 字 符 集 、 触 发 器 和 数 据 库 设 计 技 巧 等 知 识 。3. Zend Plateform 和 Zend Guard 是 Zend 公 司 的 完 美 产 品 同 时 也 是 PHP 代 码 运 行 优 化 的最 佳 平 台 和 加 密 工 具 , 它 们 被 广 泛 的 应 用 于 大 型 服 务 器 上 , 为 PHP 保 驾 护 航 。4. 软 件 工 程 与 项 目 管 理 一 些 纯 理 论 概 念 , 来 源 于 实 际 , 同 时 要 应 用 于 实 际 , 是 程 序 员 走向 更 高 一 层 次 的 基 础 知 识 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 9/87


培 训 新 闻 : 学 专 业 课 程 获 权 威 认 证《PHPer》参 与 到 整 个 软 件 项 目 开 发 过 程 , 熟 练 、 规 范 地 完 成 企 业 级 B/S 系 统 模 块 的 编 码 、 调 试 和 文 档编 写 , 成 为 企 业 紧 缺 的 技 能 型 应 用 人 才 ”。 学 习 完 PCTP, 相 当 于 具 备 两 年 或 三 年 的 实 际 软 件项 目 开 发 经 验 , 这 也 是 目 前 绝 大 多 数 软 件 企 业 招 聘 时 对 高 级 程 序 员 的 最 低 要 求 。把 发 动 机 的 各 项 参 数 背 得 再 熟 练 也 是 不 会 修 车 的 , 而 快 速 判 断 问 题 发 生 的 原 因 , 使 用 扳手 、 螺 丝 刀 快 速 搞 定 问 题 才 是 正 道 。 修 车 高 手 只 能 通 过 大 量 的 实 践 、 总 结 、 再 实 践 才 能 够 达到 快 刀 斩 乱 麻 解 决 问 题 的 境 界 。 同 样 ,PCTP 的 学 习 也 要 求 学 员 “ 动 手 、 动 手 、 再 动 手 ”, 要敢 于 编 码 、 乐 于 编 码 、 大 量 编 码 才 能 够 达 到 熟 练 的 程 度 。现 代 企 业 要 求 合 作 , 代 码 规 范 是 团 队 开 发 的 基 础 , 没 有 人 能 看 得 懂 的 代 码 , 不 管 自 己 觉得 写 得 如 何 漂 亮 , 终 将 被 称 之 为 “ 垃 圾 代 码 ”, 在 全 部 学 习 过 程 中 , 我 们 要 求 学 员 :“ 代 码 运行 通 过 了 不 算 代 码 写 完 了 , 代 码 规 范 了 才 算 ”我 们 认 为 , 只 有 通 过 大 量 的 、 反 复 的 动 手 实 践 , 才 能 具 备 熟 练 、 规 范 的 编 码 和 调 试 能 力 ,具 备 真 正 实 用 的 技 能 , 才 有 可 能 被 称 之 为 应 聘 者 中 “ 有 项 目 开 发 经 验 的 人 ”, 成 为 一 名 企 业 真正 需 要 的 “ 人 才 ”, 在 日 益 激 烈 的 职 业 竞 争 中 拔 得 头 筹 ,PCTP 向 这 个 目 标 迈 进 了 一 大 步 。想 了 解 更 多 信 息 , 参 加 PCTP 培 训 认 证 , 请 访 问 PHPChina 培 训 频 道 :http://www.phpchina.com/action_train.html网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 11/87


PHP 企 业 招 聘PHP 企 业 招 聘《PHPer》赤 子 缘 网 络 技 术 有 限 公 司招 聘 信 息招 聘 职 位 :PHP 高 级 网 站 技 术 开 发 工 程 师招 聘 人 数 :1 名工 作 地 点 : 深 圳 , 赤 子 缘 总 部薪 水 待 遇 : 年 薪 10-20 万工 作 时 间 : 一 个 月 内 到 岗职 位 描 述 :1. 负 责 公 司 SNS2.0 网 站 产 品 ( 万 级 用 户 在 线 社 区 ) 的 技 术 开 发 ;2. 大 型 网 站 的 总 体 架 构 设 计 , 技 术 难 点 攻 关 , 对 项 目 开 发 进 行 技 术 管 理 与 资 源 分 配 ;3. 制 定 项 目 开 发 的 标 准 作 业 流 程 , 并 实 施 应 用 到 项 目 开 发 中 ;4. 完 成 概 要 设 计 、 详 细 设 计 及 核 心 模 块 的 设 计 开 发 ;5. 按 照 项 目 开 发 要 求 , 对 开 发 人 员 进 行 技 术 指 导 。 管 理 项 目 团 队 , 能 按 照 软 件 工 程的 要 求 , 高 质 量 的 完 成 任 务 ;职 位 要 求 :1. 计 算 机 相 关 专 业 , 大 专 以 上 学 历 ;2. 精 通 PHP+MySQL 编 程 ,4 年 以 上 经 验 , 有 大 型 网 站 项 目 开 发 经 验 , 熟 悉 大 型 ICP3网 站 整 体 设 计 、 规 划 和 制 作 以 及 管 理 经 验 , 能 够 对 大 型 项 目 做 全 面 的 管 理 和 控 制 ;3. 精 通 SQL 和 数 据 结 构 ; 有 数 据 建 模 经 验 , 熟 悉 MySQL 数 据 库 优 化 ;4. 熟 悉 服 务 器 安 全 设 置 和 对 安 全 问 题 的 处 理 ;5. 熟 悉 Linux、Windows Server 2003 操 作 及 管 理 ;6. 能 够 对 各 种 服 务 器 进 行 架 设 和 负 载 均 衡 维 护 , 提 高 Web 的 运 行 效 率 ;7. 精 通 Apache、IIS 等 常 用 Web 服 务 器 的 配 置 和 安 全 管 理 ;8. 熟 知 网 站 开 发 中 常 见 的 Web 漏 洞 、 服 务 器 漏 洞 及 避 免 方 法 ;9. 熟 知 W3C、 关 注 Web2.0 应 用 、 熟 悉 Ajax、 用 户 行 为 分 析 等 Web2.0 关 键 技 术 , 熟悉 URLRewirte 等 各 项 网 站 研 发 优 化 技 术 ;10. 熟 悉 网 站 架 构 方 面 技 术 , 要 求 如 下 :(1)HTML 静 态 化 ;(2) 图 片 服 务 器 分 离 ( 服 务 器 分 化 );(3) 数 据 库 集 群 和 库 表 散 列 ;网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 12/87


PHP 企 业 招 聘(4) 缓 存 ;(5) 镜 像 ;(6) 负 载 均 衡 ( 硬 件 四 层 交 换 、 软 件 四 层 交 换 );(7) 分 布 式 服 务 器 集 群 。《PHPer》11. 功 能 开 发 经 验 要 求 如 下 :(1)RSS 系 统 ;(2)TAG 系 统 ;(3)2 级 域 名 系 统 ;(4)Web 聊 天 系 统 。联 系 方 式 :地 址 : 深 圳 市 龙 岗 区 坂 田 岗联 系 人 :PHPChina 伯 乐 王 志 军电 子 邮 箱 :wangzhijun@comsenz.com公 司 介 绍赤 子 缘 网 络 技 术 有 限 公 司 坐 落 于 深 圳 市 龙 岗 区 坂 田 岗 头 商 业 中 心 路 段 , 北 临 深 圳 “ 北 硅谷 ” 华 为 集 团 、 富 士 康 等 十 多 个 大 型 高 新 技 术 产 业 园 区 , 地 理 位 置 优 越 , 交 通 便 利 。 公 司 于2007 年 8 月 正 式 成 立 , 主 要 从 事 SNS2.0 网 站 的 策 划 、 设 计 、 开 发 以 及 网 站 开 发 后 期 的 运 营及 相 关 服 务 , 是 国 内 首 家 致 力 于 SNS2.0 开 发 及 运 营 的 网 络 公 司 。作 为 新 型 的 网 络 公 司 , 赤 子 缘 在 创 办 伊 始 , 就 陆 续 在 武 汉 、 西 安 、 合 肥 、 成 都 等 各 大 省会 城 市 成 功 创 立 了 办 事 处 。 公 司 现 有 员 工 40 余 人 , 设 有 董 事 会 、 技 术 部 、 策 划 部 、 设 计 部 、人 事 行 政 部 、 财 务 部 、 营 销 部 等 部 门 。 赤 子 缘 弘 扬 “ 思 考 、 创 新 、 务 实 ” 的 企 业 精 神 , 恪 守“ 诚 信 ” 的 职 业 道 德 , 以 “ 平 等 尊 重 、 自 信 执 着 、 和 谐 共 赢 ” 为 理 念 , 坚 持 “ 用 事 业 吸 引 人 、用 制 度 激 励 人 、 用 文 化 鼓 舞 人 、 用 感 情 温 暖 人 、 用 适 当 的 待 遇 留 住 人 ” 的 人 才 机 制 , 为 员 工提 供 良 好 的 发 展 环 境 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 13/87


PHP 就 业 : 我 看 求 职 这 回 事PHP 就 业《PHPer》我 看 求 职 这 回 事作 者 : 肥 同 小 可PHPChina 上 比 较 火 爆 的 版 块 , 除 了 “ 基 础 编 程 ” 和 “ 夜 色 ” 就 是 “ 招 聘 求 职 ” 了 , 我 们会 在 这 个 版 块 发 现 一 个 现 象 : 想 招 聘 的 企 业 招 不 到 合 适 的 PHP 程 序 员 , 成 天 在 吵 着 嚷 着 招 贤纳 士 ; 想 求 职 的 PHP 程 序 员 又 找 不 到 理 想 的 工 作 , 成 天 在 叫 着 喊 着 寻 找 伯 乐 …… 教 育 部 的 大大 说 , 这 就 是 传 说 中 的 结 构 化 失 调 。本 文 我 无 意 讨 论 企 业 在 招 聘 方 面 应 该 如 何 解 决 , 只 着 力 探 讨 一 下 关 于 PHP 程 序 员 在 求 职方 面 我 个 人 的 一 点 经 验 和 感 想 , 希 望 能 给 正 在 求 职 或 跳 槽 及 将 要 求 职 或 想 要 跳 槽 的 朋 友 们 一点 帮 助 , 算 是 抛 砖 引 玉 , 这 个 话 题 也 是 老 生 常 谈 了 , 多 的 我 就 不 说 了 , 程 咬 金 三 板 斧 足 矣 ,我 也 只 陈 述 三 点 我 认 为 最 重 要 的 事 情 。自 我 推 销 及 能 力 积 累刚 入 行 朋 友 的 简 历 最 容 易 犯 两 种 错 误 ——第 一 、 绿 色 天 然 型这 种 简 历 你 看 了 后 会 觉 得 :“ 嗨 , 这 孩 子 真 实 在 , 不 过 水 平 也 太 寒 碜 了 点 , 算 了 ……”。这 种 简 历 第 一 个 特 点 是 简 单 , 惜 字 如 金 ( 有 的 居 然 连 一 页 纸 都 没 写 满 ); 第 二 个 特 点 是 实 诚 ,自 爆 其 短 (“ 英 语 较 差 ” 这 种 描 述 都 收 录 在 内 ); 第 三 个 特 点 是 可 能 笔 误 较 多 , 排 版 较 差 。 这种 简 历 产 生 的 原 因 , 第 一 是 制 作 简 历 的 求 职 者 对 简 历 不 重 视 , 第 二 是 真 的 可 能 不 会 弄 简 历 。如 果 你 在 求 职 , 投 了 简 历 没 有 面 试 机 会 , 恐 怕 多 半 原 因 是 简 历 不 够 好 ; 如 果 有 了 面 试 机 会 但是 应 聘 未 遂 , 最 大 的 可 能 就 是 能 力 问 题 了 。 这 不 是 一 个 酒 香 不 怕 巷 子 深 的 时 代 了 , 皇 帝 的 女儿 也 愁 嫁 啊 , 所 以 , 多 看 看 简 历 如 何 编 写 的 资 料 吧 , 网 络 上 遍 地 都 是 。第 二 、 花 里 胡 哨 型还 记 得 大 学 毕 业 前 , 每 个 同 学 都 会 精 心 的 弄 一 份 简 历 , 当 年 其 实 在 专 业 技 能 方 面 没 什 么好 写 , 因 为 实 在 太 菜 了 , 不 过 每 个 人 的 简 历 都 很 长 很 能 扯 , 精 通 很 多 技 术 、 了 解 N 多 语 言 、人 品 顶 呱 呱 、 证 书 一 大 堆 …… 但 每 个 人 都 清 楚 , 就 是 一 金 玉 其 外 , 结 果 , 去 求 职 的 时 候 碰 的满 脑 袋 包 , 回 头 自 己 还 琢 磨 “ 这 世 道 太 差 了 ”。 我 和 很 多 求 职 的 朋 友 讲 , 我 们 不 能 讲 假 话 , 这是 诚 信 问 题 ; 但 是 我 们 不 一 定 要 把 所 有 的 真 话 都 讲 出 来 , 这 是 生 存 问 题 ( 就 像 上 面 提 到 的 “ 英语 较 差 ” 大 可 不 提 啊 ), 如 果 我 告 诉 你 这 也 是 扬 长 避 短 , 可 能 你 会 觉 得 虚 伪 , 但 是 , 生 存 就 是这 样 , 就 像 《 天 下 无 贼 》 中 的 傻 小 子 不 应 该 大 喊 “ 你 们 谁 是 贼 呀 , 站 出 来 给 俺 看 看 ” 一 样 。对 于 第 一 种 , 我 想 告 诫 这 样 的 朋 友 , 学 会 自 我 推 销 ,“ 路 遥 知 马 力 , 日 久 见 人 心 ” 的 前 提是 有 机 会 被 录 用 让 别 人 了 解 你 , 否 则 还 见 什 么 人 心 啊 , 面 试 就 被 干 掉 了 。 所 以 , 好 好 包 装 自己 的 简 历 。 对 于 第 二 种 , 我 想 奉 劝 这 样 的 朋 友 , 一 是 , 一 样 精 强 于 百 样 通 , 面 面 俱 到 就 是 没有 重 点 ; 二 是 , 有 什 么 说 什 么 , 一 个 人 能 力 是 很 容 易 考 核 的 , 假 话 骗 不 了 人 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 14/87


PHP 就 业 : 我 看 求 职 这 回 事《PHPer》我 曾 经 亲 眼 目 睹 了 一 次 失 败 的 面 试 过 程 , 当 时 公 司 在 青 岛 有 一 家 合 作 的 伙 伴 , 我 过 去 支援 , 到 这 家 公 司 时 , 他 们 的 老 板 要 面 试 的 一 个 人 刚 到 , 他 就 让 我 先 坐 在 他 的 办 公 室 沙 发 上 休息 , 结 果 看 到 了 一 次 经 典 的 求 职 失 败 。 面 试 的 兄 弟 有 多 年 经 验 , 甚 至 自 己 开 过 公 司 , 自 视 很高 , 在 面 试 开 始 后 , 这 兄 台 就 坐 在 椅 子 上 摇 来 摇 去 ( 椅 子 为 转 椅 ), 这 个 老 板 就 一 直 看 着 他 摇来 摇 去 …… 后 来 估 计 实 在 受 不 了 了 ,“xxx, 我 想 我 们 可 以 结 束 今 天 的 面 试 了 , 我 承 认 你 有 丰富 的 行 业 经 验 和 优 秀 的 技 术 功 底 , 但 是 今 天 我 们 这 个 严 肃 的 面 试 中 , 你 坐 在 椅 子 转 来 转 去 ,我 认 为 这 是 对 这 次 面 试 及 对 我 的 不 尊 重 、 对 我 们 公 司 的 不 重 视 , 谢 谢 你 的 到 来 , 期 望 以 后 有机 会 合 作 ”。 就 因 为 这 么 一 个 小 事 , 这 个 可 怜 的 兄 台 就 失 去 了 一 次 好 机 会 , 不 过 亡 羊 补 牢 , 希望 这 位 兄 台 以 后 不 再 犯 这 样 的 错 误 吧 。小 事 不 小 , 小 事 体 现 了 一 个 人 的 心 态 , 可 以 看 出 来 一 个 人 的 性 格 , 可 以 呈 现 出 来 一 个 人为 人 处 事 的 原 则 。 所 以 , 切 记 注 意 细 节 。 就 像 简 历 , 这 么 重 要 的 个 人 描 述 文 档 , 是 不 应 该 有错 别 字 的 , 这 就 是 细 节 ; 就 像 面 试 前 , 先 要 了 解 应 聘 公 司 的 名 称 与 业 务 , 不 要 浪 费 彼 此 的 时间 , 这 也 是 细 节 。 这 些 许 许 多 多 的 细 节 , 造 成 了 成 功 的 人 与 失 败 的 人 之 间 的 差 异 。一 个 人 要 养 成 一 种 做 事 的 风 格 , 这 种 风 格 就 像 人 的 标 签 , 他 将 会 成 为 你 的 无 形 资 产 。一 个 人 会 给 别 人 一 种 感 觉 , 比 如 诚 实 、 比 如 勤 奋 、 比 如 可 信 、 比 如 聪 明 , 求 职 的 过 程 中也 是 如 此 , 别 人 在 短 暂 的 接 触 中 , 也 会 对 你 有 一 个 评 价 , 好 的 或 是 坏 的 , 这 有 时 也 决 定 了 求职 的 成 功 与 否 。 如 果 你 给 人 感 觉 不 思 进 取 不 够 勤 奋 , 也 许 面 试 就 会 因 此 而 终 止 ; 如 果 你 给 人感 觉 做 事 有 条 理 心 思 细 腻 , 也 许 面 试 会 因 此 而 加 分 。但 是 一 个 人 的 做 事 风 格 , 不 会 因 为 你 过 去 懒 散 而 今 天 觉 得 自 己 应 该 展 示 自 己 精 练 的 一 面 ,就 所 有 的 做 事 方 法 嘎 巴 一 下 子 都 转 变 了 , 这 是 一 个 习 惯 的 问 题 。 就 像 一 个 人 的 桌 子 总 是 杂 乱无 章 , 你 能 奢 望 他 工 作 上 井 井 有 条 吗 ; 就 像 一 个 人 的 着 装 总 是 乱 七 八 糟 , 你 敢 想 象 他 是 一 个可 堪 大 用 的 人 吗 ; 就 像 一 个 人 总 是 上 班 迟 到 、 约 人 晚 点 , 你 会 把 紧 急 重 要 的 事 情 交 给 他 吗 ……一 个 人 做 事 要 有 自 己 的 原 则 , 要 约 束 和 要 求 自 己 , 从 一 点 一 滴 开 始 , 从 一 件 一 件 的 小 事 开 始 ,不 断 的 做 不 断 的 改 进 , 做 的 久 了 , 就 会 变 成 一 种 习 惯 , 在 以 后 的 为 人 处 事 中 就 会 不 知 不 觉 自动 的 表 现 出 来 。有 的 年 轻 人 还 没 有 建 立 很 好 的 时 间 观 念 , 那 么 就 从 要 约 守 时 开 始 锻 炼 吧 ; 有 的 年 轻 人 没有 清 晰 地 的 目 标 , 那 么 就 从 把 每 天 要 做 的 事 情 写 出 来 一 件 一 件 按 序 来 做 开 始 吧 ; 有 的 年 轻 人没 有 意 识 到 诚 信 的 重 要 性 , 那 么 就 从 即 便 答 应 别 人 的 是 一 件 小 事 也 都 要 做 到 , 做 不 到 就 提 前告 诉 别 人 开 始 吧 。 一 个 人 建 立 一 个 自 己 的 风 格 , 是 必 要 的 , 当 然 这 种 风 格 要 是 积 极 向 上 的 。工 作 多 年 的 人 , 更 要 在 职 场 不 断 向 做 的 好 的 人 学 习 优 点 , 对 做 的 差 的 人 引 以 为 戒 , 不 断 的 历练 自 己 。人 脉 积 累 及 圈 子 理 论求 职 , 似 乎 都 是 我 们 去 找 工 作 , 其 实 也 可 以 让 工 作 来 找 你 。想 让 工 作 来 找 你 , 有 两 点 要 搞 明 白 的 问 题 , 第 一 , 人 脉 ; 第 二 , 圈 子 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 16/87


PHP 就 业 : 我 看 求 职 这 回 事《PHPer》年 再 创 业 , 成 功 的 几 率 会 高 一 点 , 一 个 人 连 职 员 都 做 不 好 很 难 做 好 一 个 老 板 , 踏 踏 实 实 的 一步 一 步 的 走 吧 。愿 人 人 皆 可 成 为 千 里 象 , 噗 通 噗 通 的 奔 跑 在 求 职 路 上 , 坠 地 有 声 , 铿 锵 有 力 , 谨 祝 。作 者 介 绍 :李 明 , 毕 业 于 哈 尔 滨 理 工 大 学 计 算 机 专 业 , 微 软 认 证 讲 师 (MCT)、 中 国 UNIX 用 户 协 会讲 师 、 即 时 科 研 学 院 金 牌 讲 师 、 红 旗 Linux认 证 讲 师 。现 任 康 盛 创 想 ( 北 京 ) 科 技 有 限 公 司PHPChina 事 业 部 总 监 , 曾 历 任 金 蝶 财 务 软件 测 试 工 程 师 、 安 易 财 务 软 件 开 发 部 主 管 、北 京 神 脑 咨 讯 有 限 公 司 项 目 经 理 、 即 时 俊业 软 件 有 限 公 司 研 究 院 副 院 长 等 职 。曾 参 与 编 写 《UNIX 系 统 管 理 实 用 教程 》、《UNIX 网 络 管 理 实 用 教 程 》、《SunSolaris8 系 统 管 理 员 指 南 》、《Windows/UNIX Linux 综 合 组 网 技 术 》、《PHP5 项 目 开 发 实 战 详解 》、《Ubuntu5 从 学 习 到 使 用 》 等 图 书 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 18/87


PEA 活 动 : 金 融 危 机 时 期 PEA 应 该 做 什 么PEA 活 动《PHPer》金 融 危 机 时 期 PEA 应 该 做 什 么作 者 : 雷 锋这 次 世 界 性 金 融 海 啸 的 到 来 , 多 少 也 影 响 到 了 我 们 PHP 行 业 的 发 展 , 经 常 会 听 到 PHPer找 人 推 荐 工 作 , 或 者 公 司 面 临 裁 员 , 还 有 些 做 项 目 外 包 的 托 人 介 绍 项 目 , 虽 然 在 以 前 也 经 常有 这 种 事 情 发 生 , 但 是 近 期 频 率 更 高 , 说 明 这 次 金 融 海 啸 也 波 及 到 了 我 们 。 那 么 我 们 PEA 作为 国 内 PHP 推 广 组 织 , 应 该 做 些 什 么 呢 ?走 进 PHP 企 业PHPer 为 PHP 企 业 服 务 ,PEA 走 进 企 业 , 就 带 动 了 PHPer 与 企 业 多 接 触 的 机 会 , 这 样 才能 有 更 多 的 发 展 机 会 , 有 了 发 展 的 机 会 对 自 己 才 有 信 心 。 同 理 , 企 业 也 是 如 此 , 看 到 有 这 么多 有 热 情 的 PHPer, 也 会 更 加 坚 持 采 用 PHP。本 阶 段 典 型 活 动 有 :PEA( 深 圳 )11 月 16 日 走 进 大 展 集 团 (Achievo)大 展 集 团 作 为 Yahoo 亚 太 地 区 的 外 包 项 目 承 包 商 , 有 很 多 PHP 的 应 用 , 需 要 大 量 的 PHP程 序 员 , 并 且 他 们 的 技 术 需 要 符 合 Yahoo 的 要 求 , 走 进 这 种 高 效 应 用 PHP 的 企 业 , 可 以 让PEA 成 员 学 习 更 新 的 PHP 技 术 , 对 于 大 展 来 说 也 可 以 给 PEA 成 员 多 一 个 就 业 的 渠 道 , 达 成一 个 双 赢 的 局 面 。 在 国 内 PHP 的 大 型 企 业 很 多 , 我 们 PEA 需 要 多 走 进 这 些 企 业 , 为 大 家 提供 更 多 的 机 会 。走 进 校 园PHPChina 在 国 内 建 立 了 一 些 培 训 中 心 , 为 企 业 提 供 人 才 作 出 了 巨 大 的 贡 献 , 但 是 中 国 有很 多 的 企 业 需 要 PHP 程 序 员 , 光 靠 PHPChina 的 培 训 中 心 还 是 不 能 完 全 满 足 这 样 的 需 求 , 校园 就 成 为 另 一 个 PHPer 巨 大 的 输 出 方 , 各 地 的 PEA 需 要 多 进 入 学 校 推 广 PHP, 发 展 更 多 的PHP 程 序 员 , 这 样 才 能 让 PHP 企 业 可 以 招 聘 到 PHP 程 序 员 , 才 能 给 PHP 企 业 有 更 多 的 信 心继 续 采 用 PHP。本 阶 段 典 型 的 活 动 有 :PHP 策 进 会 ( 福 州 )11 月 22 日 活 动福 州 本 次 活 动 是 和 本 地 软 件 学 院 一 起 组 织 的 , 活 动 中 有 PEA 成 员 和 软 件 学 院 学 生 , 在 PEA的 组 织 带 动 下 , 软 件 学 院 的 学 生 也 可 以 了 解 到 当 今 PHP 发 展 的 形 势 , 让 他 们 加 入 到 PHP 的学 习 中 来 , 成 为 未 来 PHP 工 程 师 , 为 我 们 企 业 提 供 更 多 的 专 业 人 才 。全 国 联 合 活 动在 国 内 有 很 多 PHP 的 应 用 已 经 非 常 广 泛 , 并 且 我 们 PEA 虽 然 是 全 国 性 的 组 织 , 但 是 真 正全 国 联 合 组 织 活 动 的 机 会 也 是 比 较 少 , 如 果 真 正 和 一 些 全 国 性 的 企 业 联 合 组 织 活 动 , 是 我 们发 展 的 一 个 新 高 峰 , 也 是 我 们 PEA 团 队 协 作 的 一 个 方 向 , 全 国 联 合 活 动 对 于 我 们 PEA 的 发展 能 够 起 到 联 动 效 应 , 提 高 我 们 的 协 作 能 力 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 19/87


PEA 活 动 : 金 融 危 机 时 期 PEA 应 该 做 什 么《PHPer》本 阶 段 典 型 活 动 : 北 京 11 月 1 日 PEA—— 网 络 地 图 使 用 、08 年 11 月 30 日 上 海 活 动网 络 地 图 现 在 应 用 非 常 广 泛 了 , 只 要 会 上 网 的 人 , 要 去 一 个 不 知 道 的 地 方 基 本 都 会 去 查网 络 地 图 , 随 着 互 联 网 步 入 Web2.0 时 代 , 网 站 也 已 经 由 以 前 的 文 字 型 发 展 到 图 片 型 再 到 视 频型 , 而 在 将 来 电 子 地 图 将 成 为 Web2.0 网 站 所 不 可 或 缺 的 重 要 元 素 , 中 国 目 前 已 有 9000 万 的网 络 地 图 使 用 者 了 。 而 PHP 作 为 Web 语 言 的 一 种 , 网 络 地 图 肯 定 会 应 用 其 中 , 这 样 一 个 新 的互 联 网 技 术 是 我 们 PHPer 都 需 要 关 注 和 学 习 的 , 像 这 种 机 会 我 们 就 可 以 做 一 个 全 国 的 联 合 活动 , 带 动 大 家 学 习 , 并 且 可 以 起 到 一 个 让 我 们 全 国 PEA 联 动 的 效 果 , 让 我 们 全 国 一 起 团 队 协作 , 共 同 学 习 进 步 。以 上 是 我 们 近 阶 段 所 作 的 , 也 是 我 们 PEA 在 金 融 危 机 时 期 需 要 为 PHPer 所 作 的 事 情 , 当然 不 局 限 于 这 些 , 我 们 还 有 很 多 事 情 需 要 去 做 , 比 如 我 们 即 将 面 临 裁 员 、 项 目 外 包 减 少 等 问题 , 我 们 还 需 要 在 这 些 问 题 来 临 之 前 还 需 要 架 起 一 道 企 业 和 PEA 成 员 沟 通 的 桥 梁 , 给 双 方 提供 更 多 的 就 业 和 招 聘 的 机 会 , 虽 然 我 们 现 在 也 有 做 一 些 桥 梁 的 工 作 , 但 是 还 是 不 太 够 , 以 后我 们 需 要 提 供 更 多 这 样 的 招 聘 或 者 求 职 的 机 会 , 为 大 家 做 更 多 的 服 务 , 让 大 家 安 全 的 度 过 这段 困 难 时 期 。 同 时 也 希 望 所 有 PEA 成 员 一 起 努 力 支 持 PEA 的 发 展 , 有 了 大 家 的 支 持 PEA 才能 为 PHPer 做 更 多 更 好 的 服 务 ! 努 力 吧 ,2008 即 将 过 去 , 我 们 期 待 2009 大 家 更 上 层 楼 !网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 20/87


新 手 乐 园 : 使 用 (jQuery+JSON) 开 发 网 页 聊 天 室《PHPer》新 手 乐 园使 用 (jQuery+JSON) 开 发 网 页 聊 天 室作 者 : 乔 聪1 简 介jQuery 是 一 个 了 不 起 的 JavaScript 库 , 它 可 以 是 我 们 用 很 少 的 几 句 代 码 就 可 以 创 建 出 漂 亮的 页 面 效 果 。jQuery 对 Ajax 进 行 了 非 常 好 的 封 装 , 让 Ajax 的 前 台 调 用 更 加 简 洁 跨 平 台 。 本文 不 对 jQuery 基 础 做 更 多 的 介 绍 , 有 兴 趣 者 可 以 访 问 jQuery 社 区 , 得 到 最 新 的 jQuery 版 本和 相 关 教 程 。JSON(JavaScript Object Notation) 是 一 种 轻 量 级 的 数 据 交 换 格 式 , 易 于 人 阅 读 和 编 写 ,同 时 也 易 于 机 器 解 析 和 生 成 。JSON 采 用 完 全 独 立 于 语 言 的 文 本 格 式 , 但 是 也 使 用 了 类 似 于 C语 言 家 族 的 习 惯 , 这 些 特 性 使 JSON 成 为 Ajax 调 用 中 理 想 的 数 据 交 换 语 言 。PHP5.2 中 内 置了 处 理 JSON 的 两 个 函 数 :json_encode 和 json_decode, 可 以 方 便 地 把 PHP 的 数 组 和 JSON 字符 串 进 行 相 互 转 换 。本 文 将 使 用 jQuery 做 前 台 的 Ajax 调 用 , 后 台 PHP 处 理 数 据 库 操 作 , 使 用 JSON 做 数 据传 输 , 完 成 一 个 简 易 的 网 页 文 本 聊 天 室 。 该 聊 天 室 的 功 能 包 括 发 送 文 本 消 息 、 显 示 聊 天 内 容 、显 示 在 线 用 户 列 表 、 对 某 个 用 户 私 聊 等 。2 建 表所 有 的 聊 天 记 录 和 在 线 用 户 都 存 在 数 据 库 中 , 这 样 数 据 库 里 需 要 建 立 这 样 两 张 表 , 建 表SQL 如 下 :SQL 脚 本CREATE TABLE `messages` (`id` int(10) NOT NULL auto_increment,`sourceip` varchar(15) NOT NULL,`destip` varchar(15) NULL,`mtime` datetime NOT NULL,`content` varchar(500) NOT NULL,PRIMARY KEY (`id`));CREATE TABLE `useronline` (`userip` varchar(15) default NULL,-- 发 言 者 的 IP 地 址-- 接 收 者 的 IP 地 址 , 如 果 非 私 聊 就 为 NULL-- 发 言 时 间`lvtime` timestamp NULL default NULL);-- 发 言 内 容-- 在 线 用 户 的 IP 地 址-- 该 用 户 的 上 一 次 访 问 时 间3 页 面 布 局对 美 工 要 求 不 那 么 苛 刻 , 页 面 效 果 如 图 1。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 21/87


新 手 乐 园 : 使 用 (jQuery+JSON) 开 发 网 页 聊 天 室《PHPer》图 1页 面 效 果相 关 代 码 :相 关 代 码 聊 天 室 ALL对 说 :4 发 言当 用 户 在 msg 框 内 输 入 了 信 息 后 , 点 击 “ 发 送 ” 按 钮 , 或 者 在 文 本 框 内 按 回 车 按 钮 后 ,通 过 Ajax 将 文 本 内 容 发 送 到 后 台 。 在 这 里 应 该 注 意 , 发 送 信 息 和 接 收 信 息 是 两 个 独 立 的 过 程 ,两 者 之 间 没 有 关 系 。发 送 信 息 的 操 作 相 当 比 较 简 单 , 这 里 使 用 jQuery 的 Ajax 方 法 , 该 方 法 使 用 JSON 的 形 式封 装 了 提 交 类 型 、 目 标 URL、 提 交 的 数 据 和 Ajax 成 功 后 的 操 作 四 个 部 分 的 内 容 。 相 关 代 码 :代 码 片 段// 因 为 两 个 地 方 都 要 调 用 , 将 发 送 信 息 的 AJAX 过 程 封 装 为 一 个 函 数function sendMsg(){$.ajax({type: "GET",url: "msgInsert.php",// 将 目 标 和 聊 天 内 容 发 送 给 msgInsert.phpdata: "dest="+ $("#dest").val() +"&msg="+$("#msg").val(),网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 22/87


新 手 乐 园 : 使 用 (jQuery+JSON) 开 发 网 页 聊 天 室《PHPer》// 发 送 成 功 后 , 将 内 容 框 清 空success: function(v){$("#msg").val("");}});}// 点 击 " 发 送 " 按 钮 的 时 候 发 送$("input:button").click(sendMsg);// 在 文 本 框 上 按 回 车 也 能 发 送$("#msg").keypress(function(){if(event.keyCode == 13){ // 判 断 按 键 是 回 车sendMsg();}});后 台 的 msgInsert.php 接 收 到 数 据 后 , 将 信 息 插 入 到 数 据 库 中 。 该 部 操 作 并 不 用 给 前 台 返回 数 据 , 事 实 上 上 述 的 前 台 代 码 也 没 有 接 收 任 何 后 台 对 他 的 反 馈 。 简 单 的 操 作 如 下 :PHP 代 码


新 手 乐 园 : 使 用 (jQuery+JSON) 开 发 网 页 聊 天 室该 是 如 下 这 样 一 种 格 式 :《PHPer》如 下 所 示{msgs:[]}{id:1,content:'asdf',mtime:'2008-9-2'},{id:2,content:'aaaa',mtime:'2008-9-2'},{id:3,content:'bbbb',mtime:'2008-9-2'}OK, 这 几 个 问 题 都 确 定 了 , 就 可 以 进 行 相 关 的 代 码 开 发 了 。 首 先 前 台 的 请 求 :代 码 片 段// 获 取 信 息lastid=0; // 保 存 上 次 取 的 最 后 消 息 idfunction getMsg(){$.getJSON('msgGet.php', {'id':lastid}, function(json){var arr = json.msgs;// 得 到 对 象 中 的 信 息 的 数 组for( var i=0;i


新 手 乐 园 : 使 用 (jQuery+JSON) 开 发 网 页 聊 天 室《PHPer》if(mysql_num_rows($rs)) // 删 除 掉 最 后 一 个 ,$result = substr($result,0,-1);$result .= "]}";echo $result;6 维 护 在 线 用 户 列 表由 于 不 涉 及 用 户 的 注 册 登 陆 等 内 容 , 在 线 用 户 直 接 就 通 过 用 户 的 IP 地 址 来 表 示 。 用 户 只要 一 进 入 这 个 聊 天 室 页 面 , 就 要 把 用 户 的 IP 地 址 记 入 useronline 表 ; 一 旦 用 户 关 闭 聊 天 室 ,就 要 把 用 户 的 IP 地 址 从 表 中 删 掉 。 同 时 , 要 及 时 的 将 表 中 的 IP 地 址 发 送 给 每 一 个 客 户 端 ,显 示 在 在 线 用 户 列 表 中 。上 述 的 问 题 可 以 简 化 为 : 在 页 面 上 每 隔 几 秒 发 出 请 求 查 询 一 次 在 线 用 户 表 , 在 查 询 的 同时 更 新 本 客 户 端 IP 的 最 后 访 问 时 间 。 所 以 前 台 代 码 为 :代 码 片 段// 获 取 在 线 用 户 列 表function getUsers(){$.getJSON('userGet.php', function(json){$("#users")[0].length = 1; // 将 列 表 框 现 有 的 内 容 清 空var arr = json.users;// 得 到 对 象 中 的 信 息 的 数 组for( var i=0;i


新 手 乐 园 : 使 用 (jQuery+JSON) 开 发 网 页 聊 天 室《PHPer》if(mysql_num_rows($rs)) // 删 除 掉 最 后 一 个 ,$result = substr($result,0,-1);$result .= "]}";echo $result;7 私 聊有 了 前 面 的 基 础 , 私 聊 的 功 能 就 很 容 易 实 现 了 。 只 要 当 用 户 点 击 某 个 在 线 用 户 的 时 候 ,将 该 IP 地 址 显 示 到 目 标 IP 文 本 框 中 就 可 以 了 。 这 样 发 送 信 息 的 时 候 就 会 把 该 目 标 IP 一 起 发送 出 去 , 接 受 信 息 的 时 候 也 只 有 目 标 IP 的 客 户 端 才 能 查 询 到 这 样 的 信 息 。上 述 功 能 的 JavaScript 代 码 如 下 :代 码 如 下$("#users").click(function(){$("#dest").val($(this).val());});后 续 的 功 能 前 面 都 已 经 实 现 了 。所 有 代 码 见 附 件 中 /chat/ 文 件 夹作 者 介 绍 :乔 聪 , 双 博 国 际 (PHPChina 济 南 培 训 中 心 )QQ:23750125博 客 :http://www.Road2Lamp.com/blog网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 26/87


新 手 乐 园 : 解 读 Ajax+PHP 表 单 验 证《PHPer》解 读 Ajax+PHP 表 单 验 证作 者 :Cristian Darie翻 译 : 李 俊 鹏在 注 册 系 统 中 , 表 单 验 证 是 必 不 可 少 的 。 而 表 单 的 验 证 最 好 是 在 客 户 端 和 服 务 器 端 都 进行 验 证 , 一 是 为 了 避 免 需 要 提 交 才 能 全 部 验 证 —— 比 较 麻 烦 , 二 是 为 了 避 免 客 户 端 的JavaScript 失 效 而 使 污 染 数 据 存 入 到 数 据 库 。讲 了 。本 文 实 现 的 是 Ajax+PHP 表 单 验 证 。 即 :1. 光 标 从 表 单 上 移 开 时 , 域 值 被 发 送 到 服 务 器 进 行 验 证 并 返 回 成 功 或 者 失 败 。 如 果 失 败 ,则 显 示 一 个 友 好 的 错 误 消 息 ;2. 当 整 个 表 单 提 交 时 , 在 服 务 器 上 采 取 验 证 并 根 据 结 果 重 定 向 。当 然 , 本 文 还 是 有 很 多 可 以 改 善 的 地 方 的 , 比 如 正 则 表 达 式 的 缺 陷 设 计 等 , 这 里 就 不 多本 文 假 设 读 者 理 解 Ajax。由 于 用 户 在 表 单 中 各 个 元 素 间 切 换 的 时 候 我 们 都 需 要 向 服 务 器 发 送 一 个 异 步 请 求 进 行 数据 的 验 证 。 所 以 存 在 一 个 危 险 性 : 当 用 户 在 各 输 入 域 快 速 切 换 或 者 服 务 器 连 接 很 慢 的 时 候 ,客 户 端 将 试 图 通 过 XMLHttpRequest 对 象 会 创 建 新 的 服 务 器 请 求 , 但 是 这 个 XMLHttpRequest仍 然 忙 于 等 待 先 前 请 求 的 响 应 , 这 将 产 生 错 误 并 且 应 用 会 完 全 停 止 运 行 。本 文 采 取 的 解 决 方 案 是 利 用 队 列 这 种 FIFO 的 数 据 结 构 按 顺 序 进 行 处 理 。关 键 代 码 讲 解 :队 列 的 实 现 和 利 用 :代 码 片 段// 初 始 化 验 证 请 求 的 缓 存var cache = new Array();// 添 加 值 到 队 列 中 , 即 入 队 操 作cache.push("inputValue=" + inputValue + "&fieldID=" +fieldID);// 从 缓 存 获 取 一 个 新 的 参 数 集 , 即 出 队 操 作var cacheEntry = cache.shift();这 样 就 可 以 实 现 XMLHttpRequest 按 顺 序 地 完 整 处 理 每 一 个 请 求 , 具 体 如 下 :代 码 片 段// 处 理 每 个 表 单 域 验 证 的 函 数function validate(inputValue, fieldID){// 如 果 xmlHttp 不 是 空 的 就 继 续if (xmlHttp) {// 如 果 接 收 到 非 空 参 数 , 就 以 要 发 送 到 服 务 器 进 行 验 证 的 请 求 串 格 式 加 到 缓 存if (fieldID) {// 域 ID 不 为 空 才 能 将 其 加 入 缓 存 队 列// 进 行 编 码 以 便 安 全 将 它 们 添 加 到 一 个 HTTP 请 求 查 询 串网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 27/87


新 手 乐 园 : 解 读 Ajax+PHP 表 单 验 证《PHPer》}}inputValue = encodeURIComponent(inputValue);fieldID = encodeURIComponent(fieldID);// 添 加 值 到 队 列 中cache.push("inputValue=" + inputValue + "&fieldID=" +fieldID);// 尝 试 连 接 服 务 器try {// 仅 在 XMLHttpRequest 对 象 空 闲 且 缓 存 不 为 空 时 继 续if ((xmlHttp.readyState == 4 || xmlHttp.readyState == 0) && cache.length > 0) {// 从 缓 存 获 取 一 个 新 的 参 数 集var cacheEntry = cache.shift();// 构 造 一 个 服 务 器 请 求 来 验 证 取 出 的 数 据xmlHttp.open("POST", serverAddress, true);xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");xmlHttp.onreadystatechange = handleRequestStateChange;xmlHttp.send(cacheEntry);}}catch (e) {}// 当 连 接 服 务 器 失 败 时 显 示 一 个 错 误displayError(' 连 接 服 务 器 失 败 :' + e.toString());其 中 处 理 服 务 器 响 应 的 函 数 是 handleRequestStateChange, 每 次 从 服 务 器 成 功 接 收 响 应 时调 用 该 函 数 readResponse。该 函 数 首 先 检 查 接 收 的 内 容 是 否 为 服 务 器 端 的 错 误 报 告 , 完 成 后 再 阅 读 响 应 :代 码 片 段// 读 取 服 务 器 响 应function readResponse(){// 接 收 服 务 器 响 应var response = xmlHttp.responseText;// 服 务 器 错 误 ?if (response.indexOf("ERRNO") >= 0|| response.indexOf("error:") >= 0|| response.length == 0) {}throw (response.length == 0 ? " 服 务 器 错 误 " : response);// 以 XML 格 式 获 取 响 应 , 并 假 定 响 应 是 有 效 的 XMLresponseXml = xmlHttp.responseXML;// 获 取 文 档 元 素xmlDoc = responseXml.documentElement;result = xmlDoc.getElementsByTagName("result")[0].firstChild.data;fieldID = xmlDoc.getElementsByTagName("fieldid")[0].firstChild.data;根 据 结 果 , 进 行 友 好 错 误 提 示 的 处 理 :网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 28/87


新 手 乐 园 : 解 读 Ajax+PHP 表 单 验 证《PHPer》代 码 片 段 想 使 用 的 用 户 名 :


新 手 乐 园 : 解 读 Ajax+PHP 表 单 验 证《PHPer》… … 省 略 类 似 代 码// 验 证 用 户 名if(!$this->validateUserName($_POST['txtUsername'])) {$_SESSION['errors']['txtUsername'] = 'error';$errorsExist = 1;}}… … 省 略 类 似 代 码而 在 validate.php 中 则 创 建 一 个 新 的 验 证 类 :代 码 片 段// 创 建 新 的 验 证 对 象$validator = new Validate();// 读 取 验 证 类 型 (PHP 或 者 Ajax)$validationType = '';if(isset($_GET['validationType'])) {$validationType = $_GET['validationType'];}//Ajax 验 证 还 是 PHP 验 证 ?if($validationType == 'php') {//PHP 验 证 由 ValidatePHP 方 法 执 行 , 返 回 访 问 者 应 该 被 重 定 向 的 页 面 ,index.php 或 者 allok.phpheader("Location:" . $validator->ValidatePHP());}else{//Ajax 验 证 由 ValidateAjax 方 法 执 行 , 结 果 返 回 一 个 XML 文 档… … 省 略 部 分 代 码}最 后 , 建 议 错 误 的 处 理 最 好 不 同 的 错 误 输 出 特 定 的 错 误 , 最 好 不 要 统 一 设 置 为alert($message) 这 样 类 型 , 而 是 在 读 取 服 务 器 出 错 部 分 加 上 特 定 的 “ 读 取 服 务 器 响 应 出 错 ” 这样 的 信 息 , 查 找 起 错 误 比 较 方 便 。鉴 于 杂 志 篇 幅 问 题 , 解 读 有 局 限 性 , 但 是 在 源 代 码 中 仍 有 详 细 注 释 。所 有 代 码 见 附 件 中 /validate/ 文 件 夹译 者 介 绍 :李 俊 鹏PHPChina ID:casual0402现 在 福 州 就 读 , 大 二 学 生 , 喜 欢 并 学 习 着 PHP 中 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 30/87


新 手 乐 园 : 直 面 40 个 菜 鸟 迹 象《PHPer》直 面 40 个 菜 鸟 迹 象——40 个 迹 象 表 明 你 还 是 PHP 菜 鸟整 理 : 李 俊 鹏这 些 迹 象 不 只 是 用 来 告 诉 我 是 菜 鸟 , 还 告 诉 我 还 有 很 多 要 学 习 的 。简 介40 个 迹 象 的 英 文 版 权 归 Reinhold Weber 所 有 , 中 译 文 作 者 yangyang(aka davidkoree)。双 语 版 可 用 于 非 商 业 传 播 , 但 须 注 明 英 文 版 作 者 、 版 权 信 息 , 以 及 中 译 文 作 者 。 翻 译 水 平 有限 , 请 广 大 PHPer 指 正 。40 个 Conquer 的 作 者 是 《PHPer》 李 俊 鹏 , 可 用 于 非 商 业 传 播 。正 文我 愿 意 把 本 文 归 入 我 的 “ 编 程 糗 事 ” 系 列 。 尽 管 在 正 规 大 学 课 程 中 , 接 触 到 软 件 工 程 、企 业 级 软 件 架 构 和 数 据 库 设 计 , 但 我 还 是 时 不 时 地 体 会 到 下 述 事 实 带 给 我 的 “ 罪 恶 ” 感 , 当然 , 都 是 我 的 主 观 感 受 , 并 且 面 向 Eclipse。你 是 PHP 菜 鸟 , 如 果 你 :1. 不 会 利 用 如 phpDoc 这 样 的 工 具 来 恰 当 地 注 释 你 的 代 码Conquer 1phpDoc 是 PEAR 下 的 一 个 优 秀 模 块 , 如 同 javadoc 一 样 为 代 码 生 成 API 文 档 。phpDoc 采用 OOP 的 思 想 编 写 , 它 扫 描 指 定 目 录 下 的 PHP 源 码 , 识 别 出 注 释 中 的 专 用 标 记 然 后 生 成 XML文 件 ( 或 其 它 ), 然 后 建 立 相 应 的 索 引 。 即 本 质 是 从 源 码 中 的 注 释 生 成 文 档 。2. 对 优 秀 的 集 成 开 发 环 境 如 Zend Studio 或 Eclipse PDT 视 而 不 见Conquer 2我 不 知 道 该 怎 么 描 述 Zend, 只 是 夜 色 里 有 人 曾 这 么 说 过 :PHP 界 的 Zend 如 同 软 件 界 的微 软 ; 而 Eclipse 则 是 另 一 款 多 功 能 的 开 发 环 境 , 想 来 大 多 数 人 都 是 用 它 来 写 Java 的 ( 比 如我 ), 而 PDT 即 PHP Development Tools 则 是 可 以 使 用 户 可 以 在 Eclipse 写 PHP 的 插 件 。BTW,如 果 有 兴 趣 , 你 也 可 以 自 己 为 Eclipse 开 发 个 插 件 。^_^3. 从 未 用 过 任 何 形 式 的 版 本 控 制 系 统 , 如 SubclipseConquer 3版 本 控 制 系 统 ? 还 是 先 了 解 一 下 版 本 控 制 吧 : 版 本 控 制 就 是 数 据 仓 库 , 它 可 以 记 录 你 对文 件 的 每 次 更 改 。 这 样 自 然 也 就 了 解 了 什 么 是 版 本 控 制 系 统 了 。 而 进 一 步 的 了 解 不 是 三 两 句可 以 结 束 的 , 所 以 直 接 推 荐 , 自 己 选 择 一 个 吧 !(1)http://www.phpchina.com/bbs/thread-46209-1-1.html(2)http://bbs.phpchina.com/thread-47473-1-1.html(3)http://bbs.phpchina.com/thread-89264-1-1.html网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 31/87


新 手 乐 园 : 直 面 40 个 菜 鸟 迹 象4. 不 采 用 某 种 编 码 与 命 名 标 准 , 以 及 通 用 约 定 , 不 能 在 项 目 开 发 周 期 里 贯 彻 落 实《PHPer》Conquer 4我 觉 得 良 好 的 代 码 书 写 习 惯 令 人 很 舒 服 , 缩 进 实 在 是 必 需 的 —— 要 不 看 着 那 一 堆 密 密 麻麻 毫 无 美 感 的 代 码 , 实 在 令 人 郁 闷 。 缩 进 一 般 是 4 个 空 格 ,PEAR 标 准 中 不 建 议 使 用 TAB 键( 在 这 里 我 小 小 汗 颜 一 下 ), 因 为 有 些 场 合 会 出 现 问 题 ( 虽 然 我 还 没 遇 到 )。 而 命 名 建 议 变 量 :第 一 个 单 词 小 写 开 头 , 其 它 大 写 开 头 如 :myName, 而 类 名 建 议 都 大 写 开 头 如 :MyName 或者 My_Name, 至 于 用 不 用 下 划 线 我 觉 得 差 别 不 大 ( 如 果 很 大 请 指 教 )。5. 不 使 用 统 一 开 发 方 式Conquer 5由 于 还 是 个 人 PHP 爱 好 者 , 所 以 对 于 团 队 共 同 开 发 还 是 经 验 匮 乏 的 , 在 此 , 对 于 开 发 方式 这 个 词 有 种 好 像 理 解 又 不 理 解 的 错 觉 , 而 且 利 用 搜 索 引 擎 好 久 也 很 难 找 到 一 篇 比 较 满 意 的文 章 , 所 以 直 接 推 荐 :(1)http://www.phpchina.com/html/42/1142-7314.html(2)http://topic.csdn.net/u/20080509/09/9b81d740-68fc-4d63-9299-ce6675f240cb.html(3)http://www.ibm.com/developerworks/cn/web/wa-jacquard/index.html#N10064其 实 , 个 人 觉 得 开 发 方 式 这 个 词 挺 泛 、 挺 抽 象 ……6. 不 转 换 ( 或 ) 也 不 验 证 某 些 输 入 或 SQL 查 询 串 ( 译 注 : 参 考 PHP 相 关 函 数 )Conquer 6始 终 坚 信 一 点 : 绝 不 相 信 未 经 处 理 的 用 户 输 入 。 而 过 滤 用 户 输 入 是 Web 安 全 的 基 础 。 所以 设 计 者 始 终 应 该 清 楚 地 知 道 数 据 的 来 源 、 过 滤 数 据 、 将 已 经 处 理 过 的 数 据 和 未 处 理 的 数 据区 分 开 。7. 不 在 编 码 之 前 彻 底 规 划 你 的 程 序Conquer 7我 个 人 觉 得 这 点 和 写 程 序 前 画 流 程 图 之 类 或 者 做 项 目 的 开 发 流 程 一 样 , 应 该 不 需 要 过 多解 释 。8. 不 使 用 测 试 驱 动 开 发Conquer 8测 试 驱 动 开 发 (Test Driven Development, 英 文 缩 写 TDD) 是 极 限 编 程 的 一 个 重 要 组 成 部分 , 它 的 基 本 思 想 就 是 在 开 发 功 能 代 码 之 前 , 先 编 写 测 试 代 码 。 也 就 是 说 在 明 确 要 开 发 某 个功 能 后 , 首 先 思 考 如 何 对 这 个 功 能 进 行 测 试 , 并 完 成 测 试 代 码 的 编 写 , 然 后 编 写 相 关 的 代 码满 足 这 些 测 试 用 例 。 然 后 循 环 进 行 添 加 其 他 功 能 , 直 到 完 成 全 部 功 能 的 开 发 。 代 码 整 洁 可 用(clean code that works) 是 测 试 驱 动 开 发 所 追 求 的 目 标 。( 摘 自 百 度 百 科 )9. 不 在 错 误 开 启 状 态 下 进 行 编 码 和 测 试 ( 译 注 : 参 考 PHP 函 数 error_reporting)Conquer 9网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 32/87


新 手 乐 园 : 直 面 40 个 菜 鸟 迹 象《PHPer》我 想 一 般 写 代 码 的 时 候 都 会 开 启 错 误 报 告 吧 。 这 里 顺 便 了 解 下 error_reporting 原 型 为 interror_reporting([ int $level]), 该 函 数 的 作 用 是 设 置 要 显 示 报 告 的 错 误 等 级 , 详 情 参 阅 :http://cn2.php.net/manual/en/function.error-reporting.php10. 对 调 试 器 的 好 处 视 而 不 见Conquer 10推 荐 几 款 调 试 器 :(1)Zend IDE(2)APD(3)Xdebug11. 不 重 构 你 的 代 码Conquer 11重 构 是 指 使 用 一 系 列 重 构 准 则 ( 手 法 ), 在 不 改 变 “ 软 件 之 可 察 行 为 ” 前 提 下 , 调 整 其 结构 , 是 对 软 件 内 部 结 构 的 一 种 调 整 。 目 的 是 在 不 改 变 “ 软 件 之 可 察 行 为 ” 前 提 下 , 提 高 其 可理 解 性 , 降 低 其 修 改 成 本 。 重 构 的 好 处 能 改 进 软 件 设 计 使 软 件 更 容 易 被 理 解 , 帮 助 设 计 者 找到 BUG, 并 且 提 高 软 件 的 开 发 速 度 。 简 而 言 之 , 重 构 就 是 改 进 已 经 写 好 的 软 件 的 设 计 。12. 不 使 用 类 似 MVC 模 式 把 程 序 的 不 同 层 次 划 分 开Conquer 12MVC(Model View Controller) 即 模 型 — 视 图 — 控 制 器 , 视 图 是 呈 现 给 用 户 的 一 面 , 模 型则 是 处 理 任 务 的 模 块 , 而 控 制 器 则 是 控 制 视 图 和 模 型 间 的 映 射 , 即 在 用 户 响 应 下 选 择 何 种 模型 进 行 处 理 , 而 任 务 处 理 后 控 制 以 何 种 视 图 呈 现 。13. 不 知 道 这 些 概 念 :KISS、DRY、MVC、OOP、RESTConquer 13(1)KISS 是 指 Keep It Simple,Stupid( 摘 自 wikipedia), 指 设 计 时 要 坚 持 简 约 原 则 , 避 免不 必 要 的 复 杂 化 。(2)DRY 是 指 Don't Repeat Yourself( 摘 自 wikipedia), 特 指 在 程 序 设 计 以 及 计 算 中 避 免重 复 代 码 , 因 为 这 样 会 降 低 灵 活 性 、 简 洁 性 , 并 且 可 能 导 致 代 码 之 间 的 矛 盾 。(3)OOP 即 Object-Oriented Programming, 是 指 面 向 对 象 的 程 序 设 计 。 我 一 直 觉 得 经 典的 比 喻 是 汽 车 是 一 个 类 (Class), 而 这 个 类 的 属 性 有 轮 子 、 车 身 、 马 达 等 , 方 法 有 加 速 、减 速 等 ; 而 劳 斯 莱 斯 就 是 一 个 对 象 (Object) 了 , 这 个 对 象 继 承 了 汽 车 这 个 类 的 属 性 和 方法 ; 而 如 何 实 现 加 速 、 减 速 ? 这 样 的 信 息 被 隐 藏 了 —— 即 信 息 封 装 ( 封 装 ), 只 留 下 用 户接 口 给 我 们 了 , 比 如 踩 刹 车 、 踩 油 门 ; 至 于 多 态 嘛 , 我 粗 糙 比 喻 下 就 是 一 台 自 动 贩 卖 机( 我 们 假 设 它 每 种 价 格 只 有 一 款 饮 料 ), 同 样 是 投 币 这 种 方 法 , 但 是 你 投 进 去 2 元 跟 5 元得 到 的 结 果 是 不 一 样 的 —— 当 然 , 除 非 这 贩 卖 机 有 问 题 。(4)REST(Representational State Transfer) 是 一 种 针 对 网 络 应 用 的 设 计 和 开 发 方 式 , 可以 降 低 开 发 的 复 杂 性 , 提 高 系 统 的 可 伸 缩 性 。REST 提 出 了 一 些 设 计 概 念 和 准 则 :网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 33/87


新 手 乐 园 : 直 面 40 个 菜 鸟 迹 象《PHPer》a. 网 络 上 的 所 有 事 物 都 被 抽 象 为 资 源 (resource);b. 每 个 资 源 对 应 一 个 唯 一 的 资 源 标 识 (resource identifier);c. 通 过 通 用 的 连 接 器 接 口 (generic connector interface) 对 资 源 进 行 操 作 ;d. 对 资 源 的 各 种 操 作 不 会 改 变 资 源 标 识 ;e. 所 有 的 操 作 都 是 无 状 态 (stateless)。( 摘 自 百 度 百 科 )14. 不 用 return 而 是 直 接 在 你 的 函 数 或 类 中 输 出 (echo/print) 内 容Conquer 14这 一 点 , 观 摩 大 虾 的 源 代 码 都 是 用 return 的 , 所 以 我 一 般 也 这 么 学 习 使 用 这 , 至 于 原 因 ,我 就 是 觉 得 这 样 用 感 觉 蛮 好 的 。 或 许 是 严 禁 风 格 吧 。 但 是 其 实 我 对 这 句 有 点 不 理 解 , 函 数 一般 都 是 需 要 返 回 语 句 的 嘛 , 除 非 是 专 门 用 来 输 出 的 函 数 。15. 对 单 元 测 试 或 通 用 测 试 的 优 点 视 而 不 见Conquer 15(1) 单 元 测 试 是 在 软 件 开 发 过 程 中 要 进 行 的 最 低 级 别 的 测 试 活 动 , 在 单 元 测 试 活 动 中 ,软 件 的 独 立 单 元 将 在 与 程 序 的 其 他 部 分 相 隔 离 的 情 况 下 进 行 测 试 , 不 仅 能 保 证 项 目 进 度还 能 优 化 设 计 。 我 记 得 我 以 前 在 写 比 较 长 的 C 代 码 的 时 候 都 会 在 特 定 模 块 结 束 时 补 一 段测 试 代 码 来 检 验 , 不 知 道 算 不 算 。^_^(2) 通 用 测 试 技 术 ? 这 让 我 想 起 图 书 馆 里 图 灵 系 列 图 书 的 一 本 《 软 件 测 试 ****》, 具 体名 字 忘 记 了 。 这 些 都 是 属 于 软 件 测 试 的 范 畴 , 如 果 需 要 可 以 下 载 :http://bbs.phpchina.com/thread-94241-1-1.html16. 总 是 返 回 硬 编 码 的 HTML, 却 不 返 回 纯 粹 的 数 据 、 字 符 串 或 对 象17. 总 是 对 “ 消 息 ” 和 “ 配 置 参 数 ” 进 行 硬 编 码Conquer 16-17硬 编 码 的 使 用 会 造 成 程 序 的 不 灵 活 , 以 后 修 改 的 复 杂 问 题 , 还 有 可 能 会 遇 到 编 译 的 问 题 。更 具 体 了 解 :http://bbs.bc-cn.net/thread-32143-1-6.html18. 不 对 SQL 查 询 语 句 做 优 化Conquer 18SQL 语 句 的 优 化 是 将 性 能 低 下 的 SQL 语 句 转 换 成 目 的 相 同 的 性 能 优 异 的 SQL 语 句 。 这样 的 好 处 是 显 而 易 见 的 , 可 使 用 人 工 智 能 自 动 SQL 优 化 。19. 不 使 用 __autoload( 译 注 : 参 考 PHP 手 册 相 关 描 述 )Conquer 19__autoload 函 数 会 在 试 图 使 用 尚 未 被 定 义 的 类 时 自 动 调 用 。 通 过 调 用 此 函 数 , 脚 本 引 擎 在PHP 出 错 失 败 前 有 了 最 后 一 个 机 会 加 载 所 需 的 类 。 详 见 :http://cn.php.net/__autoload20. 不 允 许 智 能 错 误 处 理 ( 译 注 : 参 考 PEAR 的 ErrorStack)Conquer 20PEAR_ErrorStack 提 供 了 一 种 基 于 堆 栈 的 错 误 处 理 方 法 , 将 各 种 错 误 统 一 起 来 指 向 同 一 个网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 34/87


新 手 乐 园 : 直 面 40 个 菜 鸟 迹 象《PHPer》地 方 以 达 到 把 多 个 无 关 项 目 连 接 到 同 一 个 应 用 程 序 的 目 的 。( 译 自 :http://pear.php.net/package/PEAR_ErrorStack)21. 使 用 $_GET 替 代 $_POST 来 做 具 有 破 坏 性 的 传 递 操 作Conquer 21个 人 理 解 , 使 用 $_GET 会 使 一 些 信 息 暴 露 在 URL 中 。22. 不 知 道 怎 么 利 用 正 则 表 达 式Conquer 22正 则 表 达 式 ? 我 想 可 以 去 夜 色 找 找 shanji, 或 者 到 夜 色 共 享 手 册 里 下 载 一 本 学 习 :http://bbs.phpchina.com/thread-89223-1-1.html23. 从 未 听 说 过 SQL 注 入 或 跨 站 脚 本Conquer 23(1) 所 谓 SQL 注 入 , 就 是 通 过 把 SQL 命 令 插 入 到 Web 表 单 递 交 或 输 入 域 名 或 页 面 请 求的 查 询 字 符 串 , 最 终 达 到 欺 骗 服 务 器 执 行 恶 意 的 SQL 命 令 , 比 如 先 前 的 很 多 影 视 网 站 泄露 VIP 会 员 密 码 大 多 就 是 通 过 Web 表 单 递 交 查 询 字 符 暴 出 的 , 这 类 表 单 特 别 容 易 受 到SQL 注 入 式 攻 击 ;(2) 业 界 对 跨 站 攻 击 的 定 义 如 下 :“ 跨 站 攻 击 是 指 入 侵 者 在 远 程 Web 页 面 的 HTML 代码 中 插 入 具 有 恶 意 目 的 的 数 据 , 用 户 认 为 该 页 面 是 可 信 赖 的 , 但 是 当 浏 览 器 下 载 该 页 面 ,嵌 入 其 中 的 脚 本 将 被 解 释 执 行 。” 由 于 HTML 语 言 允 许 使 用 脚 本 进 行 简 单 交 互 , 入 侵 者便 通 过 技 术 手 段 在 某 个 页 面 里 插 入 一 个 恶 意 HTML 代 码 , 例 如 记 录 论 坛 保 存 的 用 户 信 息(Cookie), 由 于 Cookie 保 存 了 完 整 的 用 户 名 和 密 码 资 料 , 用 户 就 会 遭 受 安 全 损 失 。 如 这句 简 单 的 Java 脚 本 就 能 轻 易 获 取 用 户 信 息 :alert(document.cookie), 它 会 弹 出 一 个 包 含 用户 信 息 的 消 息 框 。 入 侵 者 运 用 脚 本 就 能 把 用 户 信 息 发 送 到 他 们 自 己 的 记 录 页 面 中 , 稍 做分 析 便 获 取 了 用 户 的 敏 感 信 息 。( 摘 自 百 度 百 科 )24. 不 允 许 简 易 配 置 , 也 不 允 许 类 的 构 造 函 数 接 受 参 数 传 递 而 后 执 行 set/get 方 法 , 或 运 行 时的 常 量 定 义Conquer 24就 一 句 话 : 不 要 不 允 许 类 的 构 造 函 数 接 受 参 数 传 递 。25. 不 理 解 面 向 对 象 编 程 (OOP) 的 优 势 和 劣 势26. 不 视 情 形 大 小 而 滥 用 OOP27. 自 认 为 实 现 可 复 用 的 软 件 一 定 等 于 / 需 要 让 你 的 代 码 遵 循 OOPConquer 25-27.OOP 的 优 点 : 使 人 们 的 编 程 与 实 际 的 世 界 更 加 接 近 , 所 有 的 对 象 被 赋 予 属 性 和 方 法 , 结果 编 程 就 更 加 富 有 人 性 化 。OOP 的 缺 点 : 就 C++ 而 言 , 由 于 面 向 更 高 的 逻 辑 抽 象 层 , 使 得C++ 在 实 现 的 时 候 , 不 得 不 做 出 性 能 上 面 的 牺 牲 , 有 时 候 甚 至 是 致 命 的 。28. 不 利 用 智 能 缺 省 值网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 35/87


新 手 乐 园 : 直 面 40 个 菜 鸟 迹 象Conquer 28我 想 , 使 用 缺 省 值 是 个 好 习 惯 。《PHPer》29. 没 有 单 一 的 配 置 文 件Conquer 29专 门 设 置 个 config.php 我 想 是 需 要 的 。30. 不 想 暴 露 文 件 源 码 , 却 用 .inc 后 缀 名 取 代 了 .phpConquer 30*.inc 文 件 顾 名 思 义 是 include file 的 意 思 , 一 般 我 们 使 用 inc 作 为 后 缀 , 是 因 为 这 样 能 体现 该 文 件 的 作 用 。*.inc 文 件 的 作 用 有 点 类 似 于 C/C++ 内 的 *.H、*.HPP 头 文 件 , 使 用 inc 文 件可 以 使 我 们 的 程 序 , 增 加 可 读 性 , 更 易 于 开 发 和 维 护 。31. 不 使 用 数 据 库 抽 象 层Conquer 31请 参 考 http://bbs.phpchina.com/thread-94258-1-1.html32. 不 能 保 持 DRY 作 风 , 即 不 重 复 自 己 , 如 果 你 总 是 在 复 制 粘 贴 一 些 东 西 , 说 明 你 设 计 得 很差 劲Conquer 32请 参 考 13 点33. 没 有 实 现 让 一 个 函 数 / 类 / 方 法 只 做 一 件 事 , 也 不 能 组 合 利 用 它 们Conquer 33这 需 要 锻 炼 , 在 实 践 中 学 习 、 完 善 着 。34. 没 能 尝 试 OOP 的 特 长 , 如 抽 象 类 、 接 口 、 多 态 、 继 承 , 访 问 控 制 修 饰 符 ( 译 注 : 如 public、private、protected)Conquer 34哦 ,my god, 我 想 还 是 参 考 25-27 吧 , 也 是 需 要 在 实 践 中 成 长 的 。35. 不 用 现 有 的 设 计 模 式 优 化 你 的 程 序 体 系 设 计Conquer 35推 荐 《Head First》 设 计 模 式36. 不 允 许 你 的 用 户 在 你 拥 有 很 多 文 件 或 目 录 的 情 况 下 定 义 基 础 目 录Conquer 36保 留 , 这 点 我 有 点 懵 。^_^37. 污 染 了 名 称 空 间 , 比 如 用 常 见 字 符 串 命 名 你 的 库 函 数Conquer 37哎 , 这 实 在 是 个 不 好 的 习 惯 , 不 过 好 习 惯 是 养 成 的 !网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 36/87


新 手 乐 园 : 直 面 40 个 菜 鸟 迹 象《PHPer》38. 使 用 数 据 库 表 时 不 使 用 表 前 缀Conquer 38我 想 , 可 能 ,PHPChina 的 数 据 表 的 前 缀 是 PPC_ 或 者 PCC_。 这 的 确 是 有 好 处 的 , 我 觉 得 ,就 好 像 字 段 名 使 用 如 txtUsername 这 样 的 格 式 。39. 不 使 用 统 一 的 模 板 引 擎Conquer 39这 我 都 有 点 不 知 道 该 怎 么 说 了 , 一 个 团 队 一 般 都 使 用 统 一 的 模 板 引 擎 吧 。40. 不 关 注 已 有 的 PHP 开 发 框 架 , 懒 于 探 索 ; 其 实 先 进 的 开 发 理 念 和 美 妙 代 码 就 蕴 含 其 中 。Conquer 40比 如 Zend Framework、CakePHP、FleaPHP、ThinkPHP 等 。作 者 介 绍 :李 俊 鹏PHPChina ID:casual0402现 在 福 州 就 读 , 大 二 学 生 , 喜 欢 并 学 习 着 PHP 中 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 37/87


模 板 和 引 擎 技 术 :PHP 源 代 码 分 析 :Zend HashTable 详 解《PHPer》模 板 和 引 擎 技 术PHP 源 代 码 分 析 :Zend HashTable 详 解作 者 :Altair在 PHP 的 Zend 引 擎 中 , 有 一 个 数 据 结 构 非 常 重 要 , 它 无 处 不 在 , 是 PHP 数 据 存 储 的 核心 , 各 种 常 量 、 变 量 、 函 数 、 类 、 对 象 等 都 用 它 来 组 织 , 这 个 数 据 结 构 就 是 HashTable。HashTable 在 通 常 的 数 据 结 构 教 材 中 也 称 作 散 列 表 、 哈 希 表 。 其 基 本 原 理 比 较 简 单 ( 如 果你 对 其 不 熟 悉 , 请 查 阅 随 便 一 本 数 据 结 构 教 材 或 在 网 上 搜 索 ), 但 PHP 的 实 现 有 其 独 特 的 地方 。 理 解 了 HashTable 的 数 据 存 储 结 构 , 对 我 们 分 析 PHP 的 源 代 码 , 特 别 是 Zend Engine 中的 虚 拟 机 的 实 现 时 , 有 很 重 要 的 帮 助 。 它 可 以 帮 助 我 们 在 大 脑 中 模 拟 一 个 完 整 的 虚 拟 机 的 形象 。 它 也 是 PHP 中 其 它 一 些 数 据 结 构 如 数 组 实 现 的 基 础 。Zend HashTable 的 实 现 结 合 了 双 向 链 表 和 向 量 ( 数 组 ) 两 种 数 据 结 构 的 优 点 , 为 PHP 提供 了 非 常 高 效 的 数 据 存 储 和 查 询 机 制 。1 HashTable 的 数 据 结 构在 Zend Engine 中 的 HashTable 的 实 现 代 码 主 要 包 括 zend_hash.h,zend_hash.c 这 两 个 文 件中 。Zend HashTable 包 括 两 个 主 要 的 数 据 结 构 , 其 一 是 Bucket( 桶 ) 结 构 , 另 一 个 是 HashTable结 构 。Bucket 结 构 是 用 于 保 存 数 据 的 容 器 , 而 HashTable 结 构 则 提 供 了 对 所 有 这 些 Bucket( 或桶 列 ) 进 行 管 理 的 机 制 。如 下 所 示typedef struct bucket {ulong h; /* Used for numeric indexing */uint nKeyLength; /* key 长 度 */void *pData; /* 指 向 Bucket 中 保 存 的 数 据 的 指 针 */void *pDataPtr; /* 指 针 数 据 */struct bucket *pListNext; /* 指 向 HashTable 桶 列 中 下 一 个 元 素 */struct bucket *pListLast; /* 指 向 HashTable 桶 列 中 前 一 个 元 素 */struct bucket *pNext; /* 指 向 具 有 同 一 个 hash 值 的 桶 列 的 后 一 个 元 素 */struct bucket *pLast; /* 指 向 具 有 同 一 个 hash 值 的 桶 列 的 前 一 个 元 素 */char arKey[1]; /* 必 须 是 最 后 一 个 成 员 ,key 名 称 */} Bucket;在 Zend HashTable 中 , 每 个 数 据 元 素 (Bucket) 有 一 个 键 名 (key), 它 在 整 个 HashTable中 是 唯 一 的 , 不 能 重 复 。 根 据 键 名 可 以 唯 一 确 定 HashTable 中 的 数 据 元 素 。 键 名 有 两 种 表 示方 式 。 第 一 种 方 式 使 用 字 符 串 arKey 作 为 键 名 , 该 字 符 串 的 长 度 为 nKeyLength(>0)。 注 意到 在 上 面 的 数 据 结 构 中 arKey 虽 然 只 是 一 个 长 度 为 1 的 字 符 数 组 , 但 它 并 不 意 味 着 key 只 能是 一 个 字 符 。 实 际 上 Bucket 是 一 个 可 变 长 的 结 构 体 , 由 于 arKey 是 Bucket 的 最 后 一 个 成 员 变量 , 通 过 arKey 与 nKeyLength 结 合 可 确 定 一 个 长 度 为 nKeyLength 的 key。 这 是 C 语 言 编 程中 的 一 个 比 较 常 用 的 技 巧 。 另 一 种 键 名 的 表 示 方 式 是 索 引 方 式 , 这 时 nKeyLength 总 是 0, 长网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 38/87


模 板 和 引 擎 技 术 :PHP 源 代 码 分 析 :Zend HashTable 详 解《PHPer》整 型 字 段 h 就 表 示 该 数 据 元 素 的 键 名 。 简 单 的 来 说 , 即 如 果 nKeyLength=0, 则 键 名 为 h; 否则 键 名 为 长 度 为 nKeyLength 的 字 符 串 arKey。当 nKeyLength>0 时 , 并 不 表 示 这 时 的 h 值 就 没 有 意 义 。 实 际 上 , 此 时 它 保 存 的 是 arKey对 应 的 hash 值 。 不 管 hash 函 数 怎 么 设 计 , 冲 突 都 是 不 可 避 免 的 , 也 就 是 说 不 同 的 arKey 可 能有 相 同 的 hash 值 。 具 有 相 同 hash 值 的 Bucket 保 存 在 HashTable 的 arBuckets 数 组 ( 参 考 下 面的 解 释 ) 的 同 一 个 索 引 对 应 的 桶 列 中 。 这 个 桶 列 是 一 个 双 向 链 表 , 其 前 向 元 素 , 后 向 元 素 分别 用 pLast、pNext 来 表 示 。 新 插 入 的 Bucket 放 在 该 桶 列 的 最 前 面 。在 Bucket 中 , 实 际 的 数 据 是 保 存 在 pData 指 针 指 向 的 内 存 块 中 , 通 常 这 个 内 存 块 是 系 统另 外 分 配 的 。 但 有 一 种 情 况 例 外 , 就 是 当 Bucket 保 存 的 数 据 是 一 个 指 针 时 ,HashTable 将 不会 另 外 请 求 系 统 分 配 空 间 来 保 存 这 个 指 针 , 而 是 直 接 将 该 指 针 保 存 到 pDataPtr 中 , 然 后 再 将pData 指 向 本 结 构 成 员 的 地 址 。 这 样 可 以 提 高 效 率 , 减 少 内 存 碎 片 。 由 此 我 们 可 以 看 到 PHPHashTable 设 计 的 精 妙 之 处 。 如 果 Bucket 中 的 数 据 不 是 一 个 指 针 ,pDataPtr 为 NULL。HashTable 中 所 有 的 Bucket 通 过 pListNext,pListLast 构 成 了 一 个 双 向 链 表 。 最 新 插 入 的Bucket 放 在 这 个 双 向 链 表 的 最 后 。注 意 在 一 般 情 况 下 ,Bucket 并 不 能 提 供 它 所 存 储 的 数 据 大 小 的 信 息 。 所 以 在 PHP 的 实 现中 ,Bucket 中 保 存 的 数 据 必 须 具 有 管 理 自 身 大 小 的 能 力 。如 下 所 示typedef struct _hashtable {uint nTableSize;uint nTableMask;uint nNumOfElements;ulong nNextFreeElement;Bucket *pInternalPointer;Bucket *pListHead;Bucket *pListTail;Bucket **arBuckets;dtor_func_t pDestructor;zend_bool persistent;unsigned char nApplyCount;zend_bool bApplyProtection;#if ZEND_DEBUGint inconsistent;#endif} HashTable;在 HashTable 结 构 中 ,nTableSize 指 定 了 HashTable 的 大 小 , 同 时 它 限 定 了 HashTable 中能 保 存 Bucket 的 最 大 数 量 , 此 数 越 大 , 系 统 为 HashTable 分 配 的 内 存 就 越 多 。 为 了 提 高 计 算效 率 , 系 统 自 动 会 将 nTableSize 调 整 到 最 小 一 个 不 小 于 nTableSize 的 2 的 整 数 次 方 。 也 就 是说 , 如 果 在 初 始 化 HashTable 时 指 定 一 个 nTableSize 不 是 2 的 整 数 次 方 , 系 统 将 会 自 动 调 整nTableSize 的 值 。 即nTableSize=2 ceil(log(nTableSize,2)) 或 nTableSize=pow(ceil(log(nTableSize,2)))网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 39/87


模 板 和 引 擎 技 术 :PHP 源 代 码 分 析 :Zend HashTable 详 解《PHPer》例 如 , 如 果 在 初 始 化 HashTable 的 时 候 指 定 nTableSize=11,HashTable 初 始 化 程 序 会 自 动将 nTableSize 增 大 到 16。arBuckets 是 HashTable 的 关 键 ,HashTable 初 始 化 程 序 会 自 动 申 请 一 块 内 存 , 并 将 其 地 址赋 值 给 arBuckets, 该 内 存 大 小 正 好 能 容 纳 nTableSize 个 指 针 。 我 们 可 以 将 arBuckets 看 作 一个 大 小 为 nTableSize 的 数 组 , 每 个 数 组 元 素 都 是 一 个 指 针 , 这 个 指 针 指 向 实 际 存 放 数 据 的Bucket。 刚 开 始 时 每 个 指 针 均 为 NULL。nTableMask 的 值 永 远 是 nTableSize–1, 注 意 这 个 nTableSize 是 调 整 大 小 后 的 TableSize,引 入 这 个 字 段 的 主 要 目 的 是 为 了 提 高 计 算 效 率 , 用 它 可 快 速 计 算 Bucket 键 名 在 arBuckets 数组 中 的 索 引 。nNumberOfElements 记 录 了 HashTable 当 前 保 存 的 数 据 元 素 的 个 数 。 当 nNumberOfElement大 于 nTableSize 时 ,HashTable 将 自 动 扩 展 为 原 来 的 两 倍 大 小 。nNextFreeElement 记 录 HashTable 中 下 一 个 可 用 于 插 入 数 据 元 素 的 arBuckets 的 索 引 。pListHead、pListTail 分 别 表 示 HashTable 中 所 有 的 Bucket 组 成 的 双 向 链 表 的 第 一 个 和 最后 一 个 元 素 , 这 些 Bucket 通 常 是 根 据 插 入 的 顺 序 排 列 的 。 也 可 以 通 过 各 种 排 序 函 数 对 其 进 行重 新 排 列 。pInternalPointer 则 用 于 在 遍 历 HashTable 时 记 录 当 前 遍 历 的 位 置 , 它 是 一 个 指 针 ,指 向 当 前 正 在 遍 历 的 Bucket, 初 始 值 是 pListHead。pDestructor 是 一 个 函 数 指 针 , 在 HashTable 的 增 加 、 修 改 、 删 除 Bucket 时 自 动 调 用 , 用于 对 Bucket 中 的 数 据 进 行 析 构 操 作 。persistent 标 志 位 指 出 了 Bucket 内 存 分 配 的 方 式 。 如 果 persisient 为 TRUE, 则 使 用 操 作 系统 本 身 的 内 存 分 配 函 数 为 Bucket 分 配 内 存 , 否 则 使 用 PHP 的 内 存 分 配 函 数 。 关 于 PHP 的 内存 管 理 机 制 , 本 文 暂 不 讨 论 。nApplyCount 与 bApplyProtection 结 合 提 供 了 一 个 防 止 在 遍 历 HashTable 时 进 入 递 归 循 环时 的 一 种 机 制 。inconsistent 成 员 用 于 调 试 目 的 , 只 在 PHP 编 译 成 调 试 版 本 时 有 效 。 表 示 HashTable 的 状态 , 状 态 有 四 种 , 如 表 -1。表 -1HashTable 的 状 态状 态 值HT_IS_DESTROYINGHT_IS_DESTROYEDHT_CLEANINGHT_OK含 义正 在 删 除 所 有 的 内 容 , 包 括 arBuckets 本 身已 删 除 , 包 括 arBuckets 本 身正 在 清 除 所 有 的 arBuckets 指 向 的 内 容 , 但 不 包 括 arBuckets 本 身正 常 状 态 , 各 种 数 据 完 全 一 致如 下 所 示typedef struct _zend_hash_key {char *arKey; /* hash 元 素 key 名 称 */uint nKeyLength; /* hash 元 素 key 长 度 */ulong h; /* key 计 算 出 的 hash 值 或 直 接 指 定 的 数 值 下 标 */} zend_hash_key;网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 40/87


模 板 和 引 擎 技 术 :PHP 源 代 码 分 析 :Zend HashTable 详 解《PHPer》现 在 来 看 zend_hash_key 结 构 就 比 较 容 易 理 解 了 。 它 通 过 arKey、nKeyLength、h 三 个 字段 唯 一 确 定 了 HashTable 中 的 一 个 Bucket。根 据 上 面 对 HashTable 相 关 数 据 结 构 的 解 释 , 我 们 可 以 画 出 HashTable 的 内 存 结 构 图 , 如图 1 所 示 。图 1内 存 结 构 图图 1 中 ,HashTable 中 已 经 插 入 了 三 个 Bucket 的 数 据 , 按 插 入 顺 序 分 别 是 Bucket1、Bucket2、Bucket3。Bucket1、Bucket2 中 的 数 据 保 存 在 其 它 的 内 存 块 中 ,Bucket3 的 数 据 是 一 个 指 针 ,因 此 它 直 接 保 存 在 pDataPtr 中 。 另 外 请 仔 细 体 会 Bucket 的 双 向 链 表 的 指 针 pNext、pLast 与pListNext、pListLast 指 向 的 不 同 :pNext、pLast 组 成 的 双 向 链 表 中 后 插 入 的 数 据 排 在 链 表 的前 面 , 而 pListNext、pListLast 组 成 的 双 向 链 表 是 按 Bucket 插 入 的 顺 序 来 排 列 的 。 图 中 未 标 明的 Bucket 的 其 它 指 针 均 为 NULL。2 Zend HashTable 的 实 现本 节 具 体 介 绍 一 下 PHP 中 HashTable 的 实 现 。 以 下 函 数 均 取 自 于 zend_hash.c。 如 果 充 分理 解 了 上 述 数 据 结 构 ,HashTable 实 现 的 代 码 并 不 难 理 解 。2.1 HashTable 初 始 化HashTable 提 供 了 一 个 zend_hash_init 宏 来 完 成 HashTable 的 初 始 化 操 作 。 实 际 上 它 是 通 过下 面 的 内 部 函 数 来 实 现 的 :网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 41/87


模 板 和 引 擎 技 术 :PHP 源 代 码 分 析 :Zend HashTable 详 解《PHPer》如 下 所 示ZEND_API int _zend_hash_init(HashTable *ht, uint nSize, hash_func_t pHashFunction,dtor_func_t pDestructor, zend_bool persistent ZEND_FILE_LINE_DC){uint i = 3;Bucket **tmp;SET_INCONSISTENT(HT_OK);if (nSize >= 0x80000000) {/* prevent overflow */ht->nTableSize = 0x80000000;} else {while ((1U nTableSize = 1 nTableMask = ht->nTableSize - 1;ht->pDestructor = pDestructor;ht->arBuckets = NULL;ht->pListHead = NULL;ht->pListTail = NULL;ht->nNumOfElements = 0;ht->nNextFreeElement = 0;ht->pInternalPointer = NULL;ht->persistent = persistent;ht->nApplyCount = 0;ht->bApplyProtection = 1;/* 根 据 persistent 使 用 不 同 方 式 分 配 arBuckets 内 存 , 并 将 其 所 有 指 针 初 始 化 为 NULL*//* Uses ecalloc() so that Bucket* == NULL */if (persistent) {tmp = (Bucket **) calloc(ht->nTableSize, sizeof(Bucket *));if (!tmp) {return FAILURE;}ht->arBuckets = tmp;} else {tmp = (Bucket **) ecalloc_rel(ht->nTableSize, sizeof(Bucket *));if (tmp) {ht->arBuckets = tmp;}}}return SUCCESS;在 以 前 的 版 本 中 , 可 以 使 用 pHashFunction 来 指 定 hash 函 数 。 但 现 PHP 已 强 制 使 用DJBX33A 算 法 , 因 此 实 际 上 pHashFunction 这 个 参 数 并 不 会 用 到 , 保 留 在 这 里 只 是 为 了 与 以前 的 代 码 兼 容 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 42/87


模 板 和 引 擎 技 术 :PHP 源 代 码 分 析 :Zend HashTable 详 解2.2 增 加 、 插 入 和 修 改 元 素《PHPer》向 HashTable 中 添 加 一 个 新 的 元 素 最 关 键 的 就 是 要 确 定 将 这 个 元 素 插 入 到 arBuckets 数 组中 的 哪 个 位 置 。 根 据 上 面 对 Bucket 结 构 键 名 的 解 释 , 我 们 可 以 知 道 有 两 种 方 式 向 HashTable添 加 一 个 新 的 元 素 。 第 一 种 方 法 是 使 用 字 符 串 作 为 键 名 来 插 入 Bucket; 第 二 种 方 法 是 使 用 索引 作 为 键 名 来 插 入 Bucket。 第 二 种 方 法 具 体 又 可 以 分 为 两 种 情 况 : 指 定 索 引 或 不 指 定 索 引 ,指 定 索 引 指 的 是 强 制 将 Bucket 插 入 到 指 定 的 索 引 位 置 中 ; 不 指 定 索 引 则 将 Bucket 插 入 到nNextFreeElement 对 应 的 索 引 位 置 中 。 这 几 种 插 入 数 据 的 方 法 实 现 比 较 类 似 , 不 同 的 只 是 定位 Bucket 的 方 法 。修 改 HashTable 中 的 数 据 的 方 法 与 增 加 数 据 的 方 法 也 很 类 似 。我 们 先 看 第 一 种 使 用 字 符 串 作 为 键 名 增 加 或 修 改 Bucket 的 方 法 :如 下 所 示ZEND_API int _zend_hash_add_or_update(HashTable *ht, char *arKey, uint nKeyLength, void *pData,uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC){ulong h;uint nIndex;Bucket *p;IS_CONSISTENT(ht);// 调 试 信 息 输 出if (nKeyLength nTableMask;p = ht->arBuckets[nIndex]; /* 取 得 相 应 索 引 对 应 的 Bucket 的 指 针 *//* 检 查 对 应 的 桶 列 中 是 否 包 含 有 数 据 元 素 (key, hash) */while (p != NULL) {if ((p->h == h) && (p->nKeyLength == nKeyLength)) {if (!memcmp(p->arKey, arKey, nKeyLength)) {if (flag & HASH_ADD) {return FAILURE; // 对 应 的 数 据 元 素 已 存 在 , 不 能 进 行 插 入 操 作}HANDLE_BLOCK_INTERRUPTIONS();#if ZEND_DEBUGif (p->pData == pData) {ZEND_PUTS("Fatal error in zend_hash_update: p->pData == pData\n");网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 43/87


模 板 和 引 擎 技 术 :PHP 源 代 码 分 析 :Zend HashTable 详 解《PHPer》HANDLE_UNBLOCK_INTERRUPTIONS();return FAILURE;}#endifif (ht->pDestructor) {/* 如 果 数 据 元 素 存 在 , 对 原 来 的 数 据 进 行 析 构 操 作 */ht->pDestructor(p->pData);}/* 用 新 的 数 据 来 更 新 原 来 的 数 据 */UPDATE_DATA(ht, p, pData, nDataSize);if (pDest) {*pDest = p->pData;}HANDLE_UNBLOCK_INTERRUPTIONS();return SUCCESS;}}p = p->pNext;}}/* HashTable 中 没 有 key 对 应 的 数 据 , 新 增 一 个 Bucket*/p = (Bucket *) pemalloc(sizeof(Bucket) - 1 + nKeyLength, ht->persistent);if (!p) {return FAILURE;}memcpy(p->arKey, arKey, nKeyLength);p->nKeyLength = nKeyLength;INIT_DATA(ht, p, pData, nDataSize);p->h = h;// 将 Bucket 加 入 到 相 应 的 桶 列 中CONNECT_TO_BUCKET_DLLIST(p, ht->arBuckets[nIndex]);if (pDest) {*pDest = p->pData;}HANDLE_BLOCK_INTERRUPTIONS();// 将 Bucket 加 入 到 HashTable 的 双 向 链 表 中CONNECT_TO_GLOBAL_DLLIST(p, ht);ht->arBuckets[nIndex] = p;HANDLE_UNBLOCK_INTERRUPTIONS();ht->nNumOfElements++;// 如 果 HashTable 已 满 , 重 新 调 整 HashTable 的 大 小 。ZEND_HASH_IF_FULL_DO_RESIZE(ht); /* If the Hash table is full, resize it */return SUCCESS;因 为 这 个 函 数 是 使 用 字 符 串 作 为 键 名 来 插 入 数 据 的 , 因 此 它 首 先 检 查 nKeyLength 的 值 是否 大 于 0, 如 果 不 是 的 话 就 直 接 退 出 。 然 后 计 算 arKey 对 应 的 hash 值 h, 将 其 与 nTableMask按 位 与 后 得 到 一 个 无 符 号 整 数 nIndex。 这 个 nIndex 就 是 将 要 插 入 的 Bucket 在 arBuckets 数 组中 的 索 引 位 置 。现 在 已 经 有 了 arBuckets 数 组 的 一 个 索 引 , 我 们 知 道 它 包 括 的 数 据 是 一 个 指 向 Bucket 的 双网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 44/87


模 板 和 引 擎 技 术 :PHP 源 代 码 分 析 :Zend HashTable 详 解《PHPer》向 链 表 的 指 针 。 如 果 这 个 双 向 链 表 不 为 空 的 话 我 们 首 先 检 查 这 个 双 向 链 表 中 是 否 已 经 包 含 了用 字 符 串 arKey 指 定 的 键 名 的 Bucket, 这 样 的 Bucket 如 果 存 在 , 并 且 我 们 要 做 的 操 作 是 插 入新 Bucket( 通 过 flag 标 识 ), 这 时 就 应 该 报 错 —— 因 为 在 HashTable 中 键 名 不 可 以 重 复 。 如 果存 在 , 并 且 是 修 改 操 作 , 则 使 用 在 HashTable 中 指 定 了 析 构 函 数 pDestructor 对 原 来 的 pData指 向 的 数 据 进 行 析 构 操 作 ; 然 后 将 用 新 的 数 据 替 换 原 来 的 数 据 即 可 成 功 返 回 修 改 操 作 。如 果 在 HashTable 中 没 有 找 到 键 名 指 定 的 数 据 , 就 将 该 数 据 封 装 到 Bucket 中 , 然 后 插 入HashTable。 这 里 要 注 意 的 是 如 下 的 两 个 宏 :CONNECT_TO_BUCKET_DLLIST(p, ht->arBuckets[nIndex])CONNECT_TO_GLOBAL_DLLIST(p, ht)前 者 是 将 该 Bucket 插 入 到 指 定 索 引 的 Bucket 双 向 链 表 中 , 后 者 是 插 入 到 整 个 HashTable的 Bucket 双 向 链 表 中 。 两 者 的 插 入 方 式 也 不 同 , 前 者 是 将 该 Bucket 插 入 到 双 向 链 表 的 最 前面 , 后 者 是 插 入 到 双 向 链 表 的 最 末 端 。下 面 是 第 二 种 插 入 或 修 改 Bucket 的 方 法 , 即 使 用 索 引 的 方 法 :如 下 所 示ZEND_API int _zend_hash_index_update_or_next_insert(HashTable *ht, ulong h, void *pData,uint nDataSize, void **pDest, int flag ZEND_FILE_LINE_DC){uint nIndex;Bucket *p;IS_CONSISTENT(ht);if (flag & HASH_NEXT_INSERT) {h = ht->nNextFreeElement;}nIndex = h & ht->nTableMask;p = ht->arBuckets[nIndex];// 检 查 是 否 含 有 相 应 的 数 据while (p != NULL) {if ((p->nKeyLength == 0) && (p->h == h)) {if (flag & HASH_NEXT_INSERT || flag & HASH_ADD) {return FAILURE;}////...... 修 改 Bucket 数 据 , 略//if ((long)h >= (long)ht->nNextFreeElement) {ht->nNextFreeElement = h + 1;}if (pDest) {*pDest = p->pData;}return SUCCESS;}p = p->pNext;}网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 45/87


模 板 和 引 擎 技 术 :PHP 源 代 码 分 析 :Zend HashTable 详 解《PHPer》}p = (Bucket *) pemalloc_rel(sizeof(Bucket) - 1, ht->persistent);if (!p) {return FAILURE;}p->nKeyLength = 0; /* Numeric indices are marked by making the nKeyLength == 0 */p->h = h;INIT_DATA(ht, p, pData, nDataSize);if (pDest) {*pDest = p->pData;}CONNECT_TO_BUCKET_DLLIST(p, ht->arBuckets[nIndex]);HANDLE_BLOCK_INTERRUPTIONS();ht->arBuckets[nIndex] = p;CONNECT_TO_GLOBAL_DLLIST(p, ht);HANDLE_UNBLOCK_INTERRUPTIONS();if ((long)h >= (long)ht->nNextFreeElement) {ht->nNextFreeElement = h + 1;}ht->nNumOfElements++;ZEND_HASH_IF_FULL_DO_RESIZE(ht);return SUCCESS;flag 标 志 指 明 当 前 操 作 是 HASH_NEXT_INSERT( 不 指 定 索 引 插 入 或 修 改 ),HASH_ADD( 指 定 索 引 插 入 ) 还 是 HASH_UPDATE( 指 定 索 引 修 改 )。 由 于 这 些 操 作 的 实 现 代 码 基 本 相同 , 因 此 统 一 合 并 成 了 一 个 函 数 , 再 用 flag 加 以 区 分 。本 函 数 基 本 与 前 一 个 相 同 , 不 同 的 是 如 果 确 定 插 入 到 arBuckets 数 组 中 的 索 引 的 方 法 。 如果 操 作 是 HASH_NEXT_INSERT, 则 直 接 使 用 nNextFreeElement 作 为 插 入 的 索 引 。 注 意nNextFreeElement 的 值 是 如 何 使 用 和 更 新 的 。2.3 访 问 元 素同 样 ,HashTable 用 两 种 方 式 来 访 问 元 素 , 一 种 是 使 用 字 符 串 arKey 的 zend_hash_find();另 一 种 是 使 用 索 引 的 访 问 方 式 zend_hash_index_find()。 由 于 其 实 现 的 代 码 很 简 单 , 分 析 工 作就 留 给 读 者 自 已 完 成 。2.4 删 除 元 素HashTable 删 除 数 据 均 使 用 zend_hash_del_key_or_index() 函 数 来 完 成 , 其 代 码 也 较 为 简 单 ,这 里 也 不 再 详 细 分 析 。 需 要 的 是 注 意 如 何 根 据 arKey 或 h 来 计 算 出 相 应 的 下 标 , 以 及 两 个 双向 链 表 的 指 针 的 处 理 。2.5 遍 历 元 素如 下 所 示/* This is used to recurse elements and selectively delete certain entries* from a hashtable. apply_func() receives the data and decides if the entry网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 46/87


模 板 和 引 擎 技 术 :PHP 源 代 码 分 析 :Zend HashTable 详 解《PHPer》* should be deleted or recursion should be stopped. The following three* return codes are possible:* ZEND_HASH_APPLY_KEEP - continue* ZEND_HASH_APPLY_STOP - stop iteration* ZEND_HASH_APPLY_REMOVE - delete the element, combineable with the former*/ZEND_API void zend_hash_apply(HashTable *ht, apply_func_t apply_func TSRMLS_DC){Bucket *p;}IS_CONSISTENT(ht);HASH_PROTECT_RECURSION(ht);p = ht->pListHead;while (p != NULL) {int result = apply_func(p->pData TSRMLS_CC);if (result & ZEND_HASH_APPLY_REMOVE) {p = zend_hash_apply_deleter(ht, p);} else {p = p->pListNext;}if (result & ZEND_HASH_APPLY_STOP) {break;}}HASH_UNPROTECT_RECURSION(ht);因 为 HashTable 中 所 有 Bucket 都 可 以 通 过 pListHead 指 向 的 双 向 链 表 来 访 问 , 因 此 遍 历HashTable 的 实 现 也 比 较 简 单 。 这 里 值 得 一 提 的 是 对 当 前 遍 历 到 的 Bucket 的 处 理 使 用 了 一 个apply_func_t 类 型 的 回 调 函 数 。 根 据 实 际 需 要 , 该 回 调 函 数 返 回 下 面 值 之 一 :ZEND_HASH_APPLY_KEEPZEND_HASH_APPLY_STOPZEND_HASH_APPLY_REMOVE它 们 分 别 表 示 继 续 遍 历 , 停 止 遍 历 或 删 除 相 应 元 素 后 继 续 遍 历 。还 有 一 个 要 注 意 的 问 题 就 是 遍 历 时 的 防 止 递 归 的 问 题 , 也 就 是 防 止 对 同 一 个 HashTable同 时 进 行 多 次 遍 历 。 这 是 用 下 面 两 个 宏 来 实 现 的 :HASH_PROTECT_RECURSION(ht)HASH_UNPROTECT_RECURSION(ht)其 主 要 原 理 是 如 果 遍 历 保 护 标 志 bApplyProtection 为 真 , 则 每 次 进 入 遍 历 函 数 时 将nApplyCount 值 加 1, 退 出 遍 历 函 数 时 将 nApplyCount 值 减 1。 开 始 遍 历 之 前 如 果 发 现nApplyCount>3 就 直 接 报 告 错 误 信 息 并 退 出 遍 历 。上 面 的 apply_func_t 不 带 参 数 。HashTable 还 提 供 带 一 个 参 数 或 可 变 参 数 的 回 调 方 式 , 对应 的 遍 历 函 数 分 别 为 :如 下 所 示typedef int (*apply_func_arg_t)(void *pDest,void *argument TSRMLS_DC);void zend_hash_apply_with_argument(HashTable *ht,apply_func_arg_t apply_func,网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 47/87


模 板 和 引 擎 技 术 :PHP 源 代 码 分 析 :Zend HashTable 详 解《PHPer》void *data TSRMLS_DC);typedef int (*apply_func_args_t)(void *pDest,int num_args, va_list args, zend_hash_key *hash_key);void zend_hash_apply_with_arguments(HashTable *ht, apply_func_args_t apply_func, int numargs, ...);除 了 上 面 提 供 的 几 种 提 供 外 , 还 有 许 多 其 它 操 作 HashTable 的 API。 如 排 序 、HashTable的 拷 贝 与 合 并 等 等 。 只 要 充 分 理 解 了 上 述 HashTable 的 数 据 结 构 , 理 解 这 些 代 码 并 不 困 难 。由 于 HashTable 在 Zend Engine 的 广 泛 应 用 , 其 操 作 效 率 的 每 一 点 提 高 都 会 提 高 PHP 本 身的 效 率 。 为 此 ,HashTable 提 供 了 一 组 *quick* 系 列 函 数 , 用 于 快 速 增 加 、 删 除 、 修 改 和 查 找数 据 元 素 , 代 码 基 本 上 也 与 上 面 介 绍 的 相 同 , 不 同 的 是 在 该 系 列 函 数 的 参 数 中 直 接 提 供 了arKey 计 算 出 的 hash 值 , 这 样 避 免 了 每 次 操 作 HashTable 时 重 新 计 算 arKey 的 hash 值 , 从 而提 高 了 效 率 。作 者 介 绍AltairE-mail:eniac2008@hotmail.com个 人 网 站 :http://www.phpinternals.com网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 48/87


模 板 和 引 擎 技 术 : 实 现 PHP 的 编 译 执 行 分 离 (separating compilation and execution)《PHPer》实 现 PHP 的 编 译 执 行 分 离 (separating compilation and execution)作 者 : 惠 新 宸刚 刚 在 PHP 群 内 和 大 家 聊 天 , 应 承 了 大 家 要 写 一 个 关 于 如 何 实 现 PHP 源 码 加 密 的 文 章 ,借 着 这 会 QA 在 冒 烟 的 机 会 , 就 这 个 问 题 , 我 写 点 思 路 。我 以 前 的 文 章 介 绍 过 ,ZE(Zend engine) 执 行 一 个 PHP 脚 本 会 经 历 编 译 -> 执 行 , 只 不过 它 每 次 执 行 都 会 去 重 新 编 译 PHP 文 件 。 并 没 有 实 现 编 译 和 执 行 分 离 。在 ZE 的 编 译 和 执 行 阶 段 , 有 俩 个 重 要 的 函 数 :如 下 所 示ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC);和如 下 所 示ZEND_API void (*zend_execute)(zend_op_array *op_array TSRMLS_DC);zend_compile_file 负 责 将 要 执 行 的 脚 本 文 件 编 译 成 由 ZE 的 基 本 指 令 序 列 构 成 的 op codes,然 后 将 op codes 交 由 zend_execute 执 行 , 从 而 得 到 我 们 脚 本 的 结 果 。所 以 , 我 们 完 全 可 以 通 过 修 改 默 认 的 zend_complie_file 和 zend_execute 来 实 现 ,PHP 的执 行 和 编 译 分 离 , 进 一 步 , 我 们 还 可 以 再 这 个 基 础 上 实 现 , 对 我 们 脚 本 的 加 密 和 解 密 。我 们 通 过 一 个 PHP 扩 展 模 块 来 实 现 这 个 功 能 , 首 先 , 我 们 需 要 在 模 块 初 始 化 的 时 候 :如 下 所 示PHP_MINIT_FUNCTION(sample){old_compile_file = zend_compile_file; // 保 存 现 场old_execute = zend_execute;}zend_compile_file = my_compile_file; // 截 获zend_execute = my_execute;return SUCCESS;在 我 们 的 my_compile_file 中 , 判 断 我 们 的 文 件 是 否 是 编 译 过 的 文 件 , 假 设 后 缀 名 是 *.ze。如 下 所 示static zend_op_array *my_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC){if(strstr(file_handle->filename, ".ze") != NULL){// 是 编 译 过 的 文 件 。直 接 返 回 文 件 内 容 .}zend_op_array *op_array;网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 49/87


模 板 和 引 擎 技 术 : 实 现 PHP 的 编 译 执 行 分 离 (separating compilation and execution)《PHPer》op_array = old_compile_file (file_handle, type TSRMLS_CC); // 调 用 默 认 的 compile, 截 获 输 出if(op_array){保 存 op_array;}return op_array;}这 样 , 我 们 就 实 现 了 , 对 已 经 编 译 文 件 的 支 持 , 和 对 文 件 编 译 的 支 持 。然 后 , 需 要 编 写 我 们 的 执 行 函 数 :如 下 所 示static void my_execute(zend_op_array *op_array TSRMLS_DC){old_execute(op_array TSRMLS_DC); // 简 单 交 由 默 认 执 行 函 数 执 行 。}也 许 你 要 问 为 什 么 要 包 装 以 后 的 执 行 函 数 , 呵 呵 , 我 只 是 为 了 说 明 , 一 种 方 式 , 就 是 可以 截 获 这 个 东 东 而 已 。 有 什 么 用 ? 就 看 读 者 你 有 什 么 要 求 能 通 过 这 个 方 式 实 现 了 : )。写 到 这 里 , 你 也 许 就 明 白 了 , 如 果 想 要 对 文 件 加 密 , 那 么 就 定 义 个 加 密 文 件 类 型 , 比 如*.zec, 然 后 在 my_compile_file 中 , 判 断 文 件 类 型 , 如 果 是 加 密 文 件 , 那 么 就 执 行 解 密 , 嘿 嘿 ,简 单 吧 ?至 于 怎 么 加 密 , 那 就 要 问 你 自 己 了 , 你 想 用 什 么 方 式 , 但 是 , 记 住 , 要 可 逆 的 哦 ~~^_^。作 者 介 绍 :惠 新 宸 男 , 年 二 十 有 五 , 好 追 根 究 底 , 有 不 良 嗜 好 , 幸 性 本 善 。乙 酉 年 识 互 联 网 , 丁 亥 年 入 雅 虎 , 翌 年 入 百 度 。虽 性 好 安 稳 , 然 经 变 无 数 , 唯 常 叹 “ 人 生 , 菠 菜 汤 尔 ”。个 人 网 站 :http://www.laruence.com/网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 50/87


扩 展 与 框 架 : 使 用 Ext 构 建 复 杂 页 面 布 局扩 展 与 框 架《PHPer》使 用 Ext 构 建 复 杂 页 面 布 局作 者 : 辉 老 大我 在 前 一 阵 子 刚 刚 完 成 一 个 基 于 Ext 的 项 目 , 对 于 Ext 在 UI 表 现 方 面 的 强 大 深 感 佩 服 ,今 天 给 大 家 介 绍 两 个 Ext 布 局 (layout) 的 例 子 , 一 个 是 Ext 调 用 jQuery 适 配 器 的 使 用 , 一 个是 嵌 套 布 局 。 效 果 如 图 1~3。图 1 效 果 图 1图 2 效 果 图 2图 3 效 果 图 3本 文 假 设 读 者 已 了 解 Ext 的 基 本 用 法 , 若 不 了 解 , 请 自 行 查 阅 相 关 资 料 。 首 先 讲 解 第 一个 实 例 , 第 一 个 实 例 主 要 是 介 绍 如 何 在 Ext 的 页 面 中 调 用 jQuery, 说 到 这 个 我 觉 得 这 个 功 能网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 51/87


扩 展 与 框 架 : 使 用 Ext 构 建 复 杂 页 面 布 局《PHPer》太 人 性 化 了 , 并 不 是 每 个 人 都 能 熟 练 使 用 Ext, 而 且 jQuery 在 操 作 DOM 树 的 时 候 比 写 Ext代 码 更 加 灵 活 , 要 在 Ext 中 使 用 jQuery, 必 须 先 加 载 jQuery 适 配 器 , 通 常 我 们 是 加 载 默 认 适配 器 , 先 将 包 含 文 件 改 成 如 下 :代 码 片 段Ext.BLANK_IMAGE_URL = './images/s.gif';其 中 :代 码 片 段表 示 我 们 将 使 用 jQuery 适 配 器 , 之 后 你 就 可 以 在 Ext 的 代 码 里 直 接 写 jQuery 函 数 了 。 以下 是 完 整 的 JS 代 码 :代 码 如 下// 操 作 1 表 单function getundenyform(){Ext.QuickTips.init();Ext.form.Field.prototype.msgTarget = 'side';return new Ext.FormPanel({labelWidth: 55,width:500,labelAlign:'right',border:false,bodyStyle:'padding:5px;',buttonAlign:'right',labelAlign:'right',items: [{xtype:'fieldset',title:' 原 因 ',autoHeight:true,items:[{xtype:'radio',boxLabel:' 原 因 1',name:'reason',hideLabel:true,inputValue:'1'},{xtype:'radio',boxLabel:' 原 因 2',网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 52/87


扩 展 与 框 架 : 使 用 Ext 构 建 复 杂 页 面 布 局《PHPer》}]}],name:'reason',hideLabel:true,inputValue:'2'},{xtype:'radio',id:'athr',name:'reason',boxLabel:' 其 他 ',hideLabel:true,inputValue:'3'},anotherReson = new Ext.form.TextArea({name: 'reasoncontent',height:60,anchor: '100%',hideLabel:true})buttons:[{text:' 确 定 ',handler:function (){}}]});// 生 成 操 作 1 表 单function makeundenyform() {centerpanel.setTitle(' 操 作 1');$('#dd').html('');undenyform = getundenyform();undenyform.render('dd');}// 操 作 2 表 单function getdenyform(){Ext.QuickTips.init();Ext.form.Field.prototype.msgTarget = 'side';return new Ext.FormPanel({labelWidth: 55,width:500,labelAlign:'right',border:false,bodyStyle:'padding:5px;',buttonAlign:'right',labelAlign:'right',items: [{xtype:'fieldset',title:' 操 作 ',autoHeight:true,items:[网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 53/87


扩 展 与 框 架 : 使 用 Ext 构 建 复 杂 页 面 布 局《PHPer》{xtype: 'datefield',format: 'Y-m-d',fieldLabel: ' 日 期 ',name: 'undenydate',id:'undenydate',//anchor:'100%'width:200}]},{xtype:'fieldset',title:' 原 因 ',autoHeight:true,items:[{xtype:'radio',id:'sxdh',boxLabel:' 原 因 1',name:'reason',hideLabel:true,inputValue:'1'},{xtype:'radio',id:'sxmz',boxLabel:' 原 因 2',name:'reason',hideLabel:true,inputValue:'2'},{xtype:'radio',id:'ffxx',boxLabel:' 原 因 3',name:'reason',hideLabel:true,inputValue:'3'},{xtype:'radio',id:'wjbt',boxLabel:' 原 因 4',name:'reason',hideLabel:true,inputValue:'4'},{xtype:'radio',id:'xjxx',boxLabel:' 原 因 5',name:'reason',hideLabel:true,inputValue:'5'},{xtype:'radio',网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 54/87


扩 展 与 框 架 : 使 用 Ext 构 建 复 杂 页 面 布 局《PHPer》}id:'hzffh',boxLabel:' 原 因 6',name:'reason',hideLabel:true,inputValue:'6'},{xtype:'radio',id:'athr',name:'reason',boxLabel:' 其 他 ',hideLabel:true,inputValue:'7'},anotherReson2 = new Ext.form.TextArea({name: 'reasoncontent',height:60,anchor: '100%',hideLabel:true})]}],buttons:[{text:' 确 定 ',handler:function (){}}]});// 生 成 操 作 2 表 单function makedenyform() {centerpanel.setTitle(' 操 作 2');$('#dd').html('');denyform = getdenyform();denyform.render('dd');}// 基 本 表 单function getForm(){return new Ext.FormPanel({labelAlign: 'left',labelWidth:70,bodyStyle:'padding:5px',items: [{fieldLabel:' 第 一 行 ',xtype:'textfield',name:'line1',anchor: '100%'},{fieldLabel:' 第 二 行 ',xtype:'textfield',网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 55/87


扩 展 与 框 架 : 使 用 Ext 构 建 复 杂 页 面 布 局《PHPer》}]});name:'line2',anchor: '100%'},{fieldLabel:' 第 三 行 ',xtype:'textfield',name:'line3',anchor: '100%'},{fieldLabel:' 第 四 行 ',xtype:'textfield',name:'line4',anchor: '100%'}// 基 本 面 板function getAccPanel() {return new Ext.Panel({frame:true,title: ' 基 本 条 件 设 定 ',collapsible:true,height:160,layout:'fit',items:[formPanel = getForm()],titleCollapse: true});}// 其 他 操 作 面 板function getAthPanel(){return new Ext.Panel({frame:true,title: ' 操 作 面 板 ',collapsible:true,contentEl:'task-views',titleCollapse: true});}Ext.onReady(function(){var actionPanel = new Ext.Panel({id:'action-panel',region:'west',split:true,collapsible: true,collapseMode: 'mini',width: 315,minSize: 315,maxSize: 500,baseCls:'x-plain',items: [accPanel=getAccPanel(), anotherPanel=getAthPanel()]网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 56/87


扩 展 与 框 架 : 使 用 Ext 构 建 复 杂 页 面 布 局《PHPer》});centerpanel = new Ext.Panel({region:'center',title:" 操 作 条 件 设 定 ",collapsible:true,titleCollapse: true,autoScroll:true,html:''});var viewport = new Ext.Viewport({layout:'border',items: [actionPanel, centerpanel]});});第 二 个 例 子 主 要 介 绍 如 何 实 现 像 右 边 那 样 一 列 3 个 grid 的 布 局 , 我 们 知 道 Ext 的 布 局 是分 为 north、center、east、west、south 五 个 区 域 , 那 么 如 何 实 现 嵌 套 的 布 局 呢 , 关 键 就 在 于 我们 可 以 将 前 面 提 到 的 5 个 区 域 看 成 是 一 个 单 独 的 区 域 , 再 分 成 north、center、east、west、south五 个 区 域 。 本 例 中 的 center 区 域 被 再 次 分 为 north、center、south 进 行 布 局 。 如 下 :代 码 片 段//grid1function personGrid(){return new Ext.grid.GridPanel({border:false,height:300,viewConfig: {forceFit:true},collapsible:true,split:true,region:'north',loadMask: true,store: deluserds,cm:new Ext.grid.ColumnModel([//new Ext.grid.CheckboxSelectionModel(),new Ext.grid.RowNumberer(),{header:" 列 1",sortable:false,dataIndex:'id'},{header:" 列 2",sortable:false,dataIndex:'name'},{header:" 列 3",sortable:false,dataIndex:'pws'}]),sm:new Ext.grid.CheckboxSelectionModel({singleSelect:true}),autoScroll: true});}//grid2function groupGrid(){return new Ext.grid.GridPanel({title:'grid2',网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 57/87


扩 展 与 框 架 : 使 用 Ext 构 建 复 杂 页 面 布 局《PHPer》}border:false,height:120,viewConfig: {forceFit:true},collapsible:true,style: 'border-top:1px #99bbe8 solid',split:true,region:'center',loadMask: true,store: deluserds,cm:new Ext.grid.ColumnModel([//new Ext.grid.CheckboxSelectionModel(),new Ext.grid.RowNumberer(),{header:" 列 1",sortable:false,dataIndex:'id'},{header:" 列 2",sortable:false,dataIndex:'name'},{header:" 列 3",sortable:false,dataIndex:'pws'}]),sm:new Ext.grid.CheckboxSelectionModel({singleSelect:true}),autoScroll: true});//grid3function historyGrid(){return new Ext.grid.GridPanel({title:'grid3',border:false,height:120,viewConfig: {forceFit:true},collapsible:true,style: 'border-top:1px #99bbe8 solid',split:true,region:'south',loadMask: true,store: deluserds,//cm: gridHeader = gridHeader (),cm:new Ext.grid.ColumnModel([//new Ext.grid.CheckboxSelectionModel(),new Ext.grid.RowNumberer(),{header:" 列 1",sortable:false,dataIndex:'id'},{header:" 列 2",sortable:false,dataIndex:'name'},{header:" 列 3",sortable:false,dataIndex:'pws'}]),sm:new Ext.grid.CheckboxSelectionModel({singleSelect:true}),autoScroll: true});}// 应 用 布 局viewport = new Ext.Viewport({网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 58/87


扩 展 与 框 架 : 使 用 Ext 构 建 复 杂 页 面 布 局《PHPer》layout:'border',items: [actionPanel,{region:'center',border: false,style: 'border-left:1px #99bbe8 solid',split:true,//width: 800,minSize: 180,collapsible: true,cmargins:'1 1 1 1',title:'grid1',layout:'border',]});// 就 是 这 里 实 现 嵌 套 布 局items:[pergrid = personGrid(),grouprid = groupGrid(),hisgrid = historyGrid()]}完 整 JS 代 码 如 下 :代 码 如 下var formPanel;var gameSelect;var serverSelect;var serverListSelect;var gameds;var serverds;var serverlistds;var itemid;var win;var str;var pergrid;var groupgrid;var hisgrid;/*** 创 建 条 件 设 置 表 单*/function formPannel () {Ext.QuickTips.init();Ext.form.Field.prototype.msgTarget = 'side';return new Ext.FormPanel({frame:true,title: ' 条 件 设 置 ',bodyStyle:'padding:5px 5px 0',labelWidth: 40,buttonAlign:'center',labelAlign:'right',网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 59/87


扩 展 与 框 架 : 使 用 Ext 构 建 复 杂 页 面 布 局《PHPer》}width:420,items: [{xtype: 'datefield',format: 'Y-m-d',fieldLabel: ' 文 本 1',name: 'start_date',anchor: '100%'},{xtype: 'datefield',format: 'Y-m-d',fieldLabel: ' 文 本 2',name: 'end_date',anchor: '100%'},{fieldLabel:' 文 本 3',xtype: 'datefield',format: 'Y-m-d',name: 'person_start_date',anchor: '100%'},{fieldLabel:' 文 本 4',xtype: 'textfield',name: 'person_start_date',anchor: '100%'}],buttons: [{text:' 按 钮 1'},{text: ' 按 钮 2',handler: function(){}},{text: ' 按 钮 3',handler: function(){}},{text: ' 按 钮 4',handler: function(){}}]});//grid1function personGrid(){return new Ext.grid.GridPanel({border:false,height:300,viewConfig: {网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 60/87


扩 展 与 框 架 : 使 用 Ext 构 建 复 杂 页 面 布 局《PHPer》}forceFit:true},collapsible:true,split:true,region:'north',loadMask: true,store: deluserds,cm:new Ext.grid.ColumnModel([//new Ext.grid.CheckboxSelectionModel(),new Ext.grid.RowNumberer(),{header:" 列 1",sortable:false,dataIndex:'id'},{header:" 列 2",sortable:false,dataIndex:'name'},{header:" 列 3",sortable:false,dataIndex:'pws'}]),sm:new Ext.grid.CheckboxSelectionModel({singleSelect:true}),autoScroll: true});//grid2function groupGrid(){return new Ext.grid.GridPanel({title:'grid2',border:false,height:120,viewConfig: {forceFit:true},collapsible:true,style: 'border-top:1px #99bbe8 solid',split:true,region:'center',loadMask: true,store: deluserds,cm:new Ext.grid.ColumnModel([//new Ext.grid.CheckboxSelectionModel(),new Ext.grid.RowNumberer(),{header:" 列 1",sortable:false,dataIndex:'id'},{header:" 列 2",sortable:false,dataIndex:'name'},{header:" 列 3",sortable:false,dataIndex:'pws'}]),sm:new Ext.grid.CheckboxSelectionModel({singleSelect:true}),autoScroll: true});}//grid3function historyGrid(){return new Ext.grid.GridPanel({title:'grid3',border:false,height:120,viewConfig: {网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 61/87


扩 展 与 框 架 : 使 用 Ext 构 建 复 杂 页 面 布 局《PHPer》}forceFit:true},collapsible:true,style: 'border-top:1px #99bbe8 solid',split:true,region:'south',loadMask: true,store: deluserds,//cm: gridHeader = gridHeader (),cm:new Ext.grid.ColumnModel([//new Ext.grid.CheckboxSelectionModel(),new Ext.grid.RowNumberer(),{header:" 列 1",sortable:false,dataIndex:'id'},{header:" 列 2",sortable:false,dataIndex:'name'},{header:" 列 3",sortable:false,dataIndex:'pws'}]),sm:new Ext.grid.CheckboxSelectionModel({singleSelect:true}),autoScroll: true});Ext.onReady(function(){/*** 服 务 器 数 据 源*/deluserds = new Ext.data.Store({proxy : new Ext.data.HttpProxy({url:'index.php?mo=manage&do=getdeluser&r='+Math.random()}),reader: new Ext.data.JsonReader({root: 'topics',totalProperty: 'totalCount',id: 'id'},['name','id','pws'])});var actionPanel = new Ext.Panel({id:'action-panel',style:'padding:5px',region:'west',split:true,//collapsible: true,collapseMode: 'mini',width: 430,minSize: 430,maxSize: 600,baseCls:'x-plain',items: [formPanel = formPannel()]});viewport = new Ext.Viewport({layout:'border',items: [actionPanel,{网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 62/87


扩 展 与 框 架 : 使 用 Ext 构 建 复 杂 页 面 布 局《PHPer》]});});region:'center',border: false,style: 'border-left:1px #99bbe8 solid',split:true,//width: 800,minSize: 180,collapsible: true,cmargins:'1 1 1 1',title:'grid1',layout:'border',items:[pergrid = personGrid(),grouprid = groupGrid(),hisgrid = historyGrid()]}怎 么 样 ? 是 不 是 不 错 ? 其 实 很 想 多 写 一 点 , 可 是 最 近 实 在 太 忙 了 , 写 的 比 较 仓 促 , 请 大家 见 谅 , 源 代 码 将 随 杂 志 一 起 提 供 下 载 。 不 说 了 , 不 说 了 , 加 班 撒 ~~~~~所 有 代 码 见 附 件 中 /dome/ 文 件 夹作 者 介 绍网 名 : 辉 老 大生 日 :1983.8.2邮 箱 :leehui1983@gmail.com网 站 :http://www.extshow.comBlog:http://www.extshow.com/blog爱 好 : 打 篮 球 , 音 乐 , 游 戏擅 长 :PHP 程 序 设 计城 市 : 福 建 福 州工 作 单 位 : 福 建 星 网 锐 捷 通 讯 股 份 有 限 公 司 任 PHP 开 发 工程 师 , 现 任 福 建 网 龙 PHP 开 发 工 程 师主 要 作 品 : 星 网 锐 捷 内 部 产 品 研 发 管 理 系 统 ERP, 网 龙 公司 网 游 管 理 系 统 ( 正 在 开 发 中 )网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 63/87


LAMP 大 讲 堂 : 存 储 过 程 / 触 发 器 / 事 物 处 理 的 基 本 语 法LAMP 大 讲 堂《PHPer》存 储 过 程 / 触 发 器 / 事 物 处 理 的 基 本 语 法作 者 : 侯 惠 阳存 储 过 程 (Stored Procedure) 是 一 组 为 了 完 成 特 定 功 能 的 SQL 语 句 集 , 经 编 译 后 存 储 在数 据 库 中 。 用 户 通 过 指 定 存 储 过 程 的 名 字 并 给 出 参 数 来 执 行 它 。 建 立 存 储 过 程 , 语 法 如 下 。如 下 所 示Create procedure 存 储 过 程 名 字 ( 传 入 参 数 , 传 出 参 数 , 传 入 传 出 参 数 )1 MySQL 存 储 过 程 的 基 本 知 识 和 循 环 语 句1 传 入 参 数 inSQL 脚 本Create procedure name (in cj int)beginif cj = 60 thenselect 'ok';elseselect 'no';end if;endCall name (60);输 出 如 图 1 所 示 。图 1传 入 参 数 in 例 子 输 出2 传 出 参 数 outSQL 脚 本Create procedure edu (out _id int)beginset _id=5;end输 出 如 图 2 所 示 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 64/87


LAMP 大 讲 堂 : 存 储 过 程 / 触 发 器 / 事 物 处 理 的 基 本 语 法《PHPer》图 2传 入 参 数 out 例 子 输 出3 传 出 参 数 inoutSQL 脚 本Create procedure edu (inout idb int)beginselect * from ac where id= idb;end输 出 如 图 3 所 示 。图 3传 入 参 数 inout 例 子 输 出4 复 合 语 句SQL 脚 本Create procedure cn (in idb int)beginselect * from sn where SnID=idb;select * from user where UserID=idb;end输 出 如 图 4 所 示 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 65/87


LAMP 大 讲 堂 : 存 储 过 程 / 触 发 器 / 事 物 处 理 的 基 本 语 法《PHPer》图 4复 合 语 句 例 子 输 出5 使 用 变 量SQL 脚 本Careate procedure (in a int, in b int)begindeclare s int default 0; -- 定 义 一 个 和 的 初 始 变 量 ;set s=a+b;select s;end输 出 如 图 5 所 示 。图 5使 用 变 量 例 子 输 出6 case 语 句SQL 脚 本Careate procedure cj2 (in cj int)begincase cjwhen 1 then select 'one';when 2 then select 'two';when 3 then select 'three';else select 'four';end case;end输 出 如 图 6 所 示 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 66/87


LAMP 大 讲 堂 : 存 储 过 程 / 触 发 器 / 事 物 处 理 的 基 本 语 法《PHPer》图 6case 语 句 例 子 输 出7 循 环 语 句SQL 脚 本Carete procedure cj3 ()begindeclare i int default 0;declare s int default 0;while i=5end repeat;select s;end在 初 始 循 环 中 不 检 测 任 何 条 件 就 开 始 进 入 循 环 。 输 出 如 图 8 所 示 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 67/87


LAMP 大 讲 堂 : 存 储 过 程 / 触 发 器 / 事 物 处 理 的 基 本 语 法《PHPer》图 8repeat 语 句 例 子 输 出9 loop 语 句SQL 脚 本Create procedure cj5()begindeclare i int default 0;declare s int default 0;loop_label :loopset s = s+i;set i= i+1;if i>=5 thenleave loop_label;end if;end loop;select s;end既 不 检 测 执 行 循 环 条 件 , 也 不 检 测 离 开 循 环 条 件 , 而 是 通 过 leave 语 句 实 现 离 开 , 输 出 如图 9 所 示 。图 9loop 语 句 例 子 输 出10 删 除 存 储 过 程SQL 脚 本Drop procedure cn;// 注 意 没 有 后 面 的 括 号 也 没 有 参 数如 图 10 所 示 。图 10传 入 参 数 in 例 子 输 出11 存 储 过 程 的 游 标游 标 是 用 一 组 数 据 并 能 够 一 次 与 一 个 单 独 的 记 录 进 行 交 互 的 方 法 。 语 法 如 下 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 68/87


LAMP 大 讲 堂 : 存 储 过 程 / 触 发 器 / 事 物 处 理 的 基 本 语 法《PHPer》如 下 所 示declare 游 标 名 cursor for select 语 句 ; // 游 标 名 不 能 重 复 ,select 语 句 不 能 有 intoopen 游 标 名 ;fetch 游 标 名 into 变 量 1, 变 量 2...;close 游 标 名 ;2 MySQL 触 发 器 的 基 本 知 识 和 循 环 语 句触 发 器 是 对 数 据 库 进 行 监 控 的 一 种 程 序 , 当 对 数 据 库 进 行 数 据 的 增 加 , 删 除 修 改 的 时 候触 发 相 应 的 触 发 器 程 序 进 行 操 作 。 语 法 如 下 所 示如 下 所 示Create trigger 触 发 器 的 名 字[before | after] 是 触 发 时 间[insert into | update |delete] 是 触 发 事 件On table_name 是 触 发 的 表 名For each row下 面 写 触 发 器 主 体 , 和 存 储 过 程 没 有 什 么 区 别 。与 存 储 过 程 不 同 的 是 , 触 发 器 内 包 含 两 个 默 认 行 new 和 old。new 对 于 插 入 操 作 来 说 表 示 要 插 入 的 话 ; 对 于 更 新 来 说 ,new 表 示 更 新 后 的 行 ,old 表 示更 新 前 的 行 ; 对 于 删 除 来 说 old 表 示 被 删 除 的 行 。例 , 建 立 最 基 本 的 触 发 器 , 如 图 11、12 所 示 。图 11建 立 触 发 器图 12生 成 的 SQL 脚 本SQL 脚 本case new.User_Mailwhen '547233050@qq.com' then set new.User_SN='12345678';end caseSQL 脚 本INSERT INTO `user`(`User_Name`,`User_Mail`,`User_IP`,`User_SN`,`User_Time`,`Url_from`) VALUES('houhuiyang','547233050@qq.com','127.0.0.1','EAV-1354965874316500','2008-09-03 15:49:01','localhost/');插 入 这 条 数 据 的 时 候 触 发 以 上 触 发 器 的 代 码 将 User_SN 的 'EAV-1354965874316500' 改 成1234678, 如 图 13 所 示 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 69/87


LAMP 大 讲 堂 : 存 储 过 程 / 触 发 器 / 事 物 处 理 的 基 本 语 法《PHPer》图 13传 入 参 数 in 例 子 输 出3 MySQL 事 物 处 理 的 基 本 知 识MySQL 的 事 务 处 理 主 要 有 两 种 方 法 。3.1 用 begin、rollback、commit 来 实 现beginrollbackcommit开 始 一 个 事 务事 务 回 滚事 务 确 认3.2 直 接 用 set 来 改 变 MySQL 的 自 动 提 交 模 式MySQL 默 认 是 自 动 提 交 的 , 也 就 是 你 提 交 一 个 QUERY, 它 就 直 接 执 行 ! 我 们 可 以 通 过下 面 设 置 控 制 。set autocommit=0 禁 止 自 动 提 交set autocommit=1 开 启 自 动 提 交 来 实 现 事 务 的 处 理 。但 注 意 当 你 用 set autocommit=0 的 时 候 , 你 以 后 所 有 的 SQL 都 将 做 为 事 务 处 理 , 直 到 你用 commit 确 认 或 rollback 结 束 , 注 意 当 你 结 束 这 个 事 务 的 同 时 也 开 启 了 个 新 的 事 务 !MySQL中 只 有 INNODB 和 BDB 类 型 的 数 据 表 才 能 支 持 事 务 处 理 ! 其 他 的 类 型 是 不 支 持 的 !联 系 作 者 :侯 惠 阳Mail:phper.yang@gmail.com网 名 :PHPer.yang网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 70/87


LAMP 大 讲 堂 : 字 符 串 专 题《PHPer》字 符 串 专 题作 者 : 李 俊 鹏由 于 感 觉 自 己 的 PHP 知 识 不 够 扎 实 , 所 以 一 直 想 总 结 弄 个 专 题 , 既 自 己 巩 固 了 基 础 , 也和 大 家 分 享 一 下 。 这 篇 是 字 符 串 专 题 。1 单 引 号 、 双 引 号 以 及 heredoc1) 单 引 号 只 会 对 两 个 特 例 进 行 解 析 : 转 义 序 列 “\'” 以 及 “\\”, 而 对 于 任 何 其 它 字 符 ,代 码 片 段单 引 号 都 会 原 样 输 出 。 见 示 例 :$hello = 'hello,world';$test1 = ' \' ';$test2 = ' \\ ';$test3 = ' \" ';$test4 = ' \{ ';echo "$hello".''.'$hello'.''.$test1.''.$test2.''.$test3.''.$test4;请 自 己 测 试 输 出 。所 以 , 个 人 感 觉 输 出 HTML 标 记 时 使 用 单 引 号 比 较 方 便 。2) 双 引 号 会 对 其 中 内 容 进 行 解 析 。3) heredoc 是 由 “


LAMP 大 讲 堂 : 字 符 串 专 题2) print 同 echo 一 样 不 是 一 个 函 数 , 但 是 有 返 回 值 , 并 且 总 是 返 回 1。《PHPer》3) printf 是 一 个 函 数 , 进 行 格 式 化 输 出 , 并 且 返 回 输 出 字 符 串 的 长 度 。如 :echo(printf("%.2f\n",12.11111)); // 输 出 12.11 64) print_r 以 一 定 方 式 进 行 输 出 , 并 将 指 针 移 到 变 量 末 尾 。 可 比 较 的 输 出 函 数 还 有var_dump() 与 var_export。3 字 符 串 的 处 理1) trim() 函 数 进 行 指 定 字 符 的 删 除 , 默 认 删 除 开 头 以 及 结 尾 的 " " "\t" "\n" "\r" "\0" "\x0B"( 不 含 双 引 号 ), 函 数 原 型 为 :string trim(string $str[,string $charlist]), 其 中 $charlist为 指 定 要 删 除 的 字 符 集 。相 比 较 函 数 有 ltrim() 删 除 开 头 的 指 定 或 者 默 认 字 符 以 及 rtrim() 删 除 结 尾 的 指 定或 者 默 认 字 符 。2) 大 小 写 化 、 分 解 、 合 并 、 查 找 等 。a) 大 小 写 化strtolower() 和 strtoupper() 将 整 个 字 符 串 小 写 或 者 大 写 化 ;ucfirst() 将 字 符 串 第 一 个 字 符 大 写 ;ucwords() 将 字 符 串 每 个 单 词 的 第 一 个 字 母 大 写 。b) 分 解 与 合 并explode() 对 字 符 串 以 指 定 分 割 符 进 行 分 割 , 原 型 为 array explode (string$delimiter,string $string[,int $limit]),$delimiter 为 分 割 符 , 如 :explode(" ","hi boy goodnight"); 表 示 以 空 格 为 分 割 符 , 并 以 数 组 的 形 式 返 回 ; 而 如 果 指 定 $limit 则 表 示 限 定返 回 的 数 组 元 素 个 数 , 并 将 字 符 串 所 有 剩 余 内 容 放 置 在 数 组 最 后 一 个 元 素 。相 反 的 函 数 有 string implode(string $glue,array $pieces), 以 $glue 为 连 接 符 , 连接 数 组 元 素 并 以 字 符 串 的 形 式 返 回 。还 有 str_split() 原 型 为 array str_split(string $string[,int $split_length]), 以 指 定 长 度分 割 字 符 串 ( 即 每 个 元 素 的 长 度 ), 默 认 为 1。c) 查 找 :strpos() 将 为 查 找 第 一 次 出 现 的 位 置 , 如 $pos = strpos($large,"hello"); 查 找 hello 第一 次 出 现 的 位 置 并 返 回 int 型 位 置 数 据 , 否 则 返 回 FALSE; 而 对 应 的 strrpos() 查 找 最后 一 次 出 现 的 位 置 并 返 回 ;stripos() 则 进 行 不 区 分 大 小 写 strpos() 的 查 找 ;strripos() 则 进 行 不 区 分 大 小 写 的 strrpos() 查 找 ;网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 72/87


LAMP 大 讲 堂 : 字 符 串 专 题《PHPer》strstr() 原 型 为 :string strstr(string $haystack,mixed $needle[,bool $before_needle])即 查 找 $haystack 字 符 串 中 $needle 出 现 的 位 置 并 返 回 部 分 数 据 , 如 果 $before_needle设 置 为 true 则 返 回 前 面 的 部 分 , 否 则 返 回 后 面 部 分 ;stristr() 为 不 区 分 大 小 写 的 strstr();strrchr() 查 找 字 符 串 中 特 定 字 符 出 现 的 最 后 位 置 并 返 回 剩 余 部 分 ;substr() 原 型 为 :string substr(string $string,int $start[,int $length]), 即 获 取 $string中 指 定 开 始 位 置 指 定 长 度 的 数 据 。由 于 篇 幅 限 制 , 就 没 有 在 此 总 结 编 码 转 义 以 及 正 则 表 达 式 内 容 。作 者 介 绍 :李 俊 鹏PHPChina ID:casual0402现 在 福 州 就 读 , 大 二 学 生 , 喜 欢 并 学 习 着 PHP 中 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 73/87


PHPChina 三 周 年 纪 念 栏PHPChina 三 周 年 纪 念 栏《PHPer》序三 年 了 ,PHPChina 迎 来 了 三 周 年 的 生 日 。 非 常 感 谢 大 家 的 支 持 和 厚 爱 , 一 千 多 个 日 日夜 夜 , 我 们 与 所 有 的 PHPer 并 肩 同 行 , 互 助 成 长 , 我 们 没 有 沉 没 在 这 段 历 史 中 , 这 不 能 不 归功 于 大 家 辛 勤 的 汗 水 。分 享 、 奉 献 、 协 作 是 《PHPer》 的 主 旨 , 升 华 下 ^_^, 那 么 PHPChina 的 主 旨 则 是 技 术 、分 享 、 奉 献 、 协 作 、 友 爱 、 互 助 、 和 谐 。 老 手 指 点 新 手 、 分 享 经 验 、 分 享 技 巧 、 踊 跃 讨 论 问题 、 技 术 交 流 等 等 在 这 里 都 是 我 们 看 到 的 、 得 到 的 , 重 要 的 是 这 些 就 是 我 们 想 要 的 。 当 然 ,期 间 也 出 现 过 不 愉 快 的 事 情 。三 年 了 , 三 年 不 是 一 个 高 度 更 不 是 终 结 , 三 年 只 是 一 个 数 字 只 是 一 段 时 间 , 它 不 代 表 什么 , 但 我 们 正 年 轻 , 热 情 、 激 情 、 豪 情 我 们 都 不 缺 , 我 们 正 努 力 着 ,PHPChina 还 年 轻 , 她 和我 们 一 样 正 在 努 力 、 正 在 成 长 。 因 为 成 长 , 所 以 依 然 还 吮 吸 着 大 家 的 建 议 、 祝 福 、 支 持 , 凭借 着 这 些 ,PHPChina 正 踏 着 宽 广 的 路 途 勇 往 直 前 ! 借 blankyao 的 一 句 话 ,“PHPChina 是 大 家的 , 不 是 一 个 人 在 奋 斗 !”大 家 能 力 得 到 提 高 , 我 们 就 很 满 足 ; 大 家 微 笑 , 我 们 就 很 满 足 ; 大 家 满 意 , 我 们 就 很 满足 ; 大 家 的 能 在 社 会 上 一 展 风 采 , 我 们 就 很 满 足 !相 信 在 大 家 的 支 持 下 ,PHPChina 会 有 更 加 辉 煌 灿 烂 的 明 天 !篇 幅 有 限 , 下 面 只 列 举 部 分 会 员 的 文 章 、 建 议 和 祝 福 , 详 细 内 容 见 “PHPChina 三 周 年庆 典 版 块 ”。以 下 是 三 周 年 活 动 的 版 块 和 相 关 帖 子 :PHPChina 三 周 年 庆 典PHPChina 三 周 年 各 评 选 活 动 奖 项 揭 晓PHPChina 三 周 年 祝 福 篇PHPChina 三 周 年 建 议 篇PHPChina 三 周 年 评 选 篇PHPChina 三 周 年 征 文 篇PHPChina 三 周 年 汇 总 篇PHPChina 三 周 年 优 秀 撰 稿 人 评 选PHPChina 三 周 年 开 源 币 兑 换 活 动PHPChina 三 周 年 第 二 轮 开 源 币 兑 换 活 动网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 74/87


PHPChina 三 周 年 纪 念 栏《PHPer》PHPChina 三 周 年 情 感 篇xlmo我 心 目 中 的 PHPChina岁 月 如 梭 , 光 阴 似 箭 , 转 眼 三 岁 , 曾 今 的 懵 懂 少 年 们 早 已 奔 走 四 方 创 天 地 , 潜 水 灌 水也 是 更 新 换 代 浪 淘 沙 。朦 胧和 很 多 大 学 新 生 一 样 , 刚 进 大 学 的 我 踌 躇 满 志 的 计 划 着 接 下 来 几 年 的 生 活 : 学 C++。当 时 对 于 编 程 语 言 的 认 识 仅 仅 限 于 C/C++、Delphi、VB, 稚 气 的 我 决 定 花 时 间 学 好 C++,因 为 C++ 是 “ 真 正 的 程 序 员 ” 所 使 用 的 编 程 语 言 … …于 是 , 赶 进 度 般 的 在 学 校 教 到 一 半 的 时 候 自 学 完 了 C, 还 记 得 那 时 候 自 学 C++ 用 的 是《C++ 大 学 教 程 ( 第 二 版 )》, 感 觉 很 不 错 , 就 用 着 这 本 教 材 , 在 我 们 老 师 刚 开 始 教 C++的 时 候 , 我 已 自 学 了 一 半 了 。 当 学 完 半 本 书 的 时 候 , 我 开 始 着 急 了 , 因 为 我 发 现 学 了 一半 我 却 连 一 个 像 样 点 的 程 序 都 做 不 出 来 ! 我 陷 入 了 恐 慌 中 : 是 我 太 笨 还 是 我 没 学 对 , 或者 是 我 不 适 合 做 软 件 ? 那 段 时 间 什 么 想 法 我 都 有 过 。 想 不 通 怎 么 办 ? 那 就 不 想 呗 。 这 段时 间 在 我 记 忆 中 是 很 模 糊 的 , 我 所 有 关 于 这 段 时 间 的 印 象 是 我 在 Linux 不 停 的 尝 试 着 各 种“ 大 虾 ” 推 荐 的 工 具 以 此 来 寻 找 一 些 些 “ 灵 感 ” 来 安 慰 自 己 , 什 么 kdevelop、make、gcc、shell、emacs、fvwm 等 等 , 折 腾 这 些 东 西 花 费 了 我 很 多 时 间 , 我 唯 一 的 收 获 是 便 对 MS产 品 的 反 感 … … 可 是 事 与 愿 违 , 我 发 现 我 们 的 教 材 都 是 MS 的 VB、VC、MSSQL、Windows2000 Server… …启 明此 时 的 PHP 在 我 脑 中 是 一 个 大 大 的 问 号 。受 到 C++ 打 击 之 后 , 我 便 广 开 言 路 , 对 所 有 的 主 流 编 程 语 言 都 大 概 了 解 了 一 下 , 这 期间 也 注 册 过 大 大 小 小 许 多 个 网 站 。 直 到 有 一 天 , 我 收 到 一 封 关 于 PHPChina 上 线 的 邮 件 ,顺 着 链 接 , 我 便 来 到 了 PHPChina 注 册 了 个 号 , 开 始 了 我 的 PHP 之 路 , 时 间 是 2005 年 9月 15 日 , 一 个 很 普 通 的 日 子 。襁 褓 中 的 PHPChina 显 得 非 常 的 稚 嫩 , 不 论 是 会 员 数 、 帖 子 数 还 是 知 名 度 , 都 无 法 与当 时 喜 悦 之 类 的 老 牌 PHP 站 点 相 比 , 在 老 牌 劲 旅 面 前 ,PHPChina 凭 借 什 么 来 争 夺 用 户 ,又 是 凭 借 什 么 来 留 住 用 户 呢 ?PHPChina 会 不 会 成 为 众 多 夭 折 站 点 中 的 下 一 位 呢 ? 这 些 ,我 想 当 时 的 注 册 会 员 , 也 是 如 今 的 所 谓 “ 元 老 ” 们 或 多 或 少 都 曾 经 有 过 疑 问 吧 。一 个 星 期 过 去 了 , 一 个 月 过 去 了 , 两 个 月 过 去 了 , 慢 慢 的 , 我 开 始 感 觉 到 了 PHPChina与 那 些 老 牌 之 间 的 差 异 。 我 想 当 初 经 历 过 那 段 岁 月 的 朋 友 应 该 都 能 够 感 受 得 到 , 不 管 是原 创 还 是 转 载 , 大 家 发 帖 热 情 水 涨 船 高 ; 不 管 重 复 过 多 少 次 、 多 么 基 础 的 问 题 , 大 家 回复 的 热 心 也 是 那 样 的 使 提 问 者 感 觉 到 了 自 己 被 重 视 , 感 受 到 了 大 家 对 自 己 的 尊 重 , 甚 至有 些 问 题 从 发 帖 到 解 答 半 小 时 内 完 成 … …网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 75/87


PHPChina 三 周 年 纪 念 栏《PHPer》不 错 ,PHPChina 有 的 是 热 情 和 热 心 , 同 比 当 时 的 几 大 国 内 PHP 社 区 , 技 术 水 品 上 来说 PHPChina 可 能 刚 刚 起 步 , 略 显 稚 嫩 , 但 在 奉 献 ( 时 间 ) 与 分 享 ( 经 验 ) 这 点 上 ,PHPChina应 该 是 很 能 让 人 感 觉 的 到 的 。PHPChina 留 住 了 我 。我 选 择 了 PHP。上 升论 坛 是 个 壳 , 重 要 的 是 里 面 的 灵 ( 社 区 文 化 ) 和 魂 ( 会 员 )。PHPChina 向 着 良 好 的 “ 灵 ” 前 进 着 , 同 时 也 培 养 起 来 一 批 可 爱 的 “ 魂 ”。谈 到 PHPChina 的 成 长 , 有 一 件 事 是 不 得 不 提 的 , 呵 呵 , 随 风 同 学 的 事 情 ,“ 老 人 ” 们应 该 都 不 会 忘 记 , 那 次 事 件 让 大 家 知 道 了 :PHPer, 你 不 是 一 个 人 在 战 斗 ! 心 手 相 连 , 兄弟 之 情 也 不 过 如 此 啊 !PHPChina 里 面 的 情 感 故 事 还 是 有 不 少 呢 , 大 家 有 兴 趣 的 可 以 自 己去 发 掘 一 下 … …板 块 一 个 接 一 个 的 开 , 注 册 人 数 不 断 的 攀 高 , 原 创 比 例 越 来 越 高 , 技 术 水 准 也 由 建 站初 期 的 转 帖 +“Windows 下 怎 么 配 置 PHP 啊 ” 发 展 到 了 如 今 的 “ 模 板 、 框 架 、 部 署 , 一 个都 不 能 少 ”。培 训 、PEA、 杂 志 , 这 三 者 , 进 一 步 制 造 了 PHPChina 与 业 界 同 类 站 点 之 间 的 差 异 ,影 响 面 迅 速 扩 大 。前 方到 明 年 的 今 天 ,PHPChina 注 册 人 数 会 增 加 多 少 , 我 不 知 道 , 发 帖 量 有 多 少 , 我 也 不知 道 。 我 知 道 的 只 有 一 个 : 如 果 广 大 PHPer 还 能 一 如 既 往 的 关 心 爱 护 咱 们 的 PHPChina,还 能 无 私 的 奉 献 青 春 与 广 大 同 仁 分 享 经 验 , 保 持 着 热 情 积 极 探 索 的 心 态 , 那 么 PHPChina不 管 多 少 年 以 后 , 都 会 是 你 想 象 中 的 样 子 。PHPChina 的 发 展 靠 的 是 你 , 是 我 , 是 大 家 。 说 句 不 好 听 的 , 哪 怕 有 一 天 PHPChina真 关 了 , 只 要 大 家 齐 心 , 再 弄 一 个 PHPEarth 也 不 是 不 可 能 , 灵 魂 有 了 , 还 怕 找 不 着 好 的肉 身 吗 ?三 年 中 , 物 是 人 非 。 人 变 了 , 事 变 了 , 地 变 了 , 景 变 了 , 心 境 变 了 , 习 惯 变 了 , 想 法变 了 。 但 不 论 何 时 何 地 看 到 的 你 , 却 总 是 如 此 的 如 一 , 注 册 人 数 变 了 , 在 线 人 数 变 了 ,发 帖 量 变 了 , 你 所 给 我 的 感 觉 却 仍 是 那 么 的 亲 近 , 那 么 的 感 性 。经 历 过 了 漫 无 目 的 , 经 历 过 了 喜 悦 , 经 历 过 了 快 乐 , 经 历 过 了 彷 徨 , 经 历 过 了 期 待 ,经 历 过 了 思 念 , 经 历 过 了 所 有 , 回 头 看 看 你 , 还 是 那 样 的 在 欢 迎 我 , 打 开 页 面 , 如 此 的熟 悉 , 如 此 的 熟 悉 … …与 PHPChina 一 同 成 长 , 时 时 刻 刻 都 能 感 受 到 彼 此 的 进 步 , 互 相 激 励 着 , 互 相 珍 惜 着 。你 也 是 这 样 吗 ?网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 76/87


PHPChina 三 周 年 纪 念 栏七 月 十 五《PHPer》无 题 — — 又 名 《 七 月 十 五 与 PHPChina 风 流 韵 事 》记 得 晚 唐 李 义 山 喜 作 无 题 诗 。 篇 曰 《 无 题 》 自 有 原 因 , 不 能 说 、 不 好 说 、 说 不 好 、 无法 说 、 说 不 清 、 不 可 说 都 算 。 如 果 要 说 一 下 我 跟 PHPChina 之 间 的 感 情 , 按 山 鸡 (PHPChinaID:shanji, 夜 色 活 跃 分 子 — — 作 者 注 ) 的 说 法 , 应 该 可 以 改 成 《 七 月 十 五 与 PHPChina— —不 能 说 的 秘 密 》、《 七 月 十 五 与 PHPChina 风 流 韵 事 》 之 类 的 , 绝 对 吸 引 眼 球 。 其 实 PHPChina与 我 , 似 君 子 之 交 淡 如 水 , 似 有 太 多 太 多 的 话 要 说 , 一 时 却 无 从 说 起 。 蓦 然 间 , 千 头 万绪 已 涌 上 心 头 。早 在 学 生 时 代 我 就 对 编 程 有 着 很 大 的 兴 趣 , 接 触 计 算 机 后 就 深 深 的 被 吸 引 了 , 为 之 不眠 , 为 之 痴 狂 , 为 之 魂 牵 梦 绕 。 当 年 的 主 场 是 机 算 机 中 心 、 寝 室 、 图 书 馆 , 课 堂 和 足 球场 那 基 本 上 算 是 客 场 。 从 《 精 通 DOS6.22》 入 门 到 《C 程 序 设 计 》 提 高 到 《IBM PC 汇 编程 序 设 计 》 扩 展 到 《 计 算 机 原 理 》 深 入 理 解 到 《 操 作 系 统 原 理 DOS 篇 》 摸 到 一 点 点 门 道 。学 得 个 不 亦 乐 乎 , 忘 乎 所 以 。 很 多 同 学 和 老 师 都 差 点 把 我 当 作 计 算 机 专 业 , 其 实 我 的 课表 里 压 根 没 有 计 算 机 这 一 门 。七 月 十 五 曰 : 在 学 校 里 有 良 好 的 氛 围 , 学 生 时 光 要 珍 惜 , 好 好 打 好 基 础 , 日 后 才 有 所发 展 。时 光 飞 逝 , 很 快 就 毕 业 了 。 步 入 社 会 后 , 现 实 把 我 修 理 得 服 服 帖 帖 , 在 一 座 美 丽 的 城市 里 , 漫 无 目 的 混 日 子 。 望 着 满 眼 的 Windows, 自 以 为 是 的 认 为 所 学 的 全 已 过 时 , 把 DOS和 程 序 设 计 埋 进 了 记 忆 里 。七 月 十 五 曰 : 能 得 到 良 师 的 指 点 迷 津 , 不 至 于 走 错 方 向 。 假 如 当 年 有 人 给 我 指 向《Windows 程 序 设 计 》 的 话 … …弹 指 一 挥 五 六 年 , 无 意 间 接 触 了 HTML, 学 会 了 简 单 的 网 页 制 作 。 发 现 用 HTML 居然 可 以 很 好 的 显 示 在 窗 口 里 , 多 年 来 冬 眠 在 心 底 程 序 知 识 蠢 蠢 欲 动 , 似 乎 要 趁 着 春 风 苏醒 过 来 。 不 知 足 的 我 , 很 自 然 的 就 接 触 到 了 PHP 和 ASP, 由 于 对 C 语 言 的 理 解 和 掌 握 ,很 快 深 深 的 喜 欢 上 了 PHP。 而 当 时 的 PHP 专 业 论 坛 少 之 又 少 , 人 气 很 冷 清 。 直 到 有 一 天 ,我 在 网 上 搜 索 “PHP 中 国 ”, 终 于 跟 PHPChina 有 了 第 一 次 的 亲 密 接 触 , 她 的 专 业 大 气 、平 易 近 人 、 热 情 似 火 一 下 子 把 我 “ 勾 引 ” 了 , 从 此 也 深 爱 上 了 她 。七 月 十 五 曰 : 自 己 的 努 力 钻 研 是 必 须 的 , 如 果 有 好 朋 友 在 帮 你 , 将 会 事 半 功 倍 。从 第 一 次 发 帖 《PHP+MySQL 快 速 入 门 》, 到 无 头 苍 蝇 似 的 到 处 提 问 , 到 实 际 动 手 写较 系 统 的 代 码 , 到 学 习 面 向 对 象 , 理 解 编 程 思 想 , 慢 慢 进 阶 。 从 普 通 的 小 象 成 长 为 大 象 ,从 普 通 会 员 做 了 版 主 。 从 默 默 无 名 到 似 乎 小 有 名 气 :)。 从 提 了 点 小 建 议 就 收 到 07 年 纪 念 T恤 到 兑 换 08 年 T 恤 到 收 到 奖 励 书 籍 ,PHPChina 在 不 遗 余 力 的 为 PHPer 作 贡 献 , 同 时 给予 了 我 很 多 很 多 。PHPChina 是 我 PHP 及 程 序 设 计 的 启 蒙 、 良 师 、 益 友 。PHPChina 在 为众 多 PHPer 传 道 、 授 业 、 解 惑 , 同 时 帮 助 我 学 到 了 很 多 知 识 — — 程 序 设 计 、 编 程 思 想 、项 目 方 案 ; 结 识 了 很 多 朋 友 — — 虽 然 素 未 谋 面 ; 充 实 了 自 己 的 人 生 — — 虽 然 我 现 在 还 没有 走 上 程 序 员 的 道 路 , 但 我 乐 此 不 疲 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 77/87


PHPChina 三 周 年 纪 念 栏《PHPer》七 月 十 五 曰 : 汝 果 欲 学 诗 , 工 夫 在 诗 外 。 要 学 好 程 序 设 计 , 还 有 很 多 要 去 了 解 和 掌 握 。PHPChina 见 证 了 我 的 成 长 , 更 见 证 了 很 多 很 多 优 秀 PHPer 的 成 长 。人 生 能 得 PHPChina 这 一 众 良 师 益 友 , 那 是 莫 大 的 幸 运 。我 衷 心 祝 福 PHPChina 越 来 越 好 。shanji那 一 贱 的 风 情技 术 可 以 低 于 人 , 文 采 可 以 逊 于 人 , 标 题 一 定 要 雷 死 人 。时 光 荏 苒 , 岁 月 如 梭 , 多 么 俗 的 两 句 话 , 但 时 间 过 得 真 快 , 转 眼 半 年 过 去 了 , 虽 然 不长 , 却 有 很 多 感 悟 。我 是 一 个 喜 欢 自 虐 的 人 , 从 不 主 动 和 老 朋 友 、 老 同 学 联 系 , 却 总 在 不 经 意 间 , 因 为 一首 歌 、 一 张 照 片 , 想 起 很 多 人 、 很 多 事 。没 有 诗 人 的 才 气 , 却 有 诗 人 的 矫 情 , 没 有 老 肥 的 淫 荡 , 却 有 老 肥 的 放 纵 , 没 有 十 五 的技 术 , 却 有 十 五 的 张 狂 , 没 有 啥 写 的 , 我 也 能 整 出 排 比 句 。缘 起 缘 灭 , 似 乎 冥 冥 中 自 有 定 数 , 走 上 PHP 的 道 路 是 偶 然 的 , 来 到 PHPChina 是 偶然 的 , 无 数 的 偶 然 却 让 我 遇 到 了 这 么 多 真 挚 的 朋 友 , 这 也 许 就 是 必 然 。感 谢 主 、 神 、 上 帝 、 玉 皇 大 帝 , 阿 门 、 阿 弥 陀 佛 … …初 入 PHPChina, 我 心 中 充 满 了 疑 问 :十 五 工 作 室 到 底 有 多 大 、 老 肥 到 底 有 多 淫 荡 、 白 菜 到 底 有 多 个 性 、 辉 老 大 到 底 有 多 少粉 丝 、 老 逆 小 姨 子 到 底 是 谁 , 昊 男 哥 是 不 是 戴 志 康 。说 是 技 术 吸 引 了 我 , 不 如 说 各 位 的 人 格 魅 力 吸 引 了 我 , 你 们 都 是 我 的 偶 像 !每 段 回 忆 都 有 最 难 忘 的 部 分 , 提 起 我 与 PHPChina 的 故 事 , 就 不 能 不 说 起 夜 色 , 夜 色是 我 的 家 , 我 生 长 的 地 方 , 夜 色 见 证 了 我 在 PHPChina 的 每 一 天 。 还 是 偶 然 , 我 来 到 了 夜色 , 这 里 轻 松 、 自 由 的 氛 围 深 深 的 吸 引 了 我 , 我 开 始 扎 根 夜 色 , 不 知 疲 倦 的 水 帖 。由 于 我 的 无 厘 头 、 恶 搞 、 涉 黄 以 及 淫 诗 , 水 区 迅 速 的 容 纳 了 我 , 与 各 位 水 友 的 胡 侃 ,给 了 我 灵 感 , 扯 淡 正 是 我 的 强 项 , 如 鱼 得 水 的 我 , 在 枯 燥 、 乏 味 的 coding 间 隙 , 创 作 了大 量 诗 歌 :赠 龙 兄惊 闻 龙 兄 意 隐 退 ,掩 面 涕 泣 心 欲 碎 。把 酒 一 杯 问 苍 天 ,此 去 谁 与 我 共 醉 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 78/87


PHPChina 三 周 年 纪 念 栏《PHPer》挽 留 住 有 意 隐 退 的 资 深 水 友 隆 胸 。伤 离 别夜 色 幽 梦 意 阑 珊 ,泪 别 佳 人 眼 欲 穿 。丝 丝 袅 袅 离 别 恨 ,点 点 星 河 九 重 天 。将 铁 杆 女 鸡 丝 小 莘 菲 感 动 至 落 泪 。远 征一 蓑 烟 雨 一 帘 梦 ,一 腔 热 血 祭 平 生 。顶 天 立 地 豪 情 在 ,横 刀 跃 马 人 远 征 。带 给 独 自 过 生 日 的 shher 些 许 温 暖 。明 月情 意 绵 绵 断 人 肠 ,相 视 无 言 泪 千 行 。欲 上 九 天 揽 明 月 ,星 高 云 淡 天 苍 茫 。是 写 给 远 在 东 瀛 漂 泊 , 纠 结 中 的 小 三 女 鬼 。梅 花 落斗 转 星 移 新 月 朔 ,勇 超 山 鸡 登 王 座 。夜 色 巾 帼 胜 须 眉 ,风 卷 残 云 梅 花 落 。送 给 了 势 头 很 劲 的 女 水 手 菜 篮 子 。每 首 诗 的 背 后 都 是 一 段 故 事 , 记 录 了 我 在 PHPChina, 在 夜 色 的 点 点 滴 滴 , 也 许 有 人认 为 灌 水 是 没 有 意 义 的 , 也 许 有 人 说 水 区 是 堕 落 的 , 但 我 想 说 , 每 件 事 都 有 两 个 方 面 ,真 挚 的 付 出 , 必 然 有 收 获 , 水 友 就 是 我 在 PHPChina 最 大 的 财 富 。 当 然 凡 事 有 度 , 十 五 、辉 老 大 、 海 盗 兄 都 曾 给 过 我 真 诚 的 建 议 , 既 然 鱼 与 熊 掌 不 可 兼 得 , 我 希 望 能 得 到 一 半 熊掌 , 一 半 鱼 。蓦 然 回 首 ,PHPChina 迎 来 了 三 周 岁 的 生 日 , 祝 福 的 话 说 多 了 显 得 苍 白 , 夸 奖 的 的 话说 多 了 显 得 虚 伪 , 我 能 做 的 就 是 一 如 既 往 的 为 PHPChina 贡 献 自 己 的 光 和 热 。最 后 我 想 说 : 夜 色 是 PHPer 展 示 自 己 的 舞 台 , 也 是 PHPer 底 蕴 沉 淀 的 结 晶 , 或 心 酸 、或 苦 涩 、 或 美 好 或 甘 甜 , 它 代 表 了 一 种 文 化 , 一 种 PHPer 特 有 的 文 化 , 欢 迎 你 到 夜 色 来 ,我 在 这 里 等 你 !网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 79/87


PHPChina 三 周 年 纪 念 栏《PHPer》PHPChina 三 周 年 建 议 篇xanxin现 在 发 觉 PHPChina 上 的 水 贴 越 来 越 多 , 看 到 好 多 问 题 都 是 重 复 性 的 , 且 有 些 一 个 贴发 到 好 几 个 版 块 , 且 好 像 广 告 性 质 有 点 浓 了 。 下 面 是 我 的 一 点 期 望 用 建 议 :一 、 期 望 : 能 长 久 不 衰建 议 : 严 格 限 制 版 块 中 发 贴 的 权 限 , 实 行 审 核 制 度 , 只 开 放 几 个 版 块 给 新 人 发 贴 , 就像 落 伍 者 中 的 入 伍 区 , 制 定 入 伍 细 则 , 参 考 :http://www.im286.com/thread-1537697-1-1.html当 达 到 要 求 之 后 才 可 以 在 其 它 版 块 上 发 贴 。 具 体 可 参 考 落 伍 者 。二 、 期 望 : 博 客 能 发 展 起 来可 能 这 个 是 最 难 实 现 的 , 因 为 很 多 来 这 人 都 有 自 己 的 网 站 , 一 些 技 术 文 章 都 发 表 到 自己 的 站 点 中 。建 议 : 希 望 能 够 加 强 人 们 的 主 动 性 , 能 在 PHPChina 开 设 的 博 客 空 间 中 发 表 自 己 的 文章 , 特 别 是 原 创 性 的 心 得 技 术 文 章 , 能 够 像 博 客 园 、ChinaUNIX 一 样 , 这 些 立 足 点 的 博客 栏 目 做 得 挺 不 错 的 , 大 家 都 主 动 地 在 上 面 分 享 自 己 的 心 得 , 形 成 一 个 技 术 汇 集 地 , 不要 只 在 论 坛 中 发 表 , 免 得 形 成 信 息 垃 圾 , 因 为 现 在 论 坛 中 含 水 太 多 了 。 如 果 大 家 的 主 动性 不 高 的 话 可 以 开 立 一 个 聚 合 栏 目 , 让 大 家 提 交 Feed 我 相 信 大 家 应 该 可 以 做 到 , 毕 竟 很多 人 都 想 推 广 一 下 自 己 的 站 点 。三 、 期 望 : 主 页 更 新 快 速 一 点这 也 不 是 什 么 期 望 了 , 发 觉 广 告 不 少 。也 来 个 版 块 建 议 : 建 议 改 一 下 版 块 , 个 人 觉 得 版 块 太 多 了 , 应 该 好 好 分 一 下 类 。 下 面参 考 了 cnblogs 的 , 觉 得 “ 博 问 ” 和 “ 企 业 信 息 化 ” 不 错 。原 创 区非 技 术 区PHP 新 手 区其 他 技 术 区企 业 信 息 化新 闻 频 道博 问翻 译 区读 书 区求 职 招 聘 区软 件 与 代 码 发 布建 议 :1、 希 望 我 们 这 些 小 兵 能 上 传 大 一 点 的 附 件 ;网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 80/87


PHPChina 三 周 年 纪 念 栏《PHPer》2、 开 一 个 专 题 讨 论 版 块 , 专 门 用 来 讨 论 某 个 主 题 , 这 些 主 题 由 PHPChina 官 方 或 有 威望 的 会 员 发 起 组 织 发 起 , 其 他 会 员 只 能 回 复 不 能 发 贴 , 这 样 能 够 维 护 主 题 的 技 术 性 , 如 其他 会 员 有 好 的 想 法 可 以 向 版 主 提 出 , 每 隔 一 段 时 间 楼 主 应 该 来 讨 论 总 结 ;3、PHP 家 园 的 活 跃 性 不 够 。lxylxy888666太 阳 不 才 : 来 PPC 也 一 年 了 , 感 谢 PHPChina, 建 议 不 好 或 想 法 无 聊 , 请 批 评 指 教 。PHPChina 为 PHP 的 发 展 作 出 了 不 可 估 量 的 作 , 在 全 国 推 广 , 提 高 PHP 的 影 响 力 ,以 致 于 我 未 毕 业 就 能 用 PHP 吃 饭 , 其 它 好 的 就 不 说 了 , 大 家 明 白 , 什 么 提 供 学 习 平 台 。1、Phpchina 就 是 菜 鸟 的 天 堂 , 俺 也 是 小 菜 , 问 的 问 题 没 有 深 度 , 高 级 区 一 片 死 水 ,究 其 原 因 , 可 能 是 PHP 比 较 简 单 , 而 有 一 两 年 经 验 的 PHP 程 序 员 就 能 百 度 、 狗 狗 搜 索 解决 , 以 至 于 很 少 来 PHPChina, 就 算 来 问 了 , 也 少 有 高 手 热 情 参 与 。 当 然 里 面 也 有 很 多 有分 量 的 问 题 , 可 能 讨 论 就 很 乱 ( 最 欣 赏 回 答 的 人 : 阿 羽 哥 )。可 能 改 善 方 法 : 希 望 有 高 手 带 头 , 提 供 一 些 比 较 有 深 度 , 具 有 研 讨 价 值 的 问 题 , 比如 , 个 人 认 为 连 HTTP、SOCKET、SOA 架 构 拿 到 论 坛 来 就 算 高 级 东 西 , 但 其 实 属 于 中级 问 题 , 但 竟 然 没 发 现 什 么 资 料 在 论 坛 里 。2、 版 主 不 负 责 任 , 个 人 认 为 辉 老 大 是 我 最 敬 佩 的 人 ,( 原 因 就 不 说 了 ) 当 然 还 有 一些 , 我 来 的 时 間 短 , 就 不 知 道 了 , 近 期 十 五 也 很 好 , 小 胡 子 也 OK, 山 鸡 也 不 错 ( 在 我 无聊 的 时 候 去 夜 色 水 , 减 少 了 很 多 寂 寞 , 无 奈 ,3Q 那 些 水 友 , 这 也 许 是 我 在 PHPChina 最大 的 收 获 , 汗 一 个 )。可 能 改 善 方 法 , 版 主 向 辉 哥 , 十 五 学 习 , 不 负 责 任 的 ,T 掉 !!! 名 誉 版 主 也 不 给 ! 让有 奉 献 精 神 的 人 上 ! 为 PHPChina 的 朋 友 提 供 一 个 好 的 环 境 , 这 也 代 表 中 国 PHPChina 的面 貌 !( 希 望 官 方 能 给 版 主 物 质 上 的 奖 励 !!! 明 确 公 告 !)3、 奖 励 方 法 不 合 理 , 什 么 威 望 没 价 值 , 在 水 区 里 乱 给 , 俺 也 在 其 中 , 给 了 我 很 多 快乐 , 开 源 币 不 能 乱 给 , 这 责 任 落 在 版 主 身 上 了 , 让 版 主 给 , 好 的 问 题 多 发 , 无 聊 问 题 不给 , 对 回 答 有 价 值 的 问 题 奖 励 开 源 币 , 别 奖 励 分 ! 希 望 会 员 不 要 因 为 开 源 币 的 多 少 而 在乎 , 相 信 版 主 是 公 平 的 !4、 有 些 暂 时 没 啥 作 用 的 版 块 是 不 考 虑 先 关 掉 , 大 家 不 参 与 的 版 块 是 没 有 价 值 的 。5、 强 强 强 烈 把 网 页 游 戏 版 块 ( 包 括 那 红 字 , 看 着 恶 心 ) 删 掉 吧 !! 我 沉 迷 其 中 了 ,10 天 来 天 天 玩 , 吃 饭 都 懒 得 去 , 学 习 第 一 ! 连 看 Discuz! 的 计 划 都 耽 误 了 , 汗 自 己 !6、 希 望 PHP 朋 友 能 把 自 己 手 上 的 好 代 码 开 源 出 来 , 希 望 官 方 ( 版 主 ) 给 奖 励 ( 开 源币 ), 实 际 上 已 经 做 了 , 感 觉 做 得 不 是 很 好 , 加 分 没 啥 意 义 , 是 加 精 华 才 有 币 的 , 只 有 这样 , 东 西 多 了 , 大 家 才 能 学 到 , 才 会 参 与 。 大 家 问 问 题 时 , 先 自 己 搜 索 下 吧 , 不 要 问 很低 级 的 东 西 , 不 要 过 分 依 赖 别 人 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 81/87


PHPChina 三 周 年 纪 念 栏《PHPer》7、PHPChina 已 经 很 好 了 , 希 望 我 的 建 议 有 一 丁 点 作 用 , 就 算 没 有 也 没 啥 , 希 望 PHPChina能 给 PHP 朋 友 一 个 好 的 环 境 , 我 也 愿 意 奉 献 我 的 一 点 点 力 量 !当 点 击 查 看 新 帖 时 , 由 于 夜 色 太 繁 荣 了 很 多 就 是 关 于 夜 色 的 , 在 技 术 论 坛 , 当 点 击 时 ,看 到 这 种 现 象 , 会 是 什 么 感 觉 ?? 希 望 点 击 查 看 新 帖 时 , 不 要 出 现 夜 色 的 帖 子 在 里 面 。sheak1、 我 们 到 这 里 来 是 干 什 么 的 。- 学 习 、 提 高 。 所 以 针 对 大 部 分 像 我 这 样 的 菜 鸟 级 程序 员 , 最 大 的 渴 望 是 自 己 提 的 问 题 能 最 快 被 版 主 或 者 好 心 网 友 予 以 解 答 或 提 示 。 比 如 今天 有 个 网 友 专 门 发 了 个 贴 , 说 自 己 从 注 册 到 现 在 提 的 问 题 都 没 人 回 答 , 最 后 是 在 看 不 下去 我 去 滥 竽 充 数 给 写 了 几 个 字 。 可 以 想 象 这 个 网 友 心 里 不 舒 服 。建 议 : 每 个 版 都 培 养 一 些 高 水 平 的 版 主 或 者 荣 誉 版 主 、 高 级 会 员 等 , 最 好 能 经 常 保 持在 线 , 解 答 会 员 的 一 些 问 题 。2、 建 议 增 加 HTML 在 线 运 行 模 块 。3、 其 实 很 多 网 友 很 在 乎 自 己 会 员 ID 的 级 别 和 威 望 等 , 这 些 多 少 能 说 明 自 己 被 认 知 度 。最 好 能 表 现 出 来 一 点 。4、 其 实 我 一 直 不 知 道 开 源 币 到 底 有 什 么 用 。 还 有 就 是 获 得 开 源 币 的 机 制 似 乎 有 点 不妥 , 具 体 该 怎 么 修 改 我 还 没 研 究 。5、 对 于 一 些 广 告 贴 , 疑 似 广 告 贴 , 版 主 应 该 下 手 要 狠 , 而 不 是 放 纵 之 。6、 在 这 里 混 了 有 段 时 间 了 , 说 实 话 没 见 几 个 版 主 , 当 然 , 见 过 的 版 主 和 没 见 过 的 版主 我 都 不 提 名 字 了 。 大 部 分 版 主 应 该 向 某 些 版 主 学 习 , 版 主 应 该 主 动 帮 会 员 解 答 问 题 或者 定 期 整 理 好 的 文 章 或 者 优 秀 的 代 码 给 我 们 分 享 。 而 不 是 只 挂 名 字 不 见 人 。7、 为 什 么 坛 子 里 人 气 不 行 。 一 个 很 奇 怪 的 现 象 , 看 的 人 数 是 回 帖 人 数 的 几 十 倍 甚 至上 百 倍 。 由 于 此 原 因 我 的 好 几 个 帖 子 都 设 置 了 回 复 可 见 。 其 实 我 也 很 讨 厌 这 样 的 贴 好 回复 的 。 编 辑 的 时 候 麻 烦 , 看 的 时 候 生 气 。。 但 是 看 见 一 个 好 贴 辛 辛 苦 苦 编 辑 上 来 点 击 人 数不 少 , 留 下 点 意 见 的 却 没 几 个 人 心 里 很 不 是 滋 味 。建 议 : 设 立 合 理 机 制 鼓 励 会 员 回 帖 , 回 好 贴 。 版 主 也 可 随 机 对 有 价 值 的 回 帖 予 以 适 当奖 励 。一 点 不 成 熟 的 建 议 大 家 批 评 !七 月 十 五俺 的 想 法 可 能 太 大 了 , 不 太 可 能 实 现1、 建 议 对 现 有 的 版 块 合 理 划 分 一 下 , 有 些 版 块 重 复 了 , 有 些 版 块 太 笼 统 , 有 些 版 块太 冷 清 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 82/87


PHPChina 三 周 年 纪 念 栏《PHPer》PHP 基 础语 法 基 础 ( 求 助 问 答 、 数 据 结 构 、 算 法 )平 台 工 具 (Linux、Apache、MySQL、Windows Server、 编 辑 器 )客 户 端 技 术 (XHTML、CSS、JS、Ajax、XML)PHP 进 阶解 决 方 案代 码 剖 析原 创 论 著框 架 应 用PHP 高 级设 计 模 式项 目 管 理2、 建 议 提 问 者 悬 赏 开 源 币 , 答 对 问 题 者 有 嬴 取 悬 赏 。( 盗 版 了 楼 主 打 分 制 )3、 建 议 精 华 推 荐 的 群 发 短 信 的 地 址 用 链 接 形 式 , 点 击 就 可 以 打 开 了 。 复 制 到 地 址 栏打 开 体 验 不 太 好 。建 议 制 定 版 主 执 行 标 准比 如 什 么 帖 子 该 高 亮 , 以 何 种 颜 色 高 亮 。 什 么 帖 子 必 须 删 除 。 何 种 情 况 被 禁 言 , 禁 言的 时 长 是 多 少 ? 什 么 帖 子 应 该 被 锁 定 、 沉 底 、 转 移 、 合 并 、 分 割 等 等 。 什 么 帖 子 可 以 被 加减 威 望 和 开 源 币 , 加 减 额 度 是 多 少 等 等 。 这 个 基 本 上 是 建 议 各 区 版 主 的 。 其 实 这 方 面 我 也没 有 做 好 … … 需 要 努 力 改 进1、“PHP 基 础 编 程 ” 更 名 为 “ 问 答 求 助 ”, 重 在 “ 求 助 与 问 答 ” 解 决 实 际 问 题 。 排 名第 一 ;2、“PHP 高 级 应 用 ” 更 名 为 “ 应 用 讨 论 ”, 重 在 “ 讨 论 ”, 具 体 的 问 题 和 解 答 一 率 去 “ 求助 问 答 ”, 排 名 第 二 。3、“PHP 项 目 工 程 管 理 ” 重 视 起 来 , 排 名 第 三 ;4、ZendFramwork 从 “Framework 区 ” 分 离 , 独 立 成 一 个 版 块 “ZendFramework” 排名 第 四 ;5、 其 余 的 框 架 归 类 在 “ 主 流 PHP 框 架 ”, 下 设 各 框 架 对 应 子 版 块 , 如 :FleaPHP、ThinkPHP、CodeIgniter、Qee、CakePHP、Symfony 等 等 ;6、 设 立 “ 流 行 的 PHP 应 用 ”, 专 门 解 决 如 Discuz!、Joomal、Drupal、Xoops、PHPWind、Smarty 等 等 流 行 PHP 应 用 的 问 题 ;7、 夜 色 和 贴 图 合 并 为 夜 色 ;8、“PHPChina 公 告 ” 更 名 为 “ 公 告 及 意 见 建 议 ”, 标 题 类 别 “ 公 告 ”、“ 意 见 ”、“ 建 议 ”、“ 投 诉 ”;9、 把 一 些 原 来 设 在 板 块 下 的 历 史 子 板 块 并 起 来 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 83/87


PHPChina 三 周 年 纪 念 栏kuhanzhu《PHPer》1、 建 议 将 “ 作 者 被 禁 止 或 删 除 , 内 容 自 动 屏 蔽 ” 这 样 的 广 告 帖 能 删 除 , 比 如 :http://bbs.phpchina.com/thread-85009-1-1.html。2、 技 术 区 斑 竹 每 天 1 个 开 源 币 太 少 了 , 要 知 道 发 一 主 题 帖 都 有 一 分 。 对 于 原 创 文 章或 者 回 复 精 彩 的 文 章 , 斑 竹 可 以 额 外 打 一 分 , 但 一 天 要 是 有 好 多 的 话 , 就 没 法 打 了 , 建 议每 次 只 能 打 1~2 分 , 但 一 天 可 以 打 10 分 比 较 好 。 如 果 滥 用 , 就 办 了 就 是 。3、 论 坛 首 页 顶 部 的 热 门 标 签 不 是 很 有 用 。 不 如 去 掉 或 者 用 其 他 内 容 来 取 代 。 管 理 员不 是 每 日 有 群 发 一 些 精 彩 帖 子 的 吗 ? 把 那 些 帖 子 放 首 页 比 较 好4、 另 外 我 始 终 感 觉 基 础 区 问 问 题 加 1 开 源 币 不 合 理 , 有 些 人 乱 问 的 。 导 致 高 手 不 如菜 菜 鸟 开 源 币 高 。是 否 可 以 这 样 : 发 一 帖 得 一 分 开 源 币 , 但 系 统 规 定 基 础 区 只 能 发 悬 赏 帖 , 而 且 悬 赏 额为 1 开 源 币 。 这 样 发 帖 者 不 赚 也 不 赔 。另 外 斑 竹 对 马 甲 发 帖 给 悬 赏 开 源 币 的 事 情 要 严 惩 , 昨 天 我 就 看 到 某 人 用 马 甲 发 了 2 帖悬 赏 帖 , 每 帖 是 10 开 源 币 , 而 斑 竹 只 是 把 帖 子 沉 底 了 事 , 对 当 事 人 未 做 出 任 何 惩 罚 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 84/87


PHPChina 三 周 年 纪 念 栏FisingPHPChina 三 周 年 祝 福 篇《PHPer》Sheak祝 PHPChina 三 周 岁 生 日 快 乐 !愿 中 国 的 PHPer 队 伍 越 来 越 强 悍 !愿 中 国 的 互 联 网 企 业 越 来 越 强 大 !三 岁 真 是 大 寿 啊 !~~很 荣 幸 赶 上 了希 望 PHPChina 越 来 越 强 大希 望 这 里 的 PHPer 越 来 越 强 大Wukeyuan哈 哈 看 到 了在 三 年 的 经 营 中 ,PHPChina 一 步 一 步 的 走 向 成 熟 , 处 处 都 为 PHPer 谋 福 利 , 并 先 后发 展 了 PEA 组 织 ,《PHPer》 杂 志 , 还 具 有 自 己 的 培 训 品 牌 , 在 这 一 路 的 发 展 中 , 我 们 不但 见 证 了 PHPChina 的 发 展 壮 大 , 同 时 也 见 证 了 自 己 和 PHPChina 一 路 的 成 长 。 我 们 有 理由 相 信 PHPChina 在 以 后 的 道 路 上 会 越 来 越 好 , 越 来 越 强 大 , 使 之 成 为 PHPer 菜 鸟 和 老 鸟学 习 和 生 活 的 天 堂 。 祝 PHPChian 越 办 越 红 火 。把 牛 人 问 倒PHPChina 生 日 快 乐我 们 和 PHPChina 一 起 成 长 ! 加 油 !预 祝 高 手 泛 滥 , 水 族 飙 升 , 和 谐 共 处 , 时 而 恶 作 剧 , 幽 默 间 增 添 气 氛 。 虹 雨 人 气 中 天 ,热 闹 非 凡 , 亲 切 温 馨 , 友 好 侃 聊 , 玩 闹 有 度 , 趣 帖 不 断 , 新 人 倍 出 。新 人 报 道 , 新 人 不 断 , 人 气 上 升 , 新 气 象 新 面 孔 , 新 旧 家 人 共 乐 。交 友 帖 , 靓 照 增 加 , 一 饱 眼 福 , 互 相 认 识 , 寻 找 知 己 , 把 酒 畅 谈 。To 豆 泥 _愿 祖 国 的 PHP 事 业 繁 荣 昌 盛 !网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 85/87


LAMP 新 书 :PHP、MySQL 和 Apache 编 程 导 学 ( 原 书 第 4 版 )LAMP 新 书《PHPer》PHP、MySQL 和 Apache 编 程 导 学 ( 原 书 第 4 版 )出 版 社 : 机 械 工 业 出 版 社原 书 名 :Sams Teach Yourself PHP, MySQL and Apache All in One (4th Edition)原 出 版 社 :Apress作 者 :Julie C.Meloni译 者 : 李 军出 版 日 期 :2009 年 1 月图 书 介 绍 :一 册 在 手 , 学 习 不 愁 。利 用 本 书 , 你 可 以 在 很 短 的 时 间 内 学 会 如 何 综 合 使 用PHP、MySQL 和 Apache 这 3 种 最 先 进 的 开 源 Web 开 发 工具 , 来 创 建 动 态 的 、 交 互 式 的 Web 站 点 和 应 用 程 序 。本 书 讲 解 循 序 渐 进 、 按 部 就 班 , 每 一 章 都 是 在 前 一 章内 容 的 基 础 上 进 行 介 绍 , 使 得 你 能 够 从 头 开 始 学 习 PHP脚 本 编 程 、MySQL 数 据 库 以 及 Apache 服 务 器 的 基 础 知 识 。不 管 你 是 使 用 Linux、Windows 或 者 Mac OS X, 随 书 光 盘 附 带 了 一 个 完 整 的 启 动 工 具 ,使 你 能 够 安 装 设 置 一 个 可 以 用 于 学 习 、 测 试 和 产 品 开 发 的 环 境 所 需 的 所 有 软 件 。本 书 主 要 内 容 :1) 安 装 、 配 置 和 设 置 PHP 脚 本 语 言 、MySQL 数 据 库 系 统 和 Apache Web 服 务 器 ;2) 综 合 各 项 技 术 创 建 一 个 动 态 、 支 持 数 据 库 的 Web 站 点 ;3) 使 用 PHP 和 MySQL 交 互 ;4) 操 作 表 单 和 文 件 ;5) 创 建 基 于 Web 的 讨 论 论 坛 和 邮 件 列 表 ;6) 为 站 点 添 加 一 个 商 店 和 购 物 车 ;7) 优 化 MySQL 数 据 库 ;8) 优 化 Apache 服 务 器 性 能 ;9) 限 制 对 应 用 程 序 的 访 问 ;10) 设 置 安 全 的 Web 服 务 器 。网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 86/87


封 底PHP 代 码网 站 :http://www.phpchina.com 投 稿 :phper@phpchina.com 《PHPer》 87/87

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!