Максимальное кол-во записей в массиве

Тема в разделе "PHP", создана пользователем yeaahhh, 8 окт 2014.

Статус темы:
Закрыта.
Модераторы: latteo
  1. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    Привет, друзья. Скажите, пожалуйста, какое максимальное количество записей может содержать в себе массив?
    Зависит ли это от ресурсов, которые выделяет хостинг на операцию?

    Парсю информацию.. Если записей ~50-100 - все ок..
    Если больше возвращается пустой массив.

    Проясните, пожалуйста, ситуацию и от чего она зависит. Заранее огромное спасибо!
     
  2. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.546
    Симпатии:
    1.418
    Насколько оперативки хватит на столько и создать можно, вот к примеру на миллион элементов (на большинстве хостингов должно сработать) :
    PHP:
    var_dump(count(range(01000000)));
    Если RAM не хватит скрипт упадёт по Fatal error: Allowed memory size of --- bytes exhausted (tried to allocate -- bytes)

    Раз массив пустой - проблема с парсингом.
     
    yeaahhh нравится это.
  3. mo.Lex

    mo.Lex Создатель

    Регистр.:
    5 окт 2014
    Сообщения:
    13
    Симпатии:
    9
    Вас скорее всего отрезает от источника. Попробуйте вывести сорс источника при большом массиве. Парсите через Curl?
     
    yeaahhh нравится это.
  4. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    Парсю через curl..
    страница парсится вся..
    В переменной $otv - весь код страницы..
    а после
    Код:
    preg_match_all("|<table width='100%' cellspacing='0' align='center' class='b'(.*)</td></tr></table><br>|sU", $otv, $ss);
    $ss - пуст..

    И это именно там, где большое кол-во записей для массива..
     
  5. warg

    warg Постоялец

    Регистр.:
    26 июн 2007
    Сообщения:
    129
    Симпатии:
    138
    так preg_match_all в данном случае и перетирает $ss.
    третий параметр это массив куда возвращаются все совпадения с шаблоном.
     
    yeaahhh нравится это.
  6. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    $otv - в данной переменной содержится код страницы.
    $ss - массив, который после preg_match_all-выборки по шаблону содержит нужные данные.. Так и нужно, все верно..
     
  7. warg

    warg Постоялец

    Регистр.:
    26 июн 2007
    Сообщения:
    129
    Симпатии:
    138
    тогда, возможно, срабатывают лимиты самого PCRE.
    нужно проверить не случилось ли чего с preg_last_error().
    попробовать увеличить значения pcre.backtrack_limit и pcre.recursion_limit.
    еще как вариант, если это конечно позволяет структура документа, разбить поиск на несколько частей.
     
    mo.Lex, latteo и yeaahhh нравится это.
  8. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    preg_last_error() возвращает 2.. Похоже дело в pcre.backtrack_limit ?
    на обычном хостинге без доступа к php.ini никак не увеличить данную директиву?)

    добавил
    Код:
    ini_set('pcre.backtrack_limit', 1500000); 
    не помогло(
     
    Последнее редактирование: 8 окт 2014
  9. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.546
    Симпатии:
    1.418
    Смотри, что вернул ini_set - может не получилось установить и через ini_get проверь поменялось ли значение

    Приложи свой $otv атачем или через ФО, если не секретно. Может там баг в регулярке
     
    yeaahhh нравится это.
  10. warg

    warg Постоялец

    Регистр.:
    26 июн 2007
    Сообщения:
    129
    Симпатии:
    138
    именно в нем.
    ну тогда тут только два варианта.
    первый - как предложил latteo - отлаживать регулярку.
    вот хорошее описание как отлавливать такого рода проблемы:
    http://www.regular-expressions.info/catastrophic.html
    второй - использовать другой подход для парсинга нужных данных, например simplehtmldom.
     
    yeaahhh нравится это.
Статус темы:
Закрыта.