Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Ograniczenie czasu i wykorzystania pamięci działającego skryptu, Skrypt do generowania pliku *.XML uruchamiany przez CRON
mpps
post
Post #1





Grupa: Zarejestrowani
Postów: 242
Pomógł: 0
Dołączył: 14.03.2003
Skąd: Szczecin

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


Witam,
potrzebuję zawrzeć w skrypcie ograniczenia czasu działania (30s) i wykorzystania pamięci (32M).
Skrypt ma być uruchamiany przez CRON.

Skrypt ma tworzyć plik *.XML dla portalu kupujemy.pl, który niestety nie posiada rozwiązań takich jak Ceneo lub Nokaut.

Czy istnieje możliwość takiego ograniczenia dla całego kodu, czy jest potrzeba stosowania ograniczeń np. przy każdej pętli?

Nie mogę skorzystać z ini_set('memory_limit', '32M') i set_time_limit(1800)...

  1. <?php
  2.  
  3. // Nazwa pliku XML
  4. define('AAA_XML_FILE', 'aaa.xml');
  5.  
  6. //@set_time_limit(1800);
  7.  
  8. //ini_set('memory_limit', '32M');
  9.  
  10. $content = '';
  11.  
  12. $content .= <?xml version=\"1.0\" encoding=\"ISO-8859-2\"?>\n";
  13. $content .= "<aaa>\n";
  14. $content .= " <offers>\n";
  15.  
  16. $sql="
  17. SELECT [...]
  18. ";
  19. $productQuery = tep_db_query($sql);
  20.  
  21. if (tep_db_num_rows($productQuery)) {
  22. while($productInfo = tep_db_fetch_array($productQuery)){
  23. $content .= " <offer>\n";
  24. $content .= " <id>".$productInfo['products_id']."</id>\n";
  25. $content .= " </offer>\n";
  26. }
  27. }
  28. $content .= " </offers>\n";
  29. $content .= "</aaa>\n";
  30.  
  31. $filename = DIR_FS_CATALOG .AAA_XML_FILE;
  32. $fp = fopen($filename, 'w+');
  33. fwrite($fp, $content);
  34. fclose($fp);
  35. ?>


Może ktoś z Was już się z tym spotkał?

Z góry dzięki!

Ten post edytował mpps 4.01.2012, 11:17:57
Go to the top of the page
+Quote Post
wNogachSpisz
post
Post #2





Grupa: Zarejestrowani
Postów: 1 233
Pomógł: 87
Dołączył: 6.03.2009

Ostrzeżenie: (40%)
XX---


Na początku skryptu przypisz do zmiennej czas microtime().
Podczas wykoywania skryptu ponownie pobieraj microtime() i sprawdzaj czy jest większy o 30 od tego pobranego na początku skryptu.
Go to the top of the page
+Quote Post
mpps
post
Post #3





Grupa: Zarejestrowani
Postów: 242
Pomógł: 0
Dołączył: 14.03.2003
Skąd: Szczecin

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


Jest to jakieś rozwiązanie.
Jak je zastosować do obsługi pliku?

  1. $filename = DIR_FS_CATALOG .AAA_XML_FILE;
  2. $fp = fopen($filename, 'w+');
  3. fwrite($fp, $content);
  4. fclose($fp);


Jeszcze pozostaje drugi problem dotyczący ograniczenia wykorzystania pamięci przez skrypt...
Go to the top of the page
+Quote Post
modern-web
post
Post #4





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

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


Nie ograniczysz tego z poziomu aplikacji - przecież nie `powiesz` programowi, że ma coś zrobić szybciej niż potrafi - to nie człowiek, nie myśli.
microtime() jest tutaj zbędne - bo jak zastosujesz to do obsługi plików!?

To co chcesz zrobić leży w ustawieniach parsera - nie w składni języka PHP. Albo ustawisz to na sztywno w php.ini albo zdefiniujesz dla danego skryptu. Nie widzę innej możliwości.
Go to the top of the page
+Quote Post
mpps
post
Post #5





Grupa: Zarejestrowani
Postów: 242
Pomógł: 0
Dołączył: 14.03.2003
Skąd: Szczecin

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


