Доброго времени суток.
Уважаемые специалисты, подскажите пожалуйста, может ли вывод переменной через var_dump или print_r "убить" скрипт?
В браузере "белая" страница, в логах
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted
PHP Fatal error: Unknown: Cannot use output buffering in output buffering display handlers in Unknown on line 0
В публичной части битрикса: Да, могут, но оочень большой переменной (например объекта с вложенными объектами)
Если внимательно читать документацию по Битриксу, а именно: https://dev.1c-bitrix.ru/api_help/main/general/pag...
Можно заметить, что вывод не направляется сразу в браузер, а с шага 1.14 до 5.2 происходит буферизация вывода.
Соответственно при достижении определенного лимита - скрипт упадет.
enigma2030, если нет буферизации, то тут Вам товарищ Дмитрий уже ответил - подвесят и могут крашнуть браузер (было такое на Mozilla Firefox пару раз), но на скрипт не повлияют.
Андрей Николаев Благодарю за ответ, теперь буду знать что при использовании var_dump с объектом большой вложенности может быть такой "сюрприз". В практике еще не встречалось такое поведение, поэтому и обескуражило, как без вывода все работает, а с выводом все "падает".
Максим Тимофеев В вашем примере у вас Василий будет выводится до окончания памяти. Потому что у вас конструкция функции такая, а у нас же немного иная ситуация. Есть функция в которую приходит всего один аргумент, это объект. И если внутри этой функции попытаться его var_dump то все, "приехали", а если нет то все работает нормально.
enigma2030, Идея в том же. Недостаток памяти. Я всего лишь проиллюстрировал, что Вы вините Васю, в то время, как виною бесконечный цикл.
Ваш объект уже занимает память, плюс что-то еще занимает память, в какой-то момент ее не хватает. В Вашем случае при var_dump, но виноват не var_dump, а нехватка памяти. Решается ее увеличением, а лучше оптимизацией Вашего кода. К тому же Ваш объект может запросто иметь в себе бесконечный цикл.
Максим Тимофеев Странно получается) Техподдержка говорит, что именно данная конструкция виновна в падении. Ей якобы "не место" там, ибо без нее же все работает нормально. Т.е. работа с объектом в функции проходит нормально.
Нехватка памяти происходит именно в момент использования var_dump. Получается якобы var_dump при попытке отобразить объект выедает всю память.
Начало: 1604648
До создание двух массивов: 45496216
После создание двух массивов: 55982072
До var_dump: 55982024
После var_dump: 56022992
Не сказать что память прям изрядно потратилась именно на вывод. Если постепенно увеличивать количество итераций то скрипт "помрет", но именно разница в памяти до и после var_dump будет примерно одна и та же в процентном соотношении.
Ваш объект уже занимает память, плюс что-то еще занимает память, в какой-то момент ее не хватает. В Вашем случае при var_dump, но виноват не var_dump, а нехватка памяти. Решается ее увеличением, а лучше оптимизацией Вашего кода. К тому же Ваш объект может запросто иметь в себе бесконечный цикл.
Код не мой, это коммерческая разработка и я использую то что поставляется в коробке.
Скажу больше, проанализировав API, получается воссоздать такой же функционал в котором var_dump не "вешает" скрипт, только благодаря это удалось "заглянуть" в эту переменную чтобы работать с ее содержимым.
От этого еще все запутанней, ТП говорит виноват var_dump, здесь почти все говорят что не он виноват, а именно объект. Но при попытке реализовать ту же логику своими силами все работает прекрасно)
Но надо использовать все из "коробки" ибо совместимость, обновления и бла бла бла.
Вы налили в стакан на 100мл 99мл воды, потом добавили 2мл вода перелилась. Я говорю стакан больше возьмите или от 99 отчерпните. А Вы мне про "ну я ж всего 2мл добавил"