ugrás a tartalomhoz

Fájlok méretének összehasonlítása

MDOC · 2014. Feb. 26. (Sze), 16.30
Csináltam egy cron scriptet, ami 30 percenként lefut. A feladata 2 fájl méretének az összehasonlítása. Nem értem pontosan miért, de eszi a memóriát rendesen. Olyan mintha nem szabadítaná fel mikor lezárom curl_close($ch);-el.

Hol lehet a scriptben a hiba? Vagy milyen módszerrel kellene ezt megcsinálni?

Codeigniter-t használok és MYSQL-t.
  1. private function get_file_size($url)  
  2. {  
  3.     $ch = curl_init($url);  
  4.   
  5.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);  
  6.     curl_setopt($ch, CURLOPT_HEADER, TRUE);  
  7.     curl_setopt($ch, CURLOPT_NOBODY, TRUE);  
  8.   
  9.     $data = curl_exec($ch);  
  10.     $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);  
  11.   
  12.     curl_close($ch);  
  13.   
  14.     return $size;  
  15. }  
  16.   
  17. public function size_check()  
  18. {  
  19.     if(!$this->input->is_cli_request()) return;  
  20.   
  21.     $this->load->model('world_model');  
  22.     $this->load->model('confederacy_model');  
  23.     $this->load->model('attack_model');  
  24.   
  25.     $url = $this->world_model->get_worlds(array(  
  26.         'key' => 'world_id',  
  27.         'value' => 'world_url'));  
  28.   
  29.     $world = $this->confederacy_model->get_confederacies(array(  
  30.         'key' => 'confederacy_id',  
  31.         'value' => 'confederacy_world_id'));  
  32.   
  33.     $attacks = $this->attack_model->admin_get_attacks(array(  
  34.         'attack_hero' => 0,  
  35.         'attack_time_min' => now(),  
  36.         'key' => 'attack_id'));  
  37.   
  38.     foreach($attacks as $attack_id => $attack)  
  39.     {  
  40.         $url_ = $url[$world[$attack->attack_confederacy_id]];  
  41.   
  42.         $img_old = $this->get_file_size(base_url().'attack_heros/hero_'.$attack_id.'.jpg');  
  43.         $img_new = $this->get_file_size('http://'.$url_.'/hero_body.php?uid='.$attack->attack_from_uid.'&'.now());  
  44.   
  45.         if$img_old != $img_new )  
  46.         {  
  47.              $this->attack_model->update_attack(array(  
  48.                  'attack_id' => $attack_id,  
  49.                  'attack_confederacy_id' => $attack->attack_confederacy_id,  
  50.                  'attack_hero' => 1));  
  51.         }  
  52.   
  53.     }  
  54. }  
Ezt a hibaüzenet kapom:

lfd on ###: Excessive resource usage: user (718971 (Parent PID:718953))
Time: Wed Feb 26 01:30:03 2014 +0100
Account: user
Resource: Virtual Memory Size
Exceeded: 227 > 150 (MB)
Executable: /usr/selector/php-cli
Command Line: /usr/local/bin/php -f /home/user/public_html/index.php update size_check
PID: 718971 (Parent PID:718953)
Killed: Yes


Amit még próbáltam és szintén ilyen hibaüzenetet produkált.
  1. $img_old = $this->get_file_size(base_url().'attack_heros/hero_'.$attack_id.'.jpg');  
helyett
  1. $img_old = strlen(file_get_contents(base_url().'attack_heros/hero_'.$attack->attack_id.'.jpg'));  
 
1

Letöltés nélkül nem lehet

Hidvégi Gábor · 2014. Feb. 26. (Sze), 16.56
Letöltés nélkül nem lehet megállapítani a fájlok méretét? Például a HTTP fejlécekből. Mekkorák egyébként maguk a fájlok?
2

content-length gondolom megadja

MDOC · 2014. Feb. 26. (Sze), 17.28
Sose voltam tisztában a http fejlécekkel. Az is jó lenne. Csak rá kellene jönnöm, hogy hogy tudok kérést küldeni letöltés nélkül, és a válasz fejlécét olvasni. Gondolom valami http request lehet jó. Utánanézek.

szerk.
get_headers - ez a függvény lesz a jó gondolom.

A fenti megoldás miért nem jó? Miért nem szabadít fel?

A memory_get_usage() függvénnyel vizsgálva, nem is látható ez a memóriahasználat. Mivel kellene vizsgálnom?
3

memory_get_peak_usage()

Hidvégi Gábor · 2014. Feb. 26. (Sze), 17.29
4

Köszönöm az ötlet

MDOC · 2014. Feb. 26. (Sze), 17.42
Köszönöm az ötletet. Erre változtattam a kódot:
  1. $img_new = get_headers('http://'.$url_.'/hero_body.php?uid='.$attack->attack_from_uid.'&'.now(), 1);  
  2. $img_new = $hero_new['Content-Length'];  
A memory_get_peak_usage() el megnéztem most. Az új módszert és az eredmény(minden összehasonlítást is kiírt):

1457 db ellenőrzés lefutva
Futási idő: 219 mp
Kezdeti memória használat: 2.69 MB
Maximum memória használat: 9.36 MB

A fájlok mérete amúgy kicsi. 24,0 KB (24 576 bájt) az összes kb.
5

Mi lenne, ha globálisan egy

Hidvégi Gábor · 2014. Feb. 26. (Sze), 17.46
Mi lenne, ha globálisan egy curl példány lenne, és nem szabadítgatnád fel mindig, hanem újrahasznosítanád, és csak a végén? Én azért utánajárnék ennek is.
6

Nem tudom pontosan hogy

MDOC · 2014. Feb. 26. (Sze), 18.06
Nem tudom pontosan hogy gondoltad. Azt csináltam, hogy az osztály kapott egy
  1. private $ch;  
Változót és ezt használtam a függvényben a $ch helyett, amúgy minden maradt.

Az eredmény:

709 db ellenőrzés lefutva
Futási idő: 68 mp
Kezdeti memória használat: 2.69 MB
Maximum memória használat: 5.62 MB

Amúgy a hiba előtti futásnál ez volt a futás eredménye:

213 db ellenőrzés lefutva
Futási idő: 30 mp
Kezdeti memória használat: 2.54 MB
Maximum memória használat: 3.81 MB

Amikor hiba volt persze nem futott le rendesen, de utána

192 db ellenőrzés lefutva
Futási idő: 18 mp
Kezdeti memória használat: 2.54 MB
Maximum memória használat: 3.63 MB

Nem is értem miért kaptam a hibát. Csak arra tudok gondolni, hogy azt, nem ez a rész okozta hanem más, csak éppen ez futott túl, ezért ezt lőtte le. Ez lehetséges?
7

Nekem is az volt az első

Hidvégi Gábor · 2014. Feb. 26. (Sze), 18.49
Nekem is az volt az első gondolatom, hogy valahol máshol lehet a túlcsordulás.
8

HEAD kérés

razielanarki · 2014. Feb. 27. (Cs), 14.48
elv curl-lel tudsz küldeni olyan kérést (HEAD) ami pont olyan mint egy GET, de csak a fejléceket adja vissza:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.4

szerk:
illetve így is lehet:
  1. stream_context_set_default(  
  2.     array(  
  3.         'http' => array(  
  4.             'method' => 'HEAD'  
  5.         )  
  6.     )  
  7. );  
  8. $headers = get_headers('http://example.com');