分享学习心得,记录学习笔记
文章:44   访问:119696
今天是:
2020年02月23日 星期日
  >   文章列表   >   文章详情
  1. <?php
  2. // +-------------------------------------------
  3. // | 指定项目路径,提取全部代码到指定文件中
  4. // +-------------------------------------------
  5. $request_method = $_SERVER['REQUEST_METHOD'];
  6. if ($request_method == 'POST') {
  7. // 需要的文件类型
  8. $type_you_want = $_POST['extension'] ? trim($_POST['extension'], ',') : '';
  9. // 项目目录
  10. $project_path = $_POST['project'];
  11. // 保存代码的文件
  12. $file_code = $_POST['filecode'];
  13. // 需要代码行数
  14. $codeline = $_POST['codeline'] ?: 0;
  15. // 永不超时
  16. set_time_limit(0);
  17. // 浏览器关闭,程序不终止
  18. ignore_user_abort(true);
  19. // 参数校验
  20. if (empty($type_you_want) || empty($project_path) || empty($type_you_want)) {
  21. $err = '前三个参数均不能为空';
  22. $html_error = <<<EOF
  23. <script>alert('$err');self.location='';</script>
  24. EOF;
  25. print_r($html_error);
  26. die();
  27. }
  28. $type_you_want = false != strpos($type_you_want, ',') ? explode(',', $type_you_want) : [$type_you_want];
  29. // 合并代码
  30. new mergeCode($project_path, $type_you_want, $file_code, $codeline);
  31. } else {
  32. $html = <<<EOF
  33. <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>合并代码</title><style>.title {margin: 30px auto;text-align: center;}.content {width: 600px;height: 322px;margin: 20px auto auto auto;background-color: #eeeeee;}.div-form {width: 560px;height: 280px;background-color: #fff;border-radius: 10px;border: dotted 1px;padding: 20px 20px;}.input-item {width: 500px;height: 50px;margin-top: 10px;}.input-title {width: 110px;height: 50px;line-height: 50px;display: inline-block;text-align: right;}.input-item input {width: 370px;height: 30px;border: dotted 1px;border-radius: 5px;padding: 0 5px;}.div-submit {width: 560px;height: 50px;text-align: center;}.div-submit button {height: 30px;width: 80px;background: #19c6a6;border: 0;border-radius: 5px;margin: 10px auto;cursor: pointer;color: #fff;}.div-submit button:hover {background: #19a383;}</style></head><body><div><h1>提取项目代码到指定文件中</h1></div><div><div><form action="" method="post"><div><span>项目路径:</span><input type="text" name="project" placeholder="如:D:\app\program"></div><div><span>文件扩展名:</span><input type="text" name="extension" placeholder="如:h,m,php"></div><div><span>保存文件:</span><input type="text" name="filecode" placeholder="如:D:\code\allcode.txt"></div><div><span>代码行数:</span><input type="text" name="codeline" placeholder="不限制"></div><div><button>提交</button></div></form></div></div></body></html>
  34. EOF;
  35. print_r($html);
  36. die();
  37. }
  38. /**
  39. * 合并项目代码到指定文件中
  40. * Class mergeCode
  41. */
  42. class mergeCode
  43. {
  44. // 完成后,返回内容
  45. private $finished_html = <<<EOF
  46. <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>合并代码完成</title><style>.title {margin: 30px auto;text-align: center;}.title button {height: 30px;width: 80px;background: #19c6a6;border: 0;border-radius: 5px;margin: 10px auto;cursor: pointer;color: #fff;}.title button:hover {background: #19a383;}</style></head><body><div><h1>提取完成</h1><button onclick="self.location=''">点击返回</button></div></body></html>
  47. EOF;
  48. /**
  49. * mergeCode constructor.
  50. * @param string $projectPath 项目路径
  51. * @param array $type_you_want 文件扩展名集合
  52. * @param string $file_code 存储最终代码的文件完整路径
  53. * @param int $codeline 总代码行数
  54. */
  55. public function __construct($projectPath, $type_you_want, $file_code, $codeline)
  56. {
  57. if (!defined('DS')) define('DS', DIRECTORY_SEPARATOR);
  58. $this->type_you_want = $type_you_want;
  59. $this->file_code = $file_code;
  60. $this->codeline = $codeline;
  61. if (!file_exists($file_code)) {
  62. @$fp = fopen($file_code, "w") or $this->throwError('存储代码的文件路径有误!');
  63. fwrite($fp, '');
  64. fclose($fp);
  65. }
  66. $this->readCodeForEach($projectPath);
  67. print_r($this->finished_html);
  68. die();
  69. }
  70. /**
  71. * 提取代码
  72. * @param string $projectPath 文件路径
  73. */
  74. private function readCodeForEach($projectPath)
  75. {
  76. if (is_dir($projectPath)) {
  77. if ($handle = opendir($projectPath)) {
  78. while (false !== ($item = readdir($handle))) {
  79. if ($item != '.' && $item != '..') {
  80. // 当前项目是文件夹则进入下一层
  81. if (is_dir($projectPath . DS . $item)) {
  82. $Path = $projectPath . DS . $item;
  83. $this->readCodeForEach($Path);
  84. } else {
  85. // 当前项目扩展名是需要的,则读取并保存
  86. if (in_array($this->getExtends($item), $this->type_you_want)) {
  87. $Path = $projectPath . DS . $item;
  88. // 读取存储综合代码的文件
  89. $code_data = file_get_contents($this->file_code);
  90. // 当前的这个代码
  91. $current_data = file_get_contents($Path);
  92. // 检查行数是否满足
  93. $this->checkLine();
  94. // 打开存储综合代码的文件
  95. $fp = fopen($this->file_code, "w");
  96. // 写入合并的文件数据
  97. fwrite($fp, $code_data . "\r" . $current_data);
  98. fclose($fp);
  99. // 检查文件是否存在
  100. if (!file_exists($this->file_code)) {
  101. $this->throwError('保存文件失败');
  102. }
  103. }
  104. }
  105. }
  106. }
  107. closedir($handle);
  108. }
  109. }
  110. }
  111. /**
  112. * 获取文件扩展名
  113. * @param string $fileName 文件名
  114. * @return string
  115. */
  116. private function getExtends($fileName)
  117. {
  118. $nameArr = explode('.', $fileName);
  119. return end($nameArr);
  120. }
  121. /**
  122. * 检查汇总的代码,判断是否足够行数
  123. */
  124. private function checkLine()
  125. {
  126. if ($this->codeline == 0) return true;
  127. $count_line = 0;
  128. if ($fc = fopen($this->file_code, 'r')) {
  129. // 判断是否到了文件底部
  130. while (!feof($fc)) {
  131. if (fgets($fc)) $count_line++;
  132. }
  133. }
  134. // 行数足够了,就结束
  135. if ($count_line > $this->codeline) {
  136. print_r($this->finished_html);
  137. die();
  138. }
  139. return true;
  140. }
  141. /**
  142. * 抛出错误
  143. * @param $msg
  144. */
  145. private function throwError($msg)
  146. {
  147. $error_html = <<<EOF
  148. <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>出错了!</title><style>.title {margin: 30px auto;text-align: center;}.title button {height: 30px;width: 80px;background: #19c6a6;border: 0;border-radius: 5px;margin: 10px auto;cursor: pointer;color: #fff;}.title button:hover {background: #19a383;}</style></head><body><div><h1>$msg</h1><button onclick="self.location=''">点击返回</button></div></body></html>
  149. EOF;
  150. print_r($error_html);
  151. die();
  152. }
  153. }

友情链接 doywb

2018-2019 Copyright© 米灵尔 小熊 豫ICP备15007436号-1

豫公网安备 41152302000146号