PHP Takip Bellek Kullanımı

3 Cevap php

Ben URL'leri işleyen bir komut dosyası bellek kullanımını izlemek için çalışıyorum. Temel fikir, makul bir tampon bir çoklu cURL işleyicisi başka bir URL eklemeden önce var olduğunu kontrol etmektir. Ben çok işleyicisi çalıştığı gibi bir URL'ler verilerini işleyen bir 'yuvarlanan cURL' kavramını kullanıyorum. Bu ben, her seferinde bir havuz mevcut bir URL süreçlerini yeni bir URL ekleme ve kaldırılır aktif N bağlantıları tutmak anlamına gelir.

Ben bazı olumlu sonuçlar memory_get_usage() kullandım. real_usage bayrağı ekleme ('sistem' hafıza ve 'emalloc' bellek arasındaki farkı çok net değil, ancak sistem büyük numaralarını gösterir) yardımcı oldu. URL'ler sonra aşağı URL set tükenmiş olarak eklenir gibi memory_get_usage() kadar rampa yok. Ancak, ben sadece benim son hafızası onay ~ 18M olmak 32M sınırını aştı.

Ben, her seferinde bir çoklu cURL sinyallerini bellek kullanımını yoklamak bir istek döndü. Birden fazla kişi aynı anda dönebilir yana, URL'lerin bir demet verileri aynı anda döndü ve aslında bellek kullanımını 14M atladı bir şans var. memory_get_usage() doğru Ancak, eğer, o ne oluyor sanırım.

[Update: Sanırım sormadan önce daha fazla testler var mı, arttı php bellek sınırı (ama komut aynı 'güvenli' bir miktar sol) ve benim öz aşağıda bildirilen yaptığı atlayışla bellek kullanımı dayatılan 32M üzerinden için 25M sınırı. Sonra, beklendiği gibi yavaş yavaş eklenirken değil URL'ler gibi aşağı rampalı. Ama ben soruyu bırakacağım: bu yapmak için doğru yolu var mı]?

I memory_get_usage() bu şekilde güvenebilir miyiz? (Ben bazı komut kabuk komutları çıkışını ayrıştırmak gördüm) bellek kullanımını almak için daha iyi bir alternatif yöntemler var mı?

3 Cevap

real_usage bu şekilde çalışır:

Zerdüştlerin bellek yöneticisi ihtiyacı, her blok için sistem malloc kullanmak değildir. Bunun yerine, (256K artışlarla, ortam değişkeni ZEND_MM_SEG_SIZE ayarlayarak değiştirilebilir) sistem belleğinin büyük bir blok ayırır ve içten yönetir. Yani, bellek kullanımının iki türü vardır:

  1. Motor OS ("gerçek kullanım") aldı Ne kadar bellek
  2. Aslında uygulama ("iç kullanım") tarafından ne kadar bu bellek kullanıldı

Bunlardan birisi memory_get_usage() tarafından iade edilebilir. Hangisini içine ne arıyorsanız bağlıdır için daha yararlıdır. Belirli bölgelerinde kodunuzu optimize içine arıyorsanız, "iç" sizin için daha faydalı olabilir. Eğer küresel bellek kullanımını takip ediyorsanız, "gerçek" daha yararlı olacaktır. memory_limit "gerçek" sayısını sınırlar, bu nedenle en kısa sürede limiti tarafından izin verilen tüm blokları sisteminden alınır ve bellek yöneticisi istenen blok ayıramadığı gibi, ayırma orada başarısız olur. Bu durumda "iç" kullanım sınırından daha az olabilir, ama yine de tahsis parçalanması nedeniyle başarısız olabilir unutmayın.

Also, if you are using some external memory tracking tool, you can set this environment variable USE_ZEND_ALLOC=0 which would disable the above mechanism and make the engine always use malloc(). This would have much worse performance but allows you to use malloc-tracking tools.

Ayrıca bakınız an article about this memory manager, o da bazı kod örnekleri vardır.

Ben de memory_get_usage() güvenlidir ama burada sistem çağrılarını ayrıştırır bir fonksiyonu olduğunu, hem yöntemleri karşılaştırmak ve kendiniz karar verebilirsiniz sanırım varsayalım:

function Memory_Usage($decimals = 2)
{
    $result = 0;

    if (function_exists('memory_get_usage'))
    {
        $result = memory_get_usage() / 1024;
    }

    else
    {
        if (function_exists('exec'))
        {
            $output = array();

            if (substr(strtoupper(PHP_OS), 0, 3) == 'WIN')
            {
                exec('tasklist /FI "PID eq ' . getmypid() . '" /FO LIST', $output);

                $result = preg_replace('/[\D]/', '', $output[5]);
            }

            else
            {
                exec('ps -eo%mem,rss,pid | grep ' . getmypid(), $output);

                $output = explode('  ', $output[0]);

                $result = $output[1];
            }
        }
    }

    return number_format(intval($result) / 1024, $decimals, '.', '');
}

Peki gerçekten bu yüzden ben çok yardım sorunun nedenini bulma ama ne tavsiye edebilirsiniz Eğer bir PHP hızlandırıcı almak olduğunu ve olabileceğini sanmıyorum benim PHP komut ile bir bellek sorunu yoktu, ciddi bir performans artışı fark edeceksiniz ve düşüş ile bellek kullanımı. İşte hızlandırıcılar listesi ve (bunlardan herhangi biri ile performans 3x daha iyi) bir tanesi birkaç karşılaştıran bir makale

Wikipedia List

Benchmark

Kriterler 2 yıl eski ama performans artar fikir olsun.

Eğer varsa bile yine hızlandırıcı ile ilgili sorunlar yaşıyorsanız, aynı zamanda PHP size bellek sınırını artırabilirsiniz. Php.ini açın ve bulun:

memory_limit = 32M;

ve ona küçük bir artış.