1. <?php
  2. /**
  3. * Mongodb 基本操作API,支持基本类似关系统型数据库的操作接口
  4. *
  5. * @version 1.0
  6. * [说明]
  7. *
  8. * 1:该版本API实现了 Mongodb 中最基本的插入/修改/查询/删除操作的封装
  9. * 2:其它更高级的操作可通过 $this->getMongo() 得到原生的对象,更多API请自行查阅 Mongo PHP手册,后续版本将会对增加更多的原生API封装
  10. * 3:该类所有API接口中的 $query 查询参数的使用请以下有关 [查询条件说明文档]
  11. * 4: 如果要存储中文字符,则一定要使用 utf8 的编码.
  12. * 5:有了本类接口基本可以按关系型数据库的概念完成Mongodb的大部分开发操作。
  13. *
  14. * [查询条件说明文档]
  15. *
  16. * 参数:array('id'=>1)
  17. * 等同:where id=1
  18. *
  19. * 参数:array('id'=>1,'num'=>10)
  20. * 等同:where id=1 and num=10
  21. *
  22. * 参数:array('id'=>array($mongo->cmd('>')=>5))
  23. * 等同:where id>5
  24. *
  25. * 参数:array('id'=>array($mongo->cmd('!=')=>5))
  26. * 等同:where id!=5
  27. *
  28. * 参数:array('id'=>array($mongo->cmd('>')=>5, $mongo->cmd('<')=>10))
  29. * 等同:where id>5 and id<10
  30. *
  31. * 参数:array('id'=>array($mongo->cmd('in')=>array(2,5,6)))
  32. * 等同:where id in (2,5,6)
  33. *
  34. * 参数:array('id'=>array($mongo->cmd('%')=>array(2,1)))
  35. * 等同:where id % 2 = 1
  36. *
  37. * 参数:array($mongo->cmd('or') => array( array('id'=>array($mongo->cmd('>')=>5)), array('id'=>array($mongo->cmd('<')=>10)) ) )
  38. * 等同:where id>5 or id<10
  39. *
    * 参数:array('username' => new mongoRegex("/yhp.*/"))
    * 等同 where username like "%yhp%"
    **/
  1. class Library_Mongodb {
  2. /**
  3. * Mongodb 对象句柄
  4. *
  5. * @var object Mongo
  6. */
  7. private $_mongo = null;
  8. /**
  9. * 当前选择的数据库
  10. *
  11. * @var object MongoDB
  12. */
  13. private $_db = null;
  14. /**
  15. * 修改器命令前缀
  16. *
  17. * @var string
  18. */
  19. private $_cmd = '$';
  20. /**
  21. * 调试模式 TRUE 打开 FALSE 关闭
  22. * @var boolean
  23. */
  24. const DEBUG = TRUE;
  25. /**
  26. * 查询条件映射关系
  27. *
  28. * @var array
  29. */
  30. private $_condMap = array(
  31. '<' => 'lt', // id > 1
  32. '<=' => 'lte', // id <= 10
  33. '>' => 'gt', // id > 5
  34. '>=' => 'gte', // id >= 4
  35. '!=' => 'ne', // id != 4
  36. '%' => 'mod', // id % 4 = 0
  37. 'in' => 'in', // id in (1,2,3,4)
  38. 'notin' => 'nin',// id not in (1,2,3,4)
  39. 'or' => 'or', // id=1 or id=2
  40. 'not' => 'not', // !(id=1)
  41. );
  42. /**
  43. * 构造函数
  44. *
  45. * @param array $config 服务器配置,默认为:
  46. * array(
  47. * 'host'=>'localhost', // 主机名或IP地址
  48. * 'port'=>27017, // 端口
  49. * 'cmd'=>'$', // 修改器命令前缀
  50. * )
  51. */
  52. public function __construct($config = array('host' => 'xxx', 'port' => 27017, 'username' => 'xxx', 'password' => 'xxx', 'db' => 'xxx', 'cmd' => '$')){
  53. $server = sprintf("mongodb://%s:%s@%s:%s/%s", $config['username'], $config['password'], $config['host'], $config['port'], $config['db']);
  54. // echo "connect\n";
  55. try {
  56. $this->_mongo = new MongoClient($server, array('connect'=>true));// 立即连接
  57. }catch (MongoConnectionException $e){
  58. if(self::DEBUG) {
  59. echo $e->getMessage();
  60. }
  61. return false;
  62. }
  63. $this->selectDB($config['db']);
  64. // 命令前缀
  65. if(!isset($config['cmd'])){
  66. $this->_cmd = ini_get('mongo.cmd');
  67. if($this->_cmd == ''){
  68. $this->_cmd = '$';
  69. }
  70. }
  71. }
  72. /* ==================================== 基本操作接口API ================================= */
  73. /**
  74. * 向集合(表)中插入新文档
  75. *
  76. * 说明:
  77. * 1:类似mysql中的: insert into $colName set id=1,name='name1';
  78. *
  79. * @param string $colName 集合名
  80. * @param array $sets 数据,如: array('id'=>1,'name'=>'name1')
  81. * @param boolean $safe 是否安全操作 false:不等待服务器的响应直接返回 true:等待服务器的响应(数据非常重要时推荐)
  82. * @param boolean $fsync 操作后是否立即更新到碰盘,默认情况下由服务器决定
  83. *
  84. * @return boolean
  85. */
  86. public function insert($colName, $sets, $safe=false, $fsync=false){
  87. $col = $this->_getCol($colName);
  88. try {
  89. $col->insert($sets,array('w'=>$safe,'fsync'=>$fsync));
  90. return true;
  91. }catch (MongoCursorException $e){
  92. return false;
  93. }
  94. }
  95. /**
  96. * 保存文档
  97. *
  98. * 说明:
  99. * 1:如果 $sets 中有字段 "_id" 的话,则更新对应的文档;否则插入新文档
  100. *
  101. * @param string $colName 集合名
  102. * @param array $sets 数据,如: array('id'=>1,'name'=>'name1')
  103. * @param boolean $safe 是否安全操作 false:不等待服务器的响应直接返回 true:等待服务器的响应(数据非常重要时推荐)
  104. * @param boolean $fsync 操作后是否立即更新到碰盘,默认情况下由服务器决定
  105. *
  106. * @return boolean
  107. */
  108. public function save($colName, $sets, $safe=false, $fsync=false){
  109. // 处理 '_id' 字段
  110. $sets = $this->_parseId($sets);
  111. $ret = $this->_getCol($colName)->save($sets,array('w'=>$safe,'fsync'=>$fsync));
  112. return $ret;
  113. }
  114. /**
  115. * 删除集合中的文档记录
  116. *
  117. * 说明:
  118. * 1:类似mysql中的: delete from $colName where id=1;
  119. *
  120. * @param string $colName 集合名
  121. * @param array $query 查询条件,如果为空数组的话,则会删除所有记录.具体请看 [查询条件说明文档]
  122. * @param boolean $delAll 是否删除所以条例查询的记录,默认为 true,当为 false是,类似效果 delete from tab where id=1 limit 1;
  123. * @param boolean $safe 是否安全操作 false:不等待服务器的响应直接返回 true:等待服务器的响应(数据非常重要时推荐)
  124. * @param boolean $fsync 操作后是否立即更新到碰盘,默认情况下由服务器决定
  125. *
  126. * @return boolean
  127. */
  128. public function delete($colName,$query=array(),$delAll=true,$safe=false,$fsync=false){
  129. // 自动处理 '_id' 字段
  130. $query = $this->_parseId($query);
  131. // 删除选项
  132. $options = array(
  133. 'justOne' => !$delAll,
  134. 'w' => $safe,
  135. 'fsync' => $fsync,
  136. );
  137. $col = $this->_getCol($colName);
  138. return $col->remove($query,$options);
  139. }
  140. /**
  141. * 删除整个集合
  142. *
  143. * 说明:
  144. * 1:集合中的索引也会被删除
  145. *
  146. * @param string $colName 集合名
  147. *
  148. * @return array
  149. */
  150. public function dropCol($colName){
  151. return $this->_getCol($colName)->drop();
  152. }
  153. /**
  154. * 更新集合文档记录
  155. *
  156. * 说明:
  157. * 1:类似mysql中的: update $colName set name='mongo' where id=10;
  158. *
  159. * @param string $colName 集合名
  160. * @param array $newDoc 要更新的文档记录
  161. * @param array $query 查询条件,如果为空数组则更新所有记录.具体请看 [查询条件说明文档]
  162. * @param string $option 操作选项,可选择项如下;
  163. *
  164. * 'set':只修改指定的字段(默认值,如果这个键不存在,则创建它。存在则更新).
  165. * 示例: update('user', array('name'=>'mongo'), array('id'=>10));
  166. * 类似: update user set name='mongo' where id=10;
  167. *
  168. * 'inc':将指定的字段累加/减(如果值为负数则是相减,不存在键则创建。字段类型一定要是数字)
  169. * 示例:update('user', array('num'=>1), array('id'=>10), 'inc');
  170. * 类似: update user set num=num+1 where id=10;
  171. *
  172. * 'push':将文档添加到指定键中(数组),如果键不存在则会自动创建,存在则添加到该键的尾端。
  173. * 示例:update('user', array('comm'=>array('commid'=>1,'title'=>'title1')), array('id'=>1), 'push');
  174. * 解说:为 id=1 的记录添加一个 comm 的评论字段,该字段对应一个 array('commid'=>1,'title'=>'title1') 的新文档。
  175. *
  176. * 'pop':将指定键中的文档删除(数组)
  177. * 示例:update('user', array('comm'=>array('commid'=>1)), array('id'=>1), 'pop');
  178. * 解说:删除 id=1 的记录中 comm 对应的文档集合中 'commid'=>1 对应的文档.
  179. *
  180. * 'unset':在文档中删除指定的键
  181. * 示例:update('user', array('name'=>1), array('id'=>1), 'unset');
  182. * 解说: 将 user 集合中将 id=1 对应的文档中的 name 字段删除
  183. *
  184. * 'pull':删除文档中匹配其值的键
  185. * 示例:update('user', array('name'=>'youname'), array('id'=>1), 'pull');
  186. * 解说:将 user 集合中将 id=1 对应的文档中的 name='youname' 的字段删除
  187. *
  188. * 'addToSet':如果值不存在就添加(避免重复添加)
  189. * 示例:update('user', array('names'=>'youname'), array('id'=>1), 'addToSet');
  190. * 解说:向 user 集合中 id=1 对应的文档中的 names 字段添加 'youname' 这个值(不存在时才添加)
  191. *
  192. * 'replace':用 $newDoc 新文档替换 $query 所找到的文档
  193. * 示例:update('user', array('newid'=>1,'newnames'=>'name1'), array('id'=>1), 'replace');
  194. * 解说:将 user 集合中 id=1 对应的文档用 array('newid'=>1,'newnames'=>'name1') 的新文档替换
  195. *
  196. * @param boolean $upAll 是否更新找到的所有记录
  197. * @param boolean $upsert 如果查询条件不存在时,是否以查询条件和要更新的字段一起新建一个集合
  198. * @param boolean $safe 是否安全删除 false:不等待服务器的响应直接返回 true:等待服务器的响应(数据非常重要时推荐)
  199. * @param boolean $fsync 操作后是否立即更新到碰盘,默认情况下由服务器决定
  200. *
  201. * @return boolean
  202. */
  203. public function update($colName,$newDoc,$query=array(),$option='set',$upAll=true,$upsert=false,$safe=false,$fsync=false){
  204. // 自动处理 '_id' 字段
  205. $query = $this->_parseId($query);
  206. // 得到集合
  207. $col = $this->_getCol($colName);
  208. // 重新组合新文档
  209. if($option != 'replace'){
  210. $newDoc = array($this->cmd($option) => $newDoc);
  211. }
  212. // 更新条件
  213. $options = array(
  214. 'upsert' => $upsert,
  215. 'multiple' => $upAll,
  216. 'w' => $safe,
  217. 'fsync' => $fsync,
  218. );
  219. return $col->update($query,$newDoc,$options);
  220. }
  221. /**
  222. * 查询文档集,返回二维数组
  223. *
  224. * 说明:
  225. * 1:类似mysql中的 select * from table
  226. *
  227. * 示例:select('user');
  228. * 类似:select * from user;
  229. *
  230. * 示例:select('user',array('id','name'));
  231. * 类似:select id,name from user;
  232. *
  233. * 示例:select('user',array('id','name'),array('id'=>1));
  234. * 类似:select id,name from user where id=1;
  235. *
  236. * 示例:select('user',array('id','name'),array('id'=>1),array('num'=>1));
  237. * 类似:select id,name from user where id=1 order by num asc;
  238. *
  239. * 示例:select('user',array('id','name'),array('id'=>1),array('num'=>1),10);
  240. * 类似:select id,name from user where id=1 order by num asc limit 10;
  241. *
  242. * 示例:select('user',array('id','name'),array('id'=>1),array('num'=>1),10,2);
  243. * 类似:select id,name from user where id=1 order by num asc limit 2,10;
  244. *
  245. *
  246. *
  247. * @param string $colName 集合名
  248. * @param array $query 查询条件,具体请看 [查询条件说明文档]
  249. * @param array $fields 结果集返回的字段, array():表示返回所有字段 array('id','name'):表示只返回字段 "id,name"
  250. * @param array $sort 排序字段, array('id'=>1):表示按id字段升序 array('id'=>-1):表示按id字段降序 array('id'=>1, 'age'=>-1):表示按id升序后再按age降序
  251. * @param int $limit 取多少条记录
  252. * @param int $skip 跳过多少条(从多少条开始)
  253. *
  254. * @return array
  255. */
  256. public function select($colName,$query=array(),$fields=array(),$sort=array(),$limit=0,$skip=0){
  257. // 得到集合
  258. $col = $this->_getCol($colName);
  259. // 自动处理 '_id' 字段
  260. $query = $this->_parseId($query);
  261. // 结果集偏历
  262. $cursor = $col->find($query,$fields);
  263. // 排序
  264. if($sort){
  265. $cursor->sort($sort);
  266. }
  267. // 跳过记录数
  268. if($skip > 0){
  269. $cursor->skip($skip);
  270. }
  271. // 取多少行记录
  272. if($limit > 0){
  273. $cursor->limit($limit);
  274. }
  275. $result = array();
  276. foreach($cursor as $row){
  277. $result[] = $this->_parseArr($row);
  278. }
  279. return $result;
  280. }
  281. /**
  282. * 统计文档记录数
  283. *
  284. * @param string $colName 集合名
  285. * @param array $query 查询条件,具体请看 [查询条件说明文档]
  286. * @param int $limit 取多少条记录
  287. * @param int $skip 跳过多少条
  288. * @return unknown
  289. */
  290. public function count($colName,$query=array(),$limit=0,$skip=0){
  291. return $this->_getCol($colName)->count($query,$limit,$skip);
  292. }
  293. /**
  294. * 返回集合中的一条记录(一维数组)
  295. *
  296. * @param string $colName 集合名
  297. * @param array $query 查询条件,具体请看 [查询条件说明文档]
  298. * @param array $fields 结果集返回的字段, array():表示返回所有字段 array('id','name'):表示只返回字段 "id,name"
  299. *
  300. * @return array
  301. */
  302. public function fetchRow($colName,$query=array(), $fields=array()){
  303. // 得到集合名
  304. $col = $this->_getCol($colName);
  305. // 自动处理 '_id' 字段
  306. $query = $this->_parseId($query);
  307. // 处理结果集
  308. return $this->_parseArr($col->findOne($query,$fields));
  309. }
  310. /**
  311. * 返回符合条件的文档中字段的值
  312. *
  313. * @param string $colName 集合名
  314. * @param array $query 查询条件,具体请看 [查询条件说明文档]
  315. * @param string $fields 要取其值的字段,默认为 "_id" 字段,类似mysql中的自增主键
  316. *
  317. * @return mixed
  318. */
  319. public function fetchOne($colName,$query=array(), $fields='_id'){
  320. $ret = $this->fetchRow($colName,$query,array($fields));
  321. return isset($ret[$fields]) ? $ret[$fields] : false;
  322. }
  323. /**
  324. * 返回查询文档集合集中指定字段的值(一维数组)
  325. *
  326. * @param string $colName 集合名
  327. * @param array $query 查询条件,具体请看 [查询条件说明文档]
  328. * @param string $fields 要取其值的字段,默认为 "_id" 字段,类似mysql中的自增主键
  329. *
  330. * @return array
  331. */
  332. public function fetchCol($colName,$query=array(), $fields='_id'){
  333. $result = array();
  334. $list = $this->select($colName,$query,array($fields));
  335. foreach ($list as $row){
  336. $result[] = $row[$fields];
  337. }
  338. return $result;
  339. }
  340. /**
  341. * 返回指定下标的查询文档集合(二维数组)
  342. *
  343. * @param string $colName 集合名
  344. * @param array $query 查询条件,具体请看 [查询条件说明文档]
  345. * @param string $fields 要取其值的字段,默认为 "_id" 字段,类似mysql中的自增主键
  346. *
  347. * @return array
  348. */
  349. public function fetchAssoc($colName,$query=array(), $fields='_id'){
  350. $result = array();
  351. $list = $this->select($colName,$query);
  352. foreach ($list as $row){
  353. $key = $row[$fields];
  354. $result[][$key] = $row;
  355. }
  356. return $result;
  357. }
  358. /* ==================================== 辅助操作接口API ================================= */
  359. /**
  360. * 返回命令或命令前缀
  361. *
  362. * @param string $option 命令,如果为空时则返回命令前缀
  363. *
  364. * @return string
  365. */
  366. public function cmd($option=''){
  367. // 只返回命令前缀
  368. if($option == ''){
  369. return $this->_cmd;
  370. }
  371. // 如果是操作符
  372. if(isset($this->_condMap[$option])){
  373. $option = $this->_condMap[$option];
  374. }
  375. return $this->_cmd.$option;
  376. }
  377. /**
  378. * 选择或创建数据库(注意:新创建的数据库如果在关闭连接前没有写入数据将会被自动删除)
  379. *
  380. * @param string $dbname 数据库名
  381. */
  382. public function selectDB($dbname){
  383. $this->_db = $this->_mongo->selectDB($dbname);
  384. }
  385. /**
  386. * 得到所有的数据库
  387. *
  388. * @param boolean $onlyName 是否只返回数据库名的数组
  389. * @return array
  390. */
  391. public function allDB($onlyName=false){
  392. $ary = $this->_mongo->listDBs();
  393. if($onlyName){
  394. $ret = array();
  395. foreach ($ary['databases'] as $row){
  396. $ret[] = $row['name'];
  397. }
  398. return $ret;
  399. }else{
  400. return $ary;
  401. }
  402. }
  403. /**
  404. * 删除数据库
  405. *
  406. * @return array
  407. */
  408. public function dropDB($dbname){
  409. return $this->_mongo->dropDB($dbname);
  410. }
  411. /**
  412. * 关闭连接
  413. *
  414. */
  415. public function close(){
  416. $this->_mongo->close();
  417. }
  418. /**
  419. * 得到 Mongo 原生对象,进行其它更高级的操作,详细请看PHP手册
  420. *
  421. */
  422. public function getMongo(){
  423. return $this->_mongo;
  424. }
  425. /**
  426. * 返回最后的错误信息
  427. *
  428. * @return array
  429. */
  430. public function getError(){
  431. return $this->_db->lastError();
  432. }
  433. /* ======================= 以下为私有方法 ====================== */
  434. // 解析数据组中的'_id'字段(如果有的话)
  435. private function _parseId($arr){
  436. if(isset($arr['_id'])){
  437. $arr['_id'] = new MongoId($arr['_id']);
  438. }
  439. return $arr;
  440. }
  441. // 得到集合对象
  442. private function _getCol($colName){
  443. return $this->_db->selectCollection($colName);
  444. }
  445. // 解析数组中的"_id"并且返回
  446. private function _parseArr($arr){
  447. if(!empty($arr)) {
  448. $ret = (array)$arr['_id'];
  449. $arr['_id'] = $ret['$id'];
  450. }
  451. return $arr;
  452. }
  453. }//End Class
  454. ?>

