Parser.php 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <?php
  2. defined('BASEPATH') or exit('No direct script access allowed');
  3. class Parser extends CI_Controller
  4. {
  5. //TODO: Gestionar descarga de archivos por carpeta dia/hora
  6. //TODO: PARAMETRIZAR BBDD -> SI EXISTE UN PROCESO EN MARCHA, NO INICIAR SIGUIENTE DESCARGA, AVISAR
  7. protected $rutaDiaria = FCPATH . "DOWNLOADS/DAILY/";
  8. protected $rutaDiariaFecha = "";
  9. protected $rutaMensual = FCPATH . "DOWNLOADS/MONTH/";
  10. protected $enlaceAtom = "";
  11. public function __construct()
  12. {
  13. parent::__construct();
  14. $this->load->helper('file');
  15. $this->load->helper('xml');
  16. $this->load->library('parserfile');
  17. $this->load->model("Parser_model");
  18. }
  19. public function index()
  20. {
  21. $existCronRun = $this->Parser_model->existCronRun();
  22. if ($existCronRun['num_rows'] > 0) {
  23. if ($existCronRun['datos']->cron_ejecucion == 0) {
  24. $this->Parser_model->inicioParser();
  25. $resultSetPerfiles = $this->Parser_model->getUrlArchivos();
  26. foreach ($resultSetPerfiles['datos'] as $row) {
  27. $fechaCarpeta = date("Y-m-d_H-i-s");
  28. $rutaPerfil = $this->rutaDiaria . "/" . $row->prefijos_tablas;
  29. $this->newFolder($rutaPerfil);
  30. if ($this->newFolder($rutaPerfil . "/" . $fechaCarpeta)) {
  31. $this->rutaDiariaFecha = $rutaPerfil . "/" . $fechaCarpeta . "/";
  32. $this->downloadProcess($row->url_descarga);
  33. $this->parserfile->index($this->rutaDiariaFecha, $fechaCarpeta);
  34. }
  35. }
  36. } else {
  37. echo "EXISTE UN CRON EN MARCHA.";
  38. }
  39. } else {
  40. echo "No existe parametro que iniciar.";
  41. }
  42. $this->Parser_model->stopParser();
  43. }
  44. private function downloadProcess($urlXML)
  45. {
  46. $fileName = basename($urlXML);
  47. $this->downloadFile($fileName, $urlXML, $this->rutaDiariaFecha);
  48. $archivoAtom = $this->getFile($this->rutaDiariaFecha . $fileName, $fileName);
  49. $nuevoAtomAttrNext = $this->readNextAttribute($archivoAtom);
  50. //while ($nuevoAtomAttrNext !== "") {
  51. $aux = 0;
  52. while ($aux <= 3) {
  53. $fileName = basename($nuevoAtomAttrNext);
  54. $this->downloadFile($fileName, $nuevoAtomAttrNext, $this->rutaDiariaFecha);
  55. $archivoAtom = $this->getFile($this->rutaDiariaFecha . $fileName, $fileName);
  56. $nuevoAtomAttrNext = $this->readNextAttribute($archivoAtom);
  57. $aux++;
  58. }
  59. }
  60. private function getFile($url, $fileName)
  61. {
  62. $feed = implode(file($url));
  63. $xml = simplexml_load_string($feed);
  64. $json = json_encode($xml);
  65. $array = json_decode($json, true);
  66. $this->formatXml($feed, $fileName);
  67. return $array;
  68. }
  69. private function newFolder($rutaFinal)
  70. {
  71. $result = false;
  72. if (!is_dir($rutaFinal)) {
  73. $result = mkdir($rutaFinal);
  74. mkdir($rutaFinal . "/format");
  75. }
  76. return $result;
  77. }
  78. private function formatXml($xml, $fileName)
  79. {
  80. $openingFormat = $this->regExIniciosEsquema($xml);
  81. $closureFormat = $this->regExFinalesEsquema($openingFormat);
  82. file_put_contents($this->rutaDiariaFecha . "/format/" . $fileName, $closureFormat);
  83. }
  84. private function readNextAttribute($archivo)
  85. {
  86. $enlace = "";
  87. foreach ($archivo['link'] as $row) {
  88. $attrNext = $row['@attributes']['rel'];
  89. $attrHref = $row['@attributes']['href'];
  90. if ($attrNext === "next") {
  91. $enlace = $attrHref;
  92. }
  93. }
  94. return $enlace;
  95. }
  96. private function downloadFile($fileName, $url, $ruta)
  97. {
  98. if (file_put_contents($ruta . $fileName, file_get_contents($url))) {
  99. return true;
  100. } else {
  101. return false;
  102. }
  103. }
  104. private function regExIniciosEsquema($xml)
  105. {
  106. $pattern = "/(<cac:)|(<cbc:)|(<cac-place-ext:)|(<cbc-place-ext:)/";
  107. $result = preg_replace($pattern, "<", $xml);
  108. return $result;
  109. }
  110. private function regExFinalesEsquema($xml)
  111. {
  112. $pattern = "/(<\/cac:)|(<\/cbc:)|(<\/cac-place-ext:)|(<\/cbc-place-ext:)/";
  113. $result = preg_replace($pattern, "</", $xml);
  114. return $result;
  115. }
  116. }