Память в php
Котаны, я не настоящий сварщик, так что не судите строго. Как я могу в php съесть, например, 256Мб памяти и получить значение true/false в зависимости от того, выделилась она или нет?
Хочу проверить лимиты на память и именно php-скриптом (именно проверить, а не узнать, memory_limit я вижу, ulimit тоже).

19 Responses to Память в phpКотаны, я не настоящий сварщик, так что не судите строго.

  1. Avhen:

    Или циклично поедать память, а по top я уже посмотрю, сколько и чего мне выделилось.

  2. 01pSpb:

    можно еще usleep воткнуть — чтобы плавнее выделялась

  3. Avhen:

    понял, а memory_get_usage можно проверять, сколько памяти сейчас выделено, если я всё правильно понял. Спасибо

  4. 01pSpb:

    оно пиздит жутко, практически нереально составить общую картину потребления памяти. Если ничего не изменилось, конечно

  5. Avhen:

    да, неудобно. Гораздо удобнее получить от php ошибку оказалось, что память не может быть выделена.

  6. Naref:

    В общем случае — никак. Когда у тебя скрипт съест больше памяти, чем надо — он будет прибит, не успев получить false.

  7. Avhen:

    ну да, true я могу получить, а вот false будет виден из fatal error. Но в общем, мне этого достаточно

  8. LspMsk:

    открой через file_get_contents файл на 256 мб, как вариант

  9. 01pSpb:

    там будет куча дополнительных расходов и не очень понятно, когда именно скрипт сдохнет

  10. LspMsk:

    будет, и что? задача стоит понять выделилась или нет. либо да, либо нет. Открывается один раз файл на 250мб и если дожили, то отдаем на выход 1, или что там надо.

  11. Avhen:

    $ php -r ‘ini_set(«memory_limit»,»256M»); file_get_contents(file);’

    Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 297502208 bytes) in Command line code on line 1

    В принципе, результат меня устраивает. Спасибо

  12. OkkGood:

    Ну ты же понимаешь что файл на 256 MB займёт в реальности намного больше места в памяти из ZVAL структур?

  13. Avhen:

    $ ls -la test -rw—— — 1 customers 268435456 Июн 4 00:16 test
    $ php -r ‘ini_set(«memory_limit»,»256M»); file_get_contents(test);’

    Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 268443648 bytes) in Command line code on line 1

    8кбайт лишку, но это не намного

  14. Avhen:

    не, ваще хрень какая-то, top показывает совершенно непохожую на ожидаемую информацию. Так что вариант в $foo.= ‘bar’; рулит и педалит

  15. AsaEkb:

    Это смотря чего ты ожидаешь. +8кб это оооочень далеко от истины. Все сильно зависит от того, что ты делаешь. И узнать сколько, например, ты сможешь создать объектиков, зная memory_limit, сильно сложно.
    Вот, вроде бы, адекватная статья — http://habrahabr.ru/post/134784/. Еще, если мне не изменяет память, в xdebug более правильная xdebug_memory_usage().

  16. AsaEkb:

    А 8кб, скорее всего, вообще размер буффера чтения из файла. file_get_contents универсальная функция, поэтому в нее могли не добавить оптимизацию для файлов, и она читает в буффер, и выделяет по мере чтения.

  17. Avhen:

    ну если я делаю большую строку, top мне показывает честные 512Мб при memory_limit 512M, съел файл, сделанный dd if=/dev/zero of=file на ~500Мб и получил 15мбайт в памяти. Правда это файл из нулей, но всё же мне не хватает показательности теста.

  18. Avhen:

    ну, в общем, слишком много нюансов с этим file_get_contents, мне нужен был максимально прозрачный тест. В общем, проблема уже решена.
    Размер строки в php 2Гб в итоге, пошле съесть одной строкой не вышло.

Добавить комментарий