IndexAction.class.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Fanwe 方维直播系统
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2010 http://www.fanwe.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. //系统安装
  8. class IndexAction extends Action{
  9. private function getRealPath()
  10. {
  11. return APP_ROOT_PATH;
  12. }
  13. private $install_lock;
  14. public function __construct()
  15. {
  16. parent::__construct();
  17. $this->install_lock = $this->getRealPath()."/public/install.lock";
  18. if(file_exists($this->install_lock))
  19. {
  20. $this->assign("jumpUrl",__ROOT__."/m.php");
  21. $this->error("系统已经安装");
  22. }
  23. }
  24. public function index(){
  25. {
  26. $rs = $this->checkEnv(); //检测系统环境
  27. $this->assign("result",$rs);
  28. $this->display();//输出检测结果
  29. }
  30. }
  31. public function database()
  32. {
  33. //系统安装
  34. if(file_exists($this->install_lock))
  35. {
  36. $this->assign("jumpUrl",__ROOT__."/m.php");
  37. $this->error("系统已经安装");
  38. }
  39. else
  40. {
  41. $rs = $this->checkEnv(); //检测系统环境
  42. if($rs['status'])
  43. {
  44. $this->display();
  45. }
  46. else
  47. {
  48. $this->assign("result",$rs);
  49. $this->display("index");//输出检测结果
  50. }
  51. }
  52. }
  53. public function install()
  54. {
  55. $return_rs = array(
  56. 'msg'=>'安装成功',
  57. 'status'=>true,
  58. ); //用于返回的数据
  59. $db_config['DB_HOST'] = $_REQUEST['DB_HOST'];
  60. $db_config['DB_NAME'] = $_REQUEST['DB_NAME'];
  61. $db_config['DB_USER'] = $_REQUEST['DB_USER'];
  62. $db_config['DB_PWD'] = $_REQUEST['DB_PWD'];
  63. $db_config['DB_PORT'] = $_REQUEST['DB_PORT'];
  64. $db_config['DB_PREFIX'] = $_REQUEST['DB_PREFIX'];
  65. $demo_data = intval($_REQUEST['DEMO_DATA']);
  66. $connect = @mysql_connect($db_config['DB_HOST'].":".$db_config['DB_PORT'],$db_config['DB_USER'],$db_config['DB_PWD']);
  67. if(mysql_error()=="")
  68. {
  69. $rs = mysql_select_db($db_config['DB_NAME'],$connect);
  70. if($rs)
  71. {
  72. $return_rs['status'] = true;
  73. }
  74. else
  75. {
  76. $db_rs = mysql_query("create database ".$db_config['DB_NAME']." DEFAULT CHARACTER SET utf8");
  77. if($db_rs)
  78. {
  79. $return_rs['status'] = true;
  80. }
  81. else
  82. {
  83. $return_rs['msg'] = "创建数据库失败";
  84. $return_rs['status'] = false;
  85. }
  86. }
  87. }
  88. else
  89. {
  90. $return_rs['msg'] = "连接数据库失败";
  91. $return_rs['status'] = false;
  92. }
  93. if($return_rs['status'])
  94. {
  95. //开始将$db_config写入配置
  96. $db_config_str = "<?php\r\n";
  97. $db_config_str .= "return array(\r\n";
  98. foreach($db_config as $key=>$v)
  99. {
  100. $db_config_str.="'".$key."'=>'".$v."',\r\n";
  101. }
  102. $db_config_str.=");\r\n";
  103. $db_config_str.="?>";
  104. @file_put_contents($this->getRealPath()."/public/db_config.php",$db_config_str);
  105. //开始执行安装脚本
  106. $msg = $this->restore($this->getRealPath()."/install/install_demo.sql",$db_config);
  107. //如果不要演示数据,执行清空SQL
  108. // if($demo_data==0)
  109. // {
  110. // $msg = $this->restore($this->getRealPath()."/install/truncate.sql",$db_config);
  111. // }
  112. ini_set("max_execution_time", 300);//服务器会在 60 秒后强行中止正在执行的程序
  113. //$this->redis_install($db_config);
  114. if(INVEST_TYPE>0){
  115. mysql_query("update ".$db_config['DB_PREFIX']."conf set value=".INVEST_TYPE." where name='INVEST_STATUS' ");
  116. }
  117. if($msg == "")
  118. {
  119. @file_put_contents($this->install_lock,"");
  120. $this->success($return_rs['msg'],1);
  121. }
  122. else
  123. {
  124. $this->error($msg,1);
  125. }
  126. }
  127. else
  128. {
  129. $this->error($return_rs['msg'],1);
  130. }
  131. }
  132. /*
  133. * REDIS 添加 会员 和 地区
  134. */
  135. private function redis_install($db_config){
  136. require $this->getRealPath().'/system/db/db.php';
  137. define('IS_DEBUG',false);
  138. define('SHOW_DEBUG',false);
  139. $mysql = new mysql_db($db_config['DB_HOST'], $db_config['DB_USER'], $db_config['DB_PWD'], $db_config['DB_NAME']);
  140. $user_list = $mysql->getAll("select * from ".$db_config['DB_PREFIX']."user");
  141. // var_dump($user_list);
  142. $list_array = $mysql->getAll("select r2.name as province_name
  143. from ".$db_config['DB_PREFIX']."region_conf r3
  144. LEFT JOIN ".$db_config['DB_PREFIX']."region_conf r2 on r2.id = r3.pid
  145. where r3.region_level = 3 GROUP BY province_name");
  146. $list =array();
  147. foreach($list_array as $k=>$v ){
  148. $list[] = $v['province_name'];
  149. }
  150. // var_dump($list);
  151. require_once $this->getRealPath()."/system/cache/Rediscache/Rediscache.php";
  152. $distribution_cfg = $GLOBALS['distribution_cfg'];
  153. if($distribution_cfg['CACHE_CLIENT']==''||$distribution_cfg['CACHE_PORT']==''){
  154. $this->error('redis 信息未配置',1);
  155. }
  156. if(count($user_list)){
  157. require $this->getRealPath().'/mapi/lib/redis/BaseRedisService.php';
  158. require $this->getRealPath().'/mapi/lib/redis/UserRedisService.php';
  159. $user_obj = new UserRedisService();
  160. $re = $user_obj->test_add_redis($user_list);
  161. $user_array = $user_obj->keys_searche('user:');
  162. if(count($user_array)!=count($user_list)){
  163. $this->error('redis 会员插入失败',1);
  164. }
  165. }
  166. }
  167. private function checkEnv()
  168. {
  169. $rs['status'] = 1;
  170. $rs['msg'] = "检测成功";
  171. if(substr(PHP_VERSION, 0, 3)<5.5){
  172. $rs['php_env'] = "本系统需要php5.5环境";
  173. $rs['status'] = 0;
  174. $rs['msg'] = "检测失败";
  175. }else{
  176. $rs['php_env'] = "php版本号:".PHP_VERSION;
  177. }
  178. if(extension_loaded('gd'))
  179. {
  180. $rs['gd_info'] = "通过验证";
  181. }
  182. else
  183. {
  184. $rs['gd_info'] = "本系统需要GD函数库的支持";
  185. $rs['status'] = 0;
  186. $rs['msg'] = "检测失败";
  187. }
  188. if(function_exists("mb_strlen")){
  189. $rs['mb_info'] = "通过验证";
  190. }
  191. else {
  192. $rs['mb_info'] = "需要开启MB_STRING函数库";
  193. $rs['status'] = 0;
  194. $rs['msg'] = "检测失败";
  195. }
  196. $dirs = C("DIRS_CHECK");
  197. foreach($dirs as $dir)
  198. {
  199. if($this->file_mode_info($this->getRealPath().$dir)<2)
  200. {
  201. //目录不可写
  202. $rs[$dir]=array();
  203. $rs[$dir]['msg'] = '不可写';
  204. $rs['status'] = 0;
  205. $rs['msg'] = "检测失败";
  206. if(is_dir($this->getRealPath().$dir)){
  207. $rs[$dir]['file_type'] = 'dir';
  208. }else{
  209. $rs[$dir]['file_type'] = 'file';
  210. }
  211. }
  212. else
  213. {
  214. $rs[$dir]['msg'] = '可写';
  215. if(is_dir($this->getRealPath().$dir)){
  216. $rs[$dir]['file_type'] = 'dir';
  217. }else{
  218. $rs[$dir]['file_type'] = 'file';
  219. }
  220. }
  221. }
  222. return $rs;
  223. }
  224. /**
  225. * 文件或目录权限检查函数
  226. *
  227. * @access private
  228. * @param string $file_path 文件路径
  229. * @param bool $rename_prv 是否在检查修改权限时检查执行rename()函数的权限
  230. *
  231. * @return int 返回值的取值范围为{0 <= x <= 15},每个值表示的含义可由四位二进制数组合推出。
  232. * 返回值在二进制计数法中,四位由高到低分别代表
  233. * 可执行rename()函数权限、可对文件追加内容权限、可写入文件权限、可读取文件权限。
  234. */
  235. private function file_mode_info($file_path)
  236. {
  237. /* 如果不存在,则不可读、不可写、不可改 */
  238. if (!file_exists($file_path))
  239. {
  240. return false;
  241. }
  242. $mark = 0;
  243. if (strtoupper(substr(PHP_OS, 0, 3)) == 'WIN')
  244. {
  245. /* 测试文件 */
  246. $test_file = $file_path . '/cf_test.txt';
  247. /* 如果是目录 */
  248. if (is_dir($file_path))
  249. {
  250. /* 检查目录是否可读 */
  251. $dir = @opendir($file_path);
  252. if ($dir === false)
  253. {
  254. return $mark; //如果目录打开失败,直接返回目录不可修改、不可写、不可读
  255. }
  256. if (@readdir($dir) !== false)
  257. {
  258. $mark ^= 1; //目录可读 001,目录不可读 000
  259. }
  260. @closedir($dir);
  261. /* 检查目录是否可写 */
  262. $fp = @fopen($test_file, 'wb');
  263. if ($fp === false)
  264. {
  265. return $mark; //如果目录中的文件创建失败,返回不可写。
  266. }
  267. if (@fwrite($fp, 'directory access testing.') !== false)
  268. {
  269. $mark ^= 2; //目录可写可读011,目录可写不可读 010
  270. }
  271. @fclose($fp);
  272. @unlink($test_file);
  273. /* 检查目录是否可修改 */
  274. $fp = @fopen($test_file, 'ab+');
  275. if ($fp === false)
  276. {
  277. return $mark;
  278. }
  279. if (@fwrite($fp, "modify test.\r\n") !== false)
  280. {
  281. $mark ^= 4;
  282. }
  283. @fclose($fp);
  284. /* 检查目录下是否有执行rename()函数的权限 */
  285. if (@rename($test_file, $test_file) !== false)
  286. {
  287. $mark ^= 8;
  288. }
  289. @unlink($test_file);
  290. }
  291. /* 如果是文件 */
  292. elseif (is_file($file_path))
  293. {
  294. /* 以读方式打开 */
  295. $fp = @fopen($file_path, 'rb');
  296. if ($fp)
  297. {
  298. $mark ^= 1; //可读 001
  299. }
  300. @fclose($fp);
  301. /* 试着修改文件 */
  302. $fp = @fopen($file_path, 'ab+');
  303. if ($fp && @fwrite($fp, '') !== false)
  304. {
  305. $mark ^= 6; //可修改可写可读 111,不可修改可写可读011...
  306. }
  307. @fclose($fp);
  308. /* 检查目录下是否有执行rename()函数的权限 */
  309. if (@rename($test_file, $test_file) !== false)
  310. {
  311. $mark ^= 8;
  312. }
  313. }
  314. }
  315. else
  316. {
  317. if (@is_readable($file_path))
  318. {
  319. $mark ^= 1;
  320. }
  321. if (@is_writable($file_path))
  322. {
  323. $mark ^= 14;
  324. }
  325. }
  326. return $mark;
  327. }
  328. /**
  329. * 执行SQL脚本文件
  330. *
  331. * @param array $filelist
  332. * @return string
  333. */
  334. private function restore($file,$db_config)
  335. {
  336. set_time_limit(0);
  337. $db = Db::getInstance(array('dbms'=>'mysql','hostname'=>$db_config['DB_HOST'],'username'=>$db_config['DB_USER'],'password'=>$db_config['DB_PWD'],'hostport'=>$db_config['DB_PORT'],'database'=>$db_config['DB_NAME']));
  338. $sql = file_get_contents($file);
  339. $sql = $this->remove_comment($sql);
  340. $sql = trim($sql);
  341. $sql = str_replace("\r", '', $sql);
  342. $segmentSql = explode(";\n", $sql);
  343. foreach($segmentSql as $k=>$itemSql)
  344. {
  345. $itemSql = str_replace("%DB_PREFIX%",$db_config['DB_PREFIX'],$itemSql);
  346. $db->query($itemSql);
  347. }
  348. //开始写入配置文件
  349. $sys_configs = $db->query("select name,value from ".$db_config["DB_PREFIX"]."conf");
  350. $config_str = "<?php\n";
  351. $config_str .= "return array(\n";
  352. foreach($sys_configs as $k=>$v)
  353. {
  354. $config_str.="'".$v['name']."'=>'".addslashes($v['value'])."',\n";
  355. }
  356. $config_str.=");\n ?>";
  357. @file_put_contents($this->getRealPath()."/public/sys_config.php",$config_str);
  358. return "";
  359. }
  360. /**
  361. * 过滤SQL查询串中的注释。该方法只过滤SQL文件中独占一行或一块的那些注释。
  362. *
  363. * @access public
  364. * @param string $sql SQL查询串
  365. * @return string 返回已过滤掉注释的SQL查询串。
  366. */
  367. private function remove_comment($sql)
  368. {
  369. /* 删除SQL行注释,行注释不匹配换行符 */
  370. $sql = preg_replace('/^\s*(?:--|#).*/m', '', $sql);
  371. /* 删除SQL块注释,匹配换行符,且为非贪婪匹配 */
  372. //$sql = preg_replace('/^\s*\/\*(?:.|\n)*\*\//m', '', $sql);
  373. $sql = preg_replace('/^\s*\/\*.*?\*\//ms', '', $sql);
  374. return $sql;
  375. }
  376. }
  377. ?>