Z poziomu skryptu ograniczysz.
Jeśli różnica między czas start a czas end jest większy niż 30s exit;
  1. function get_moment(){
  2. $temps1 = explode(" ", microtime());
  3. $temps2 = explode(".", $temps1[0]);
  4. $temps2 = $temps1[1].".".$temps2[1];
  5. return $temps2;
  6. }
  7. function get_elapsed_time($start,$end){
  8. return number_format(($end - $start)* 1, 3, '.', ' ')."s";
  9. }
  10. $start_time=get_moment();
  11. [...]
  12. $max_time = 30;
  13. echo "czas generowania pliku: ".get_elapsed_time($start_time, get_moment()) . "\n";
  14.  
  15. if(get_elapsed_time($start_time, get_moment()) > $max_time){
  16. echo "przerwij";
  17. }
  18. else{
  19. echo "kontynuuj";
  20. }

Możesz to wywoływać w kilku miejscach (np. po każdej pętli).
Działa, bo sprawdziłem.

Co do obsługi plików, to nie znam rozwiązania, dlatego w poprzednim poście zadałem pytanie...

Jak pisałem w pierwszym poście, nie mogę skorzystać z ini_set('memory_limit', '32M') i set_time_limit(1800)...

Pozostaje mi jeszcze ograniczenie wykorzystania pamięci (do 32M) i nie mam pomysłu jak się za to zabrać...
Go to the top of the page
+Quote Post
modern-web
post
Post #6





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

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


No dobrze; da się to zrobić ale zauważ, że exit(); kończy skrypt, więc jeżeli czas ulegnie wydłużeniu nie wykona się pozostała część programu. Bardzo `polowy` sposób, którego zwyczajnie się nie zaleca.

A buforem byś tego nie załatwił?
Go to the top of the page
+Quote Post
mpps
post
Post #7





Grupa: Zarejestrowani
Postów: 242
Pomógł: 0
Dołączył: 14.03.2003
Skąd: Szczecin

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


Cytat(modern-web @ 4.01.2012, 21:14:45 ) *
No dobrze; da się to zrobić ale zauważ, że exit(); kończy skrypt, więc jeżeli czas ulegnie wydłużeniu nie wykona się pozostała część programu. Bardzo `polowy` sposób, którego zwyczajnie się nie zaleca.


Właśnie o to chodzi, żeby skrypt przerwał swoje działanie i nie wykonała się pozostała część programu...! (IMG:style_emoticons/default/wink.gif)

A co do ograniczenia czasu to rozwiązałem to tak (i działa!) (IMG:style_emoticons/default/aarambo.gif)

memory_get_usage — Returns the amount of memory allocated to PHP
int memory_get_usage ([ bool $real_usage = false ] )
Returns the amount of memory, in bytes, that's currently being allocated to your PHP script.

a więc:

  1. $max_mem_usage = 32*1024*1024; //1024b * 1024Kb * 32Mb = 32Mb
  2. if(memory_get_usage() >= $max_mem_usage){
  3. exit("przekroczony limit pamieci");
  4. }


Cytat(modern-web @ 4.01.2012, 21:14:45 ) *
A buforem byś tego nie załatwił?

ob_start() jest na początku skryptu...

Jeszcze pozostaje obsługa pliku (otworzenie, zapis, zamknięcie)

Ten post edytował mpps 4.01.2012, 22:01:24
Go to the top of the page
+Quote Post
zegarek84
post
Post #8





Grupa: Zarejestrowani
Postów: 1 332
Pomógł: 294
Dołączył: 12.10.2008
Skąd: Olkusz

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


Cytat(mpps @ 4.01.2012, 21:43:49 ) *
Jeszcze pozostaje obsługa pliku (otworzenie, zapis, zamknięcie)

jeśli sam kontrolujesz skrypt to ok... i tutaj luknij na fragment otworzenia, zapisu i zamkniecia... przecież zapisywać możesz fragmentami i co fragment sprawdzać czas... (a i nie pamiętam, czy w PHP jeśli zakończysz skrypt to czy plik w pewnych sytuacjach nie bedzie zablokowany - więc to sprawdź i najwyżej dodaj linijkę więcej niż tylko exit)... poza tym jakbyś trochę mniej buforował i od razu zapisywał do pliku wyjściowego fragmentami zmniejszył byś zurzycie pamięci...
Go to the top of the page
+Quote Post

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: 22.08.2025 - 13:07