Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Максимальная длина строки PHP, Собственно сабж 
V
    Опции темы
WolfAlone
  Дата 4.10.2009, 17:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


Профиль
Группа: Завсегдатай
Сообщений: 1010
Регистрация: 16.9.2008
Где: Рай

Репутация: нет
Всего: 5



Доброго всем времени суток! Возник следующий вопрос: имеет ли PHP5 ограничение на длинну строки?

Например:
Код

<?
$x="qwerty..."; //Какое максимальное количество символов может содержать дданная переменная??
?>


P.S. Всем спасибо за внимание!

Это сообщение отредактировал(а) WolfAlone - 4.10.2009, 17:52


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
Ипатьев
Дата 4.10.2009, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 1
Всего: 37



А можно поинтересоваться, откуда возник такой странный вопрос?
PM MAIL   Вверх
WolfAlone
  Дата 4.10.2009, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


Профиль
Группа: Завсегдатай
Сообщений: 1010
Регистрация: 16.9.2008
Где: Рай

Репутация: нет
Всего: 5



Да, конечно. Передомной стоит задача, правки кода малоизвестного "самопального" "движка", разработанного видимо, студентом первого курса.  smile 

При инициализации некоторых объектов - в качетве параметров им передаются переменные, которые содержат целые блоки текста (вместе с HTML-тегами), которые впоследствии служат содержимым этих самых блоков. Вот я и подумал, а не могут ли возникать глюки при передаче ооочень большого блока текста, который пытаются запихать в переменную (одну, не массив!)?


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
Ипатьев
Дата 4.10.2009, 19:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 1
Всего: 37



Ооочень большой блок  - это сколько? 50 мегабайт? 500?
Я правильно понимаю, что код работает без сбоев, а вы на ровном месте придумали себе вопрос?
Послушайте доброго совета: не забивайте себе голову. Исправляйте только те проблемы, которые есть в реальности.
PM MAIL   Вверх
WolfAlone
Дата 4.10.2009, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


Профиль
Группа: Завсегдатай
Сообщений: 1010
Регистрация: 16.9.2008
Где: Рай

Репутация: нет
Всего: 5



В реальности я имею систему, которая может дать сбой (а может и не дать). Очень большой блок текста - это на мой взгляд, допустим 3-5Мб. В переменной $x (описана выше), может содержатья 3-5Мб. текста без ошибок? (*Если оперативка хостера позволяет)


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
Ипатьев
Дата 4.10.2009, 20:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 1
Всего: 37



Цитата(WolfAlone @  4.10.2009,  19:59 Найти цитируемый пост)
В реальности я имею систему, которая может дать сбой

Вы понимаете, что этот ваш подход годится только для анекдота?

Цитата(WolfAlone @  4.10.2009,  19:59 Найти цитируемый пост)
В переменной $x (описана выше)

Я так понимаю, что речь идет не о размере переменной, а о строках, прописанных в тексте программы? И что - там действительно есть блоки по несколько мегабайт?
PM MAIL   Вверх
WolfAlone
Дата 4.10.2009, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


Профиль
Группа: Завсегдатай
Сообщений: 1010
Регистрация: 16.9.2008
Где: Рай

Репутация: нет
Всего: 5



Цитата(Ипатьев @  4.10.2009,  20:12 Найти цитируемый пост)
Я так понимаю, что речь идет не о размере переменной, а о строках, прописанных в тексте программы? И что - там действительно есть блоки по несколько мегабайт? 


Да, действительно. Некоторые прайс листы занимают по много (по 1+Мб.), а планируются ещё больше! Текст прайс листа передаётся в виде переменной.


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
Ипатьев
Дата 4.10.2009, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 1
Всего: 37



"передается" или прописан в скрипте в виде $x="qwerty..."; ?
PM MAIL   Вверх
WolfAlone
Дата 4.10.2009, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


Профиль
Группа: Завсегдатай
Сообщений: 1010
Регистрация: 16.9.2008
Где: Рай

Репутация: нет
Всего: 5



Есть некая процедура, например, ShowText, в качестве параметров которой указывается переменная, которую она выводит, примерно вот так:
Код

<?
function showText($x)
{
echo $x;
};

Передаваться может и пару сотен байт текста и примерно 1Мб, а в последствии и пяток (5) Мб, текста (HTML теги + непосредственно текст)...


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
Ипатьев
Дата 4.10.2009, 20:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 1
Всего: 37



