Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Edycja XML na serwerze i Cron
Forum PHP.pl > Forum > Przedszkole
Dagonen
Witam serdecznie, poszukuję wskazówek do rozwiązania następującej sytuacji.

Na moim serwerze lądują pliki .zip z programu do obsługi biur nieruchomości.
W pierwszym pliku jest cała paczka ofert (zdjęcia+pełny plik XML), zaś w kolejnych już tylko poprawki zawarte w XML oraz poprawione zdjęcia.
Chciałbym doprowadzić do sytuacji automatycznej aktualizacji tych plików oraz zmian w xml.


Plan mam taki:

1. Stworzyć plik cron o nazwie np. cron-13.php
2. W niego władować:


  1. <?php
  2. system ("unzip -o .zip -d folder_docelowy");
  3. ?>


// nie wiem, czy w ten sposób załapie, że chodzi o wszystkie pliki zip w tym folderze które przyjdą (będą miały różne nazwy)
// nie wiem, gdzie umieścić plik cron, jeżeli paczki .zip przechodzą do folderu docelowego

4. Scalenie xml

Dalej muszę umieścić komendę zamiany określonych wartości z nowego pliku oferty.xml do starego oferty.xml:

Jeżeli w nowym pliku xml znajdzie się <oferta><id>numer_id</id> (jeżeli pokrywają się ID danej oferty) to nadpisz ją,
Jeżeli w nowym pliku xml <oferta_usun><id>numer_id</id></oferta_usun> to usuń ją w starym pliku rozpoznając po ID,
Jeżeli w nowym pliku xml <zdjecie><id>numer_zdjęcia</id></zdjecie> to zamienia w starym rozpoznając po ID i numerze zdjęcia.


(będę wdzięczny za chociaż jeden przykład danej komendy ze skierowaniem do konkretnego folderu -> pliku.)

Dodatkowo zastanawiam się nad tym:

- czy nie będzie za późno po wcześniejszej komendzie wypakowania - pliki się zamienią, i będzie za późno na komendy które chcę uwzględnić.


Będę wdzięczny za jakiekolwiek wskazówki. Pozdrawiam!
b4rt3kk
Cytat(Dagonen @ 25.03.2015, 13:25:43 ) *
Witam serdecznie, poszukuję wskazówek do rozwiązania następującej sytuacji.

Na moim serwerze lądują pliki .zip z programu do obsługi biur nieruchomości.
W pierwszym pliku jest cała paczka ofert (zdjęcia+pełny plik XML), zaś w kolejnych już tylko poprawki zawarte w XML oraz poprawione zdjęcia.
Chciałbym doprowadzić do sytuacji automatycznej aktualizacji tych plików oraz zmian w xml.


Plan mam taki:

1. Stworzyć plik cron o nazwie np. cron-13.php
2. W niego władować:


  1. <?php
  2. system ("unzip -o .zip -d folder_docelowy");
  3. ?>


// nie wiem, czy w ten sposób załapie, że chodzi o wszystkie pliki zip w tym folderze które przyjdą (będą miały różne nazwy)
// nie wiem, gdzie umieścić plik cron, jeżeli paczki .zip przechodzą do folderu docelowego

4. Scalenie xml

Dalej muszę umieścić komendę zamiany określonych wartości z nowego pliku oferty.xml do starego oferty.xml:

Jeżeli w nowym pliku xml znajdzie się <oferta><id>numer_id</id> (jeżeli pokrywają się ID danej oferty) to nadpisz ją,
Jeżeli w nowym pliku xml <oferta_usun><id>numer_id</id></oferta_usun> to usuń ją w starym pliku rozpoznając po ID,
Jeżeli w nowym pliku xml <zdjecie><id>numer_zdjęcia</id></zdjecie> to zamienia w starym rozpoznając po ID i numerze zdjęcia.


(będę wdzięczny za chociaż jeden przykład danej komendy ze skierowaniem do konkretnego folderu -> pliku.)

Dodatkowo zastanawiam się nad tym:

- czy nie będzie za późno po wcześniejszej komendzie wypakowania - pliki się zamienią, i będzie za późno na komendy które chcę uwzględnić.


Będę wdzięczny za jakiekolwiek wskazówki. Pozdrawiam!


Komenda wykonywana cronem nie musi być plikiem php, możesz zwyczajnie odpalić w cronie:

Kod
unzip *.zip


Bez zbędnego mieszania w to php.

To tyczy rozpakowania. Kolejna kwestia to obróbka danych, tutaj już wskazanym jest zastosowanie php. Zwyczajnie parsujesz xml za pomocą DOMDocument.

