Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Максимальная длина строки PHP


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

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

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


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

Автор: Ипатьев 4.10.2009, 17:55
А можно поинтересоваться, откуда возник такой странный вопрос?

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

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

Автор: Ипатьев 4.10.2009, 19:49
Ооочень большой блок  - это сколько? 50 мегабайт? 500?
Я правильно понимаю, что код работает без сбоев, а вы на ровном месте придумали себе вопрос?
Послушайте доброго совета: не забивайте себе голову. Исправляйте только те проблемы, которые есть в реальности.

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

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

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

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

Я так понимаю, что речь идет не о размере переменной, а о строках, прописанных в тексте программы? И что - там действительно есть блоки по несколько мегабайт?

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


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

Автор: Ипатьев 4.10.2009, 20:33
"передается" или прописан в скрипте в виде $x="qwerty..."; ?

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

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

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

Автор: Ипатьев 4.10.2009, 20:56
Короче, не морочьте себе голову. Не надо выдумывать проблемы на ровном месте.
При объявлении функции showText желательно писать (&$x). Это будет экономить память. Однако к выдуманной вами проблеме про размер переменных это не имеет никакого отношения. Постарайтесь умерить свою фантазию - это сбережет вам очень много времени.

Автор: WolfAlone 4.10.2009, 21:07
Уважаемый Ипатьев!

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

Автор: Ипатьев 4.10.2009, 21:13
Никаких гарантий нормальности работы "этой бадяги" я дать не могу.
Однако ваши страхи по поводу глюков, происходящих от размера переменных, совершенно беспочвенны. Кроме общей нехватки памяти скрипту, о которой вам и так известно. 

Автор: WolfAlone 4.10.2009, 21:30
Уважаемый Ипатьев!

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

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

На самом деле это заблуждение, я уже не раз в этом форуме приводил http://derickrethans.nl/files/phparch-php-variables-article.pdf ссылку . В 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)

По этому я не рекомендовал бы использовать "&", кроме тех случаев для которых он предназначен и где без него не обойтись.

Автор: NewDima 5.10.2009, 14:32
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) 

Автор: sTa1kEr 5.10.2009, 15:05
Вы не учли
Цитата(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 очевидно занимает значительно больше памяти, чем любые накладные расходы теста.

Автор: NewDima 5.10.2009, 15:45
Код

$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, что-то я подзапутался

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

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

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

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

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

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

Автор: Gro577 2.3.2017, 08:26
Уважаемый Ипатьев.  Немогу не заметить вашу ценность ваших ответов. Они не имеют ни малейшего отношения к вопросу, описанному в теме.  У админов прошу прощения за флуд. Просто крик отчаяния уже от подобных комментаторов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)