Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Ograniczenie czasu i wykorzystania pamięci działającego skryptu
Forum PHP.pl > Forum > Przedszkole
mpps
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!
wNogachSpisz
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.
mpps
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...
modern-web
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.
mpps
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ć...
modern-web
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ł?
mpps
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...! wink.gif

A co do ograniczenia czasu to rozwiązałem to tak (i działa!) 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)
zegarek84
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...
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.