Короче, не морочьте себе голову. Не надо выдумывать проблемы на ровном месте.
При объявлении функции showText желательно писать (&$x). Это будет экономить память. Однако к выдуманной вами проблеме про размер переменных это не имеет никакого отношения. Постарайтесь умерить свою фантазию - это сбережет вам очень много времени.
PM MAIL   Вверх
WolfAlone
Дата 4.10.2009, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


Профиль
Группа: Завсегдатай
Сообщений: 1010
Регистрация: 16.9.2008
Где: Рай

Репутация: нет
Всего: 5



Уважаемый Ипатьев!

Из выше сказанного я понял, что работать вся эта "бадяга" будет нормально?


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
Ипатьев
Дата 4.10.2009, 21:13 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2232
Регистрация: 5.7.2009

Репутация: 1
Всего: 37



Никаких гарантий нормальности работы "этой бадяги" я дать не могу.
Однако ваши страхи по поводу глюков, происходящих от размера переменных, совершенно беспочвенны. Кроме общей нехватки памяти скрипту, о которой вам и так известно. 
PM MAIL   Вверх
WolfAlone
  Дата 4.10.2009, 21:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


В экстазе
***


Профиль
Группа: Завсегдатай
Сообщений: 1010
Регистрация: 16.9.2008
Где: Рай

Репутация: нет
Всего: 5



Уважаемый Ипатьев!

Благодарю Вас за активное участие! Буду следовать вашему совету!  smile
Даст Бог, будет работать! Ещё раз спасибо!

Это сообщение отредактировал(а) WolfAlone - 4.10.2009, 21:31


--------------------
И сказал Бог: "Тогда я построю свой мир с блэк-джеком и шлюхами!"

Ф топку Ubuntu, Debian наше фсё!

(с) Евгений Вольф
PM MAIL WWW ICQ Skype   Вверх
sTa1kEr
Дата 5.10.2009, 13:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 5
Всего: 146



Цитата(Ипатьев @  4.10.2009,  21:56 Найти цитируемый пост)
При объявлении функции showText желательно писать (&$x). Это будет экономить память.

На самом деле это заблуждение, я уже не раз в этом форуме приводил эту ссылку . В PHP передача по ссылке не только не экономит память, но и наоборот может потребовать ее в два раза больше.
Если в двух словах, то дело в том, что в PHP в момент передачи любых данных по значению само значение не копирует, вместо этого он увеличивает внутренний счетчик ссылок переменных с этим значением. Однако, если передать по ссылке значение указывающие на более, чем одну переменную, то PHP придется создать полную копию этого значения.
Код

function test1($a) {
    var_dump(memory_get_usage());
}

function test2(&$a) {
    var_dump(memory_get_usage());
}

$a = $b = str_repeat('1234567890', 1024*1024);
test1($a); // int(10601128)
test2($a); // int(21086984)

По этому я не рекомендовал бы использовать "&", кроме тех случаев для которых он предназначен и где без него не обойтись.
PM MAIL   Вверх
NewDima
Дата 5.10.2009, 14:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: -1
Всего: 12



sTa1kEr, Все ваши посты заставляют меня задуматься, этот не исключение. Вижу необъективность в вашем тесте. Вы измеряете используемую память в каждый данный момент. Позвольте привести тест, который отслеживает изменения использования памяти
Код

<?php
function test_with_ref_change(&$a) {
    global $memuse;
    $a[0] = '0';
    var_dump(memory_get_usage()-$memuse);
}
function test_with_ref_nochange(&$a) {
    global $memuse;
    var_dump(memory_get_usage()-$memuse);
}
function test_without_ref_change($a) {
    global $memuse;
    $a[0] = '0';
    var_dump(memory_get_usage()-$memuse);
}
function test_without_ref_nochange($a) {
    global $memuse;
    var_dump(memory_get_usage()-$memuse);
}
$a = str_repeat('1234567890', 1024*1024);
$b = str_repeat('1234567890', 1024*1024);
$c = str_repeat('1234567890', 1024*1024);
$d = str_repeat('1234567890', 1024*1024);

echo "strlen is ".strlen($a)."<br />";

$memuse = memory_get_usage();
echo "Passing by reference with changing<br /><b>";
test_with_ref_change($a);

$memuse = memory_get_usage();
echo "</b><br />Passing by reference without changing<br /><b>";
test_with_ref_nochange($b);

$memuse = memory_get_usage();
echo "</b><br />Passing by value with changing<br /><b>";
test_without_ref_change($c);