Nowe pliki trzymaj w osobnych folderach niż pliki użytkowe (czyli z danymi z których korzystasz).
Pyton_000
Czyli na serwer wrzucasz tylko raz pełną ofertę, a potem dogrywa tylko "patch-e" ?

pokaż jakiś jeden wpis żeby wiedzieć co zaproponować. Bo rozwiązań jest wiele.
Dagonen
Cytat("b4rt3kk")
Komenda wykonywana cronem nie musi być plikiem php, możesz zwyczajnie odpalić w cronie:

Kod
unzip *.zip

Bez zbędnego mieszania w to php.

To tyczy rozpakowania. Kolejna kwestia to obróbka danych, tutaj już wskazanym jest zastosowanie php. Zwyczajnie parsujesz xml za pomocą DOMDocument.

Nowe pliki trzymaj w osobnych folderach niż pliki użytkowe (czyli z danymi z których korzystasz).


Innymi słowy do rozpakowania wystarczy tak?



Co do obróbki danych i DOMDocument, to jeszcze dla mnie czarna magia, ale zaraz biorę się za dokumentację i google.

Cytat("Pyton_000)
Czyli na serwer wrzucasz tylko raz pełną ofertę, a potem dogrywa tylko "patch-e" ?

pokaż jakiś jeden wpis żeby wiedzieć co zaproponować. Bo rozwiązań jest wiele.


Dokładnie tak jak mówisz.

Oto przykład patcha:
(pełna wersja wygląda tak samo, tylko więcej ofert w działach smile.gif)

  1. <?xml version="1.0" encoding="iso-8859-2"?>
  2. <plik>
  3. <header>
  4. <informacje>v1.0</informacje>
  5. <agencja>xyz</agencja>
  6. <serwer />
  7. <data>2015-02-19 02:44:30</data>
  8. <wersja>1.0</wersja>
  9. <cel>oferty.net</cel>
  10. <zawartosc_pliku>roznica</zawartosc_pliku>
  11. <lang_code>pl-PL</lang_code>
  12. </header>
  13. <lista_ofert>
  14. <dzial tab="domy" typ="sprzedaz" />
  15. <dzial tab="domy" typ="wynajem" />
  16. <dzial tab="dzialki" typ="sprzedaz" />
  17. <dzial tab="dzialki" typ="wynajem" />
  18. <dzial tab="lokale" typ="sprzedaz" />
  19. <dzial tab="lokale" typ="wynajem" />
  20. <dzial tab="mieszkania" typ="sprzedaz">
  21. <oferta>
  22. <id>52</id>
  23. <original_id>41</original_id>
  24. <cena waluta="PLN">11111111,0000</cena>
  25. <param nazwa="cena1m" typ="real">11111</param>
  26. <param nazwa="wojewodztwo" typ="text">wielkopolskie</param>
  27. <param nazwa="panstwo" typ="text">Polska</param>
  28. <param nazwa="miastoF" typ="text">xyz</param>
  29. <param nazwa="google_x" typ="text">1111.223033400000000</param>
  30. <param nazwa="google_y" typ="text">1111.251072900000000</param>
  31. <param nazwa="miasto" typ="text">xyz</param>
  32. <param nazwa="n_geo_y" typ="text">1111.223033400000000</param>
  33. <param nazwa="n_geo_x" typ="text">1111.251072900000000</param>
  34. <param nazwa="rynek_pierwotny" typ="bool">false</param>
  35. <param nazwa="nazwa_inwestycji" typ="text" />
  36. <param nazwa="inwestycje" typ="bool">false</param>
  37. <param nazwa="rynek" typ="text">wtórny</param>
  38. <param nazwa="rodzina_na_swoim" typ="bool">false</param>
  39. <param nazwa="dataaktualizacji" typ="text">2015-02-19 14:30:07</param>
  40. <param nazwa="superoferta" typ="bool">false</param>
  41. <param nazwa="bezprowizji" typ="bool">false</param>
  42. <param nazwa="bez_prowizji" typ="bool">false</param>
  43. <param nazwa="wylacznosc" typ="bool">true</param>
  44. <param nazwa="datawprowadzenia" typ="text">2015-02-19 14:30:07</param>
  45. <param nazwa="forma_wlasnosci" typ="text">własność</param>
  46. <param nazwa="powierzchnia" typ="real">1111,47</param>
  47. <param nazwa="liczbapokoi" typ="int">111</param>
  48. <param nazwa="pietro" typ="int">11</param>
  49. <param nazwa="liczbapieter" typ="int">1</param>
  50. <param nazwa="typkuchni" typ="text">widna</param>
  51. <param nazwa="piwnica" typ="bool">true</param>
  52. <param nazwa="ogrzewanie" typ="text">miejskie</param>
  53. <param nazwa="stan_lokalu" typ="text">bardzo dobry</param>
  54. <param nazwa="typ_budynku" typ="text">blok</param>
  55. <param nazwa="typ_parkingu" typ="text">parking niestrzeżony</param>
  56. <param nazwa="wc_opis" typ="text" />
  57. <param nazwa="kuchnia_opis" typ="text" />
  58. <param nazwa="hall_opis" typ="text" />
  59. <param nazwa="lazienka_opis" typ="text" />
  60. <param nazwa="opis" typ="text">
  61. <linia>Na sprzedaż mieszkanie etc. </linia>
  62. <linia />
  63. <linia>xyz</linia>
  64. <linia>Kontakt</linia>
  65. <linia />
  66. </param>
  67. <param nazwa="agent_nazwisko" typ="text">xyz</param>
  68. <param nazwa="agent_tel_kom" typ="text">xyz</param>
  69. <param nazwa="agent_tel_biuro" typ="text" />
  70. <param nazwa="agent_email" typ="text">xyz</param>
  71. <param nazwa="licence_number" typ="int">xyz</param>
  72. <param nazwa="numer_licencji_posrednika" typ="text">xyz</param>
  73. <param nazwa="zdjecie1" typ="text">xyz_521_1.jpg</param>
  74. </oferta>
  75. <oferta_usun>
  76. <id>533</id>
  77. </oferta_usun>
  78. </dzial>
  79. <dzial tab="mieszkania" typ="wynajem" />
  80. <dzial tab="obiekty" typ="sprzedaz" />
  81. <dzial tab="obiekty" typ="wynajem" />
  82. <dzial tab="lokale" typ="sprzedaz" />
  83. <dzial tab="lokale" typ="wynajem" />
  84. <dzial tab="lokale" typ="sprzedaz" />
  85. <dzial tab="lokale" typ="wynajem" />
  86. </lista_ofert>
  87. <zdjecia>
  88. <zdjecie>
  89. <id>521</id>
  90. <typ>m</typ>
  91. <sprzedaz>1</sprzedaz>
  92. <kolejnosc>2</kolejnosc>
  93. <akcja>u</akcja>
  94. <nazwa>xyz_521_2.jpg</nazwa>
  95. </zdjecie>
  96. <zdjecie>
  97. <id>521</id>
  98. <typ>m</typ>
  99. <sprzedaz>1</sprzedaz>
  100. <kolejnosc>3</kolejnosc>
  101. <akcja>u</akcja>
  102. <nazwa>xyz_3.jpg</nazwa>
  103. </zdjecie>
  104. <zdjecie>
  105. <id>521</id>
  106. <typ>m</typ>
  107. <sprzedaz>1</sprzedaz>
  108. <kolejnosc>4</kolejnosc>
  109. <akcja>u</akcja>
  110. <nazwa>xyz_521_4.jpg</nazwa>
  111. </zdjecie>
  112. <zdjecie>
  113. <id>521</id>
  114. <typ>m</typ>
  115. <sprzedaz>1</sprzedaz>
  116. <kolejnosc>5</kolejnosc>
  117. <akcja>u</akcja>
  118. <nazwa>xyzs_521_5.jpg</nazwa>
  119. </zdjecie>
  120. <zdjecie>
  121. <id>521</id>
  122. <typ>m</typ>
  123. <sprzedaz>1</sprzedaz>
  124. <kolejnosc>6</kolejnosc>
  125. <akcja>u</akcja>
  126. <nazwa>xyzs_521_6.jpg</nazwa>
  127. </zdjecie>
  128. </zdjecia>
  129. </plik>
Pyton_000
Wydaje mi się że chyba najrozsądniejszym rozwiązaniem jest zaimportowanie tego do BazyDanych. Fakt jest z tym trochę roboty ale możesz uprościć to trochę jeżeli nie będziesz potrzebował tych danych poza całym XML'e.

Możesz tak:
W BD tworzysz tabele odpowiadające:
- oferta (tab, typ,id (id z XML), entry (tutaj w postaci tekstu cały węzeł "oferta"
- zdjęcia (id (id z zdjecie), kolejność, entry(j.w. cały węzeł 'zdjęcie'

Dlaczego tak?
Tworzysz jeden parser który będzie Ci wkładał lub zastępował wpisy (REPLACE INTO) w BD. Mielisz XML tylko raz, a wyszukiwanie w bazie jest bardzo szybkie i nie naraża Cię na problemy z pamięcią.
Dodatkowo możesz zrobić eksporter do XML, (pobierasz wszystkie dane i upychasz w pętli)


Możesz też użyć SimpleXML ale to tylko jeśli nie cierpisz na brak RAM na serwerze. Będzie to najłatwiejsze rozwiązanie ale i najbardziej kosztowne pod względem zasobów.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.