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.

private function get_file_size($url)
{
    $ch = curl_init($url);

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_HEADER, TRUE);
    curl_setopt($ch, CURLOPT_NOBODY, TRUE);

    $data = curl_exec($ch);
    $size = curl_getinfo($ch, CURLINFO_CONTENT_LENGTH_DOWNLOAD);

    curl_close($ch);

    return $size;
}

public function size_check()
{
    if(!$this->input->is_cli_request()) return;

    $this->load->model('world_model');
    $this->load->model('confederacy_model');
    $this->load->model('attack_model');

    $url = $this->world_model->get_worlds(array(
        'key' => 'world_id',
        'value' => 'world_url'));

    $world = $this->confederacy_model->get_confederacies(array(
        'key' => 'confederacy_id',
        'value' => 'confederacy_world_id'));

    $attacks = $this->attack_model->admin_get_attacks(array(
        'attack_hero' => 0,
        'attack_time_min' => now(),
        'key' => 'attack_id'));

    foreach($attacks as $attack_id => $attack)
    {
        $url_ = $url[$world[$attack->attack_confederacy_id]];

        $img_old = $this->get_file_size(base_url().'attack_heros/hero_'.$attack_id.'.jpg');
        $img_new = $this->get_file_size('http://'.$url_.'/hero_body.php?uid='.$attack->attack_from_uid.'&'.now());

        if( $img_old != $img_new )
        {
             $this->attack_model->update_attack(array(
                 'attack_id' => $attack_id,
                 'attack_confederacy_id' => $attack->attack_confederacy_id,
                 'attack_hero' => 1));
        }

    }
}
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.

$img_old = $this->get_file_size(base_url().'attack_heros/hero_'.$attack_id.'.jpg');
helyett

$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:

$img_new = get_headers('http://'.$url_.'/hero_body.php?uid='.$attack->attack_from_uid.'&'.now(), 1);
$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

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:
stream_context_set_default(
    array(
        'http' => array(
            'method' => 'HEAD'
        )
    )
);
$headers = get_headers('http://example.com');