Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> TIME OUT lub CPU LIMIT skryptu, aktualizacja stanów magazynowych prestashop
tom3k21
post
Post #1





Grupa: Zarejestrowani
Postów: 3
Pomógł: 0
Dołączył: 6.05.2014

Ostrzeżenie: (0%)
-----


Witam wszystkich (IMG:style_emoticons/default/smile.gif)
Mam nadzieje że jest ktoś w stanie mi pomóc rozwiązać problem ze skryptem do aktualizacji stanów magazynowych.
Otóż sklep stoi na home.pl i tutaj jest problem... (od administatorów jedyne czego się dowiedziałem to żeby przenieść na inny pakiet hostingowy (IMG:style_emoticons/default/tongue.gif) ot tak pomocni są)... a mianowicie mają ustawione limity CPU (ok rozumie) ale także max_execution_time na ok 5min którego zmienić nie można :/ ale do sedna...

Moje wypociny ponizej i jako że jestem laikiem w programowaniu to nie bardzo wiem jak go zoptymalizować lub podzielić na części aby wykonywały się jedna po drugiej (np podzielic plik xml i jeden po drugim parsowac, plik zawiera około 10 000 produktów ~10mb).

  1. <?php
  2. //error_reporting(E_ALL);
  3. header('Content-type: text/html; charset=utf8');
  4. include 'import_config.php';
  5. include 'import_functions.php';
  6. ?>
  7. <body>
  8.  
  9. <div id="information"></div>
  10.  
  11. <?php
  12.  
  13. $xmlfile = 'import/plik.xml';
  14.  
  15. if($xml = simplexml_load_file($xmlfile)){
  16. echo "<br>Załadowano poprawnie plik XML<br>";
  17. } else {
  18. echo "<br><span style='color:red'>Nie załadowano pliku XML, operacja została przerwana</span><br>";
  19. }
  20.  
  21. $total = mysql_result(mysql_query('SELECT COUNT(id_product) FROM ps_product'), 0);
  22.  
  23. $row2 = $productid = $instock = array();
  24.  
  25. foreach($xml->offers->offer as $entry)
  26. {
  27. $productid[] = $entry->id;
  28. if(!empty($entry->instock)){
  29. $instock[] = $entry->instock;
  30. } else {
  31. $instock[] = '0';
  32. }
  33.  
  34. }
  35.  
  36. $query= mysql_query("SELECT `id_product`, `reference` FROM `ps_product`");
  37. $row = mysql_fetch_assoc($query);
  38. while($row = mysql_fetch_assoc($query)){
  39. $row2[] = $row;
  40. }
  41.  
  42. $niezmienione = $nieaktywne = $zaktualizowane = 0;
  43. for($i = 0; $i <= $total; $i++){
  44. $reference = $row2[$i]['reference'];
  45. $productid2 = array_search($reference, $productid);
  46. if(isset($reference) == $productid2){
  47. $id_produktu = mysql_result(mysql_query("SELECT id_product FROM ps_product WHERE reference = '".$reference."'"), 0);
  48. if(!empty($instock[$productid2])){$stock2 = $instock[$productid2];} else { $stock2 = 0; }
  49. @mysql_query("UPDATE ps_stock_available SET `quantity` = '".$stock2."' WHERE `id_product` = '".$id_produktu."'");
  50. if( $stock2 > 0){ $active = 1; } else { $active = 0; }
  51. @mysql_query("UPDATE ps_product_shop SET `active` = '".$active."' WHERE `id_product` = '".$id_produktu."'");
  52. $zaktualizowane++;
  53. //echo $row2[$i]['reference']. ' znaleziony ze stanem magazynowym '. $stock2 .'<br>';
  54. } else {
  55. $instock2 = '0';
  56. if((int)$reference){
  57. @mysql_query("UPDATE ps_stock_available SET `quantity` = '".$instock2."' WHERE `id_product` = '".$id_produktu."'");
  58. @mysql_query("UPDATE ps_product_shop SET `active` = '".$instock2."' WHERE `id_product` = '".$id_produktu."'");
  59. $nieaktywne++;
  60. //echo $row2[$i]['reference']. ' <span style="color:red">nie znaleziony! Zmieniono stan magazynowy na '. $instock2 .'</span><br>';
  61. } else {
  62. $niezmienione++;
  63. //echo $row2[$i]['reference']. ' <span style="color:green">Stan nie zmieniony</span><br>';
  64. }
  65. }
  66. echo '<script language="javascript">
  67. document.getElementById("information").innerHTML="'.$i.' / '.$total.'<br>Produkty zaktualizowane: '.$zaktualizowane.'<br>Produkty niezmienione: '.$niezmienione.'<br>Nieaktywne produkty: '.$nieaktywne.'";
  68. </script>';
  69. echo str_repeat(' ',1024*64);
  70. flush();
  71. }
  72. echo '<script language="javascript">document.getElementById("information").innerHTML="Aktualizacja zakonczona<br>Produkty zaktualizowane: '.$zaktualizowane.'<br>Produkty niezmienione: '.$niezmienione.'<br>Nieaktywne produkty: '.$nieaktywne.'"</script>';
  73.  
  74. mysql_close($con2);
  75. unlink($xmlfile);
  76. ?>
  77. </body>


Fragment XML:
  1. <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE nokaut SYSTEM "http://www.nokaut.pl/integracja/nokaut.dtd">
  2. -<nokaut ver="7.2" generator="Comarch ERP e-Sklep">-<offers>-<offer><id>23270</id><name>PEDAŁY DO ROWERKA JD BUG TC04G czarne </name><description> PEDAŁY DO ROWERKA JD BUG TC04G czarne Zestaw do rowerków - mechanizm do rowerków biegowych. kompatybilny z modelami Nanny i Billy. </description><price>89.41</price><weight>1.000</weight><category>Dla dzieci / Sport dla dzieci / Rowery biegowe</category><producer>Smj</producer><property name="Dostępne kolory">Czarny</property><instock>3</instock></offer></offers></nokaut>


pokrótce:
skrypt pobiera xml przy pomocy simpleXML oraz laczy sie z baza danych gdzie wcześniej zostały zaimportowane produkty z numerem ID wpisanym do tabelki `reference` i jeśli produkt istnieje zarówno w DB jak i XML jego stan magazynowy zostaje uzupelniony odpowiednią liczbą, natomiast jeśli produkt znajduje się w bazie danych ale nie w XMLu to jego stan określa się jako 0. całość opiera się na metodzie array_search() czyli przeszukuje określonego wyrażenia w całej tablicy trzymającej numery ID produktów z XML'a. I pewnie dlatego nieraz otrzymuje komunikat CPU LIMIT jednak nie wymyśliłem jakiegoś innego sposobu aby to sprawdzać.

Za każdą sugestie podpowiedź, przykład, rzut okiem na kod będę bardzo wdzięczny (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 09:26