分享一个Mongodb PHP封装类的更多相关文章

  1. Mongodb PHP封装类

    分享一个Mongodb PHP封装类 <?php /** * Mongodb 基本操作API,支持基本类似关系统型数据库的操作接口 * * @version 1.0 * [说明] * * 1:该 ...

  2. 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)

    分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...

  3. 分享一个MySQL分库分表备份脚本(原)

    分享一个MySQL分库备份脚本(原) 开发思路: 1.路径:规定备份到什么位置,把路径(先判断是否存在,不存在创建一个目录)先定义好,我的路径:/mysql/backup,每个备份用压缩提升效率,带上 ...

  4. 分享一个与ABP配套使用的代码生成器源码

    点这里进入ABP系列文章总目录 分享一个与ABP配套使用的代码生成器源码 真对不起关注我博客的朋友, 因最近工作很忙, 很久没有更新博客了.以前答应把自用的代码生成器源码共享出来, 也一直没有时间整理 ...

  5. 分享一个常用Adb命令

    分享一个常用Adb命令 首先 首先感谢@xuxu的常用adb命令,收益良多,但是已经不能满足于我,所以补充了下. 再者 好久没发帖了,最近论坛老司机们都在讨论/总结,我就用这个干货回报吧. 最后 基于 ...

  6. 福利到~分享一个基于jquery的智能提示控件intellSeach.js

    一.需求 我们经常会遇到[站内搜索]的需求,为了提高用户体验,我们希望能做到像百度那样的即时智能提示.例如:某公司人事管理系统,想搜索李XX,只要输入“李”,系统自然会提示一些姓李的员工,这样方便用户 ...

  7. 分享一个oraclehelper

    分享一个拿即用的oraclehelper 首先要引用本机中的oralce access,如果是64位的话,也必须是64位运行,不然会报连接为空connection 等于null. using Orac ...

  8. 分享一个ruby网站 | 菜鸟教程

    http://www.runoob.com/ruby/ruby-tutorial.html 分享一个ruby网站.

  9. 分享一个批量导出当前实例下的所有linkedserver脚本

    分享一个批量导出当前实例下的所有linkedserver脚本 很多时候,我们都需要导出实例下面的登录用户,job,linkedserver等等 导出job比较复杂,下午写了一个脚本把所有的linked ...

随机推荐

  1. C#与数据库访问技术总结(十七)

    使用DataSet对象访问数据库 当对DataSet对象进行操作时,DataSet对象会产生副本,所以对DataSet里的数据进行编辑操作不会直接对数据库产生影响,而是将DataRow的状态设置为ad ...

  2. Web的26项基本概念和技术

    ---恢复内容开始--- Web开发是比较费神的,需要掌握很多很多的东西,特别是从事前端开发的朋友,需要通十行才行.今天,本文向初学者介绍一些Web开发中的基本概念和用到的技术,从A到Z总共26项,每 ...

  3. JavaScript的for循环编写九九乘法表

    for(var i = 1; i <= 10; i++) { for(var j = 1; j <= i; j++) { document.writeln(i + '*' + j + '= ...

  4. C# winform的WebBrowser非常规编程(强烈推荐)

    本文章被今日头条推荐 1.在WebBrowser中实现抓取301和302协议 在WebBrowser中抓取301和302协议目前官方提供的组件远远不够,需要借助HttpMonitor.dll.这个组件 ...

  5. python中os和sys模块的详解

    平时在工作中经常会用到os模块和sys模块的一些特性,下面是这些特性的一些相关解释,希望对大家有所帮助 os模块 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os. ...

  6. Android显示等宽图片的问题

    安卓开发常遇到一个问题,就是在listView里面,在不知道图片宽高的前提下,另图片布满屏幕(图片宽度等于屏幕宽度,高度自适应).在listView中,只是设置scaleType,imageView. ...

  7. Windows共享内存示例

    共享内存主要是通过映射机制实现的. Windows 下进程的地址空间在逻辑上是相互隔离的,但在物理上却是重叠的.所谓的重叠是指同一块内存区域可能被多个进程同时使用.当调用 CreateFileMapp ...

  8. CentOS下httpd下php 连接mysql 本机可以,127.0.0.1不能访问

    你看到的这个文章来自于http://www.cnblogs.com/ayanmw php代码很简单: $server="127.0.0.1"; println("Begi ...

  9. 安装redis监控

    在修改登录中心的时候,数据存储在redis里面,需要对redis进行监控,使用的是Redis-Live 参考文章: http://www.nkrode.com/article/real-time-da ...

  10. apache 80端口部属多站点配置

    1.在httpd.conf文件里启用虚拟主机功能,即去掉下面配置项前面的# #LoadModule vhost_alias_module modules/mod_vhost_alias.so 2..在 ...