common.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 海豚PHP框架 [ DolphinPHP ]
  4. // +----------------------------------------------------------------------
  5. // | 版权所有 2016~2019 广东卓锐软件有限公司 [ http://www.zrthink.com ]
  6. // +----------------------------------------------------------------------
  7. // | 官方网站: http://dolphinphp.com
  8. // +----------------------------------------------------------------------
  9. use think\facade\Env;
  10. // 此函数文件来自OneThink
  11. /**
  12. * 系统环境检测
  13. * @return array 系统环境数据
  14. */
  15. function check_env(){
  16. $items = array(
  17. 'os' => array('操作系统', '不限制', '类Unix', PHP_OS, 'check'),
  18. 'php' => array('PHP版本', '5.6', '5.6+', PHP_VERSION, 'check'),
  19. 'upload' => array('附件上传', '不限制', '2M+', '未知', 'check'),
  20. 'gd' => array('GD库', '2.0', '2.0+', '未知', 'check'),
  21. 'disk' => array('磁盘空间', '100M', '不限制', '未知', 'check'),
  22. );
  23. // PHP环境检测
  24. if($items['php'][3] < $items['php'][1]){
  25. $items['php'][4] = 'times text-warning';
  26. session('error', true);
  27. }
  28. // 附件上传检测
  29. if(@ini_get('file_uploads'))
  30. $items['upload'][3] = ini_get('upload_max_filesize');
  31. // GD库检测
  32. $tmp = function_exists('gd_info') ? gd_info() : array();
  33. if(empty($tmp['GD Version'])){
  34. $items['gd'][3] = '未安装';
  35. $items['gd'][4] = 'times text-warning';
  36. session('error', true);
  37. } else {
  38. $items['gd'][3] = $tmp['GD Version'];
  39. }
  40. unset($tmp);
  41. // 磁盘空间检测
  42. if(function_exists('disk_free_space')) {
  43. $disk_size = floor(disk_free_space(Env::get('app_path')) / (1024*1024));
  44. $items['disk'][3] = $disk_size.'M';
  45. if ($disk_size < 100) {
  46. $items['disk'][4] = 'times text-warning';
  47. session('error', true);
  48. }
  49. }
  50. return $items;
  51. }
  52. /**
  53. * 目录,文件读写检测
  54. * @return array 检测数据
  55. */
  56. function check_dirfile(){
  57. $items = array(
  58. array('dir', '可写', 'check', '../application'),
  59. array('dir', '可写', 'check', '../config'),
  60. array('dir', '可写', 'check', '../data'),
  61. array('dir', '可写', 'check', '../export'),
  62. array('dir', '可写', 'check', '../packet'),
  63. array('dir', '可写', 'check', '../plugins'),
  64. array('dir', '可写', 'check', './static'),
  65. array('dir', '可写', 'check', './uploads'),
  66. array('dir', '可写', 'check', '../runtime'),
  67. array('dir', '可写', 'check', '../store'),
  68. );
  69. foreach ($items as &$val) {
  70. $item = INSTALL_APP_PATH . $val[3];
  71. if('dir' == $val[0]){
  72. if(!is_writable($item)) {
  73. if(is_dir($item)) {
  74. $val[1] = '可读';
  75. $val[2] = 'times text-warning';
  76. session('error', true);
  77. } else {
  78. $val[1] = '不存在';
  79. $val[2] = 'times text-warning';
  80. session('error', true);
  81. }
  82. }
  83. } else {
  84. if(file_exists($item)) {
  85. if(!is_writable($item)) {
  86. $val[1] = '不可写';
  87. $val[2] = 'times text-warning';
  88. session('error', true);
  89. }
  90. } else {
  91. if(!is_writable(dirname($item))) {
  92. $val[1] = '不存在';
  93. $val[2] = 'times text-warning';
  94. session('error', true);
  95. }
  96. }
  97. }
  98. }
  99. return $items;
  100. }
  101. /**
  102. * 函数检测
  103. * @return array 检测数据
  104. */
  105. function check_func(){
  106. $items = array(
  107. array('pdo','支持','check','类'),
  108. array('pdo_mysql','支持','check','模块'),
  109. array('fileinfo','支持','check','模块'),
  110. array('curl','支持','check','模块'),
  111. array('file_get_contents', '支持', 'check','函数'),
  112. array('mb_strlen', '支持', 'check','函数'),
  113. array('scandir', '支持', 'check','函数'),
  114. );
  115. foreach ($items as &$val) {
  116. if(('类'==$val[3] && !class_exists($val[0]))
  117. || ('模块'==$val[3] && !extension_loaded($val[0]))
  118. || ('函数'==$val[3] && !function_exists($val[0]))
  119. ){
  120. $val[1] = '不支持';
  121. $val[2] = 'times text-warning';
  122. session('error', true);
  123. }
  124. }
  125. return $items;
  126. }
  127. /**
  128. * 写入配置文件
  129. * @param $config
  130. * @return array 配置信息
  131. */
  132. function write_config($config){
  133. if(is_array($config)){
  134. //读取配置内容
  135. $conf = file_get_contents(Env::get('app_path') . 'install/data/database.tpl');
  136. // 替换配置项
  137. foreach ($config as $name => $value) {
  138. $conf = str_replace("[{$name}]", $value, $conf);
  139. }
  140. //写入应用配置文件
  141. if(file_put_contents(Env::get('config_path') . 'database.php', $conf)){
  142. show_msg('配置文件写入成功');
  143. } else {
  144. show_msg('配置文件写入失败!', 'error');
  145. session('error', true);
  146. }
  147. return '';
  148. }
  149. }
  150. /**
  151. * 创建数据表
  152. * @param $db 数据库连接资源
  153. * @param string $prefix 表前缀
  154. */
  155. function create_tables($db, $prefix = ''){
  156. // 读取SQL文件
  157. $sql = file_get_contents(Env::get('app_path') . 'install/data/dolphin.sql');
  158. $sql = str_replace("\r", "\n", $sql);
  159. $sql = explode(";\n", $sql);
  160. // 替换表前缀
  161. $orginal = config('original_table_prefix');
  162. $sql = str_replace(" `{$orginal}", " `{$prefix}", $sql);
  163. // 开始安装
  164. show_progress('0%');
  165. $all_table = config('install_table_total');
  166. $i = 1;
  167. foreach ($sql as $value) {
  168. $value = trim($value);
  169. if(empty($value)) continue;
  170. $msg = (int)($i/$all_table*100) . '%';
  171. if(false !== $db->execute($value)){
  172. show_progress($msg);
  173. } else {
  174. show_progress($msg, 'error');
  175. session('error', true);
  176. }
  177. $i++;
  178. }
  179. }
  180. /**
  181. * 更新数据表
  182. * @param $db 数据库连接资源
  183. * @param string $prefix 表前缀
  184. */
  185. function update_tables($db, $prefix = ''){
  186. //读取SQL文件
  187. $sql = file_get_contents(Env::get('app_path') . 'install/data/update.sql');
  188. $sql = str_replace("\r", "\n", $sql);
  189. $sql = explode(";\n", $sql);
  190. // 替换表前缀
  191. $sql = str_replace(" `dp_", " `{$prefix}", $sql);
  192. //开始安装
  193. show_progress('0%');
  194. $all_table = config('update_data_total');
  195. $i = 1;
  196. $msg = '';
  197. foreach ($sql as $value) {
  198. $value = trim($value);
  199. if(empty($value)) continue;
  200. if(substr($value, 0, 12) == 'CREATE TABLE') {
  201. $msg = (int)($i/$all_table*100) . '%';
  202. if(($db->execute($value)) === false){
  203. session('error', true);
  204. }
  205. } else {
  206. if(substr($value, 0, 8) == 'UPDATE `') {
  207. $msg = (int)($i/$all_table*100) . '%';
  208. } else if(substr($value, 0, 11) == 'ALTER TABLE'){
  209. $msg = (int)($i/$all_table*100) . '%';
  210. } else if(substr($value, 0, 11) == 'INSERT INTO'){
  211. $msg = (int)($i/$all_table*100) . '%';
  212. }
  213. if(($db->execute($value)) === false){
  214. session('error', true);
  215. }
  216. }
  217. if ($msg != '') {
  218. show_progress($msg);
  219. $i++;
  220. }
  221. }
  222. }
  223. /**
  224. * 及时显示提示信息
  225. * @param string $msg 提示信息
  226. * @param string $class 类名
  227. */
  228. function show_msg($msg, $class = ''){
  229. echo "<script type=\"text/javascript\">showmsg(\"{$msg}\", \"{$class}\")</script>";
  230. flush();
  231. ob_flush();
  232. }
  233. /**
  234. * 显示进度
  235. * @param $msg
  236. * @param string $class
  237. * @author 蔡伟明 <314013107@qq.com>
  238. */
  239. function show_progress($msg, $class = ''){
  240. echo "<script type=\"text/javascript\">show_progress(\"{$msg}\", \"{$class}\")</script>";
  241. flush();
  242. ob_flush();
  243. }