$memuse = memory_get_usage();
echo "</b><br />Passing by value without changing<br /><b>";
test_without_ref_nochange($d);

ответ:
Цитата

strlen is 10485760
Passing by reference with changing
int(304)
Passing by reference without changing
int(0)
Passing by value with changing
int(10485776)
Passing by value without changing
int(0) 


Это сообщение отредактировал(а) NewDima - 5.10.2009, 14:36
PM ICQ   Вверх
sTa1kEr
Дата 5.10.2009, 15:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 5
Всего: 146



Вы не учли
Цитата(sTa1kEr @  5.10.2009,  14:04 Найти цитируемый пост)
значение указывающие на более, чем одну переменную

У вас же: одна переменная - одно значение. Вот если бы у вас было
Код

$a = $b = $c = $d = str_repeat('1234567890', 1024*1024);

Тогда бы все 4 переменных указывали на одно значение и что бы передать одну из них по ссылке PHP пришлось бы скопировать значение.
Немного другой пример, демонстрирующий обратное действие:
Код

function test1(&$a) {
    var_dump(memory_get_usage()); // int(10600736)
    _print($a); // Здесь можно было бы написать print($a) или echo $a, эффект был бы тот же.
}

function _print($value) {
    var_dump(memory_get_usage()); // int(21086056) - в два раза больше!
}

$a = str_repeat('1234567890', 1024*1024);
var_dump(memory_get_usage()); // int(10600736)
test1($a); 

Здесь переменная сразу передается по ссылке, но при попытке вывести ее она будет скопирована, т.к. _print принимает параметр не по ссылке. Если бы функция test1 тоже принимала параметр по значению, то переменную не пришлось бы копировать и памяти было бы затрачено столько же int(10600736)
Код

function test1($a) {
    var_dump(memory_get_usage()); // int(10600736)
    _print($a); // Эмуляция echo, или print
}

function _print($value) {
    var_dump(memory_get_usage()); // int(10601296) -- те же 10мб памяти!
}

$a = str_repeat('1234567890', 1024*1024);
test1($a); 


Добавлено @ 15:10
Цитата(NewDima @  5.10.2009,  15:32 Найти цитируемый пост)
Вы измеряете используемую память в каждый данный момент.

Этого достаточно, т.к. строка возвращаемая функцией str_repeat очевидно занимает значительно больше памяти, чем любые накладные расходы теста.

Это сообщение отредактировал(а) sTa1kEr - 5.10.2009, 16:07
PM MAIL   Вверх
NewDima
Дата 5.10.2009, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: -1
Всего: 12



Код

$a = $b = $c = $d = str_repeat('1234567890', 1024*1024);

Цитата

strlen is 10485760
Passing by reference with changing
int(10486104)
Passing by reference without changing
int(10485776)
Passing by value with changing
int(10485776)
Passing by value without changing
int(0) 

Обратите, пожалуйста, внимание на последнее значение

Добавлено через 8 минут и 22 секунды
NewDima, что-то я подзапутался
PM ICQ   Вверх
sTa1kEr
Дата 5.10.2009, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


9/10 программиста
***


Профиль
Группа: Завсегдатай
Сообщений: 1553
Регистрация: 21.2.2007

Репутация: 5
Всего: 146



Цитата(NewDima @  5.10.2009,  16:45 Найти цитируемый пост)
Passing by value without changing
int(0) 

ЧТД. Именно про это я и говорил.

Это сообщение отредактировал(а) sTa1kEr - 5.10.2009, 16:04
PM MAIL   Вверх
NewDima
Дата 5.10.2009, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: -1
Всего: 12



Если кому интересно, составил табличку сравнения
user posted image
Левый столбец - при существующей ЕДИНСТВЕННОЙ ссылке значение
Код

$a = str_repeat('1234567890', 1024*1024); 

Правый столбец - при двух ссылках, одна из которых не используется вообще
Код

$a=$b= str_repeat('1234567890', 1024*1024);   


Это сообщение отредактировал(а) NewDima - 5.10.2009, 17:34
PM ICQ   Вверх
Gro577
  Дата 2.3.2017, 08:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 17.10.2010

Репутация: нет
Всего: нет



Уважаемый Ипатьев.  Немогу не заметить вашу ценность ваших ответов. Они не имеют ни малейшего отношения к вопросу, описанному в теме.  У админов прошу прощения за флуд. Просто крик отчаяния уже от подобных комментаторов.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.1858 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.