не хватает памяти при многократном присваивании переменной большого объёма текста?

alex-v1

Новичок
не хватает памяти при многократном присваивании переменной большого объёма текста?

есть функция преобразования BB-кодов (код ниже).
если на вход функции подать не очень большой текст, то всё нормально - он выводить в браузер без проблем. Но если на вход подать достаточно большой текст, то функция эта ничего не выводит в браузер - пусто и всё. В чём проблема? подскажитье.
я думаю что памяти не хватает, т.к. в функции немало строчек форматирования текста и присваивания его переменной $msg. Пробовал уменьшить количество $msg=str_replace и $msg=preg_replace строчек в коде и тогда текст выводится... такая проблема. Как её решить?

PHP:
   function show_message($msg)
{		
  global $img_dir;
	  
  $msg = str_replace("\n",'<br />', trim($msg));
	  
  // отступ 
  $msg = str_replace("[indent]",'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', $msg);
	  
  // цитата 
  $msg = preg_replace('/\[quote="([^\[]+)"\]/i', '<div align="center"><table cellspacing="0" cellpadding="2" class=quote_table><tr><td class=head_quote_cell><font class=head_quote_font>цитата собеседника  "\\1"</font></td></tr><tr><td class=msg_quote_cell><font class=msg_quote_font>', $msg);
  $msg = str_replace("[/quote]",'</font></td></tr></table></div>',$msg);
	  
  // жирный 
  $msg = str_replace("[b]",'<b>',$msg);
  $msg = str_replace("[/b]",'</b>',$msg);

  // наклон 
  $msg = str_replace("[i]",'<i>',$msg);
  $msg = str_replace("[/i]",'</i>',$msg);

  // подчеркнут 
  $msg = str_replace("[uu]",'<u>',$msg);
  $msg = str_replace("[/uu]",'</u>',$msg);
   
  // цвет шрифта 
  $msg = preg_replace('/\[color="([^\[]+)"\]/i', '<font color="\\1">',$msg);
  $msg = str_replace("[/color]",'</font>',$msg);

  // размеры шрифта
  $msg = preg_replace('/\[size="([^\[]+)"\]/i', '<font size="\\1">',$msg);
  $msg = str_replace("[/size]",'</font>',$msg);   
	  
  // гипер-ссылка
  $msg = preg_replace('/\[url="([^\[]+)"\]/i', '<a href="\\1">',$msg);
  $msg = str_replace("[/url]",'</a>',$msg);   

  // выравнивание
  $msg = preg_replace('/\[align="([^\[]+)"\]/i', '<div align="\\1">',$msg);
  $msg = str_replace("[/align]",'</div>',$msg);   
	  
  // изображение
  $msg = preg_replace('/\[img="([^\[]+)"\]/i', '<img src="'.$img_dir.'\\1">',$msg);
      
   echo('<font class=default_msg_font>'.$msg.'</font>');
 }
 

mity

Новичок
Попробуйте в настройках PHP задать по больше лимит памяти
php.ini
Код:
;лимит в 128 мегабайт
memory_limit = 128M
В контрольных точках Ваших функций вставьте
PHP:
error_log(__FILE__." ".__LINE__." use ".memory_get_usage()." Bytes, ".strlen($msg)." Bytes");
и смотрите в error.log
сколько реально используется памяти
 

alex-v1

Новичок
спасибо.
...проблема в том, что я не могу менять php.ini , так как сайт этот на хостинге одной компании.
Как быть?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
alex-v1
ini_set() пробовал?
 

alex-v1

Новичок
нет. с каким ключём его юзать?
подскажите код пожалуйста.
 

mity

Новичок
не факт что ini_set или .htaccess будет работать

.htaccess
Код:
php_value memory_limit 128M
Но даже если лимит памяти изменить не удастся стоит посмотреть реальное использование памяти скриптом

если просмотр логов не доступен, тогда есть альтернативная функция создания лога
PHP:
function error_log_($FileName,$Text){
  if($fp=@fopen($_SERVER['DOCUMENT_ROOT']."/$FileName","a+")){ 
    @flock ($fp,LOCK_EX);
    fwrite($fp,str_replace(array("\r\n","\r","\n"),"",$Text)."\r\n");
    fclose($fp);
   };
};


error_log_("123.log",__FILE__." ".__LINE__." use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes");



//Попытаться установить новый лимит памяти, как правило настройками хосинга такая возможность отключена
ini_set("memory_limit",128000000);


//вывод текущего лимита
echo ini_get("memory_limit");
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
alex-v1
Если у тебя выходит пустой экран, то советую сделать следующее:

В самом начале скрипта написать
error_reporting(E_ALL);
ini_set('display_errors', 1);

Повторить попытки передать большой текст и посмотреть, выведется ли сообщение об ошибке на экран. Дальше плясать уже от того, что тебе вывалилось на экран.
 

alex-v1

Новичок
mity, после ini_set("memory_limit",128000000)
ini_get выдаёт 128000000
но проблема осталась...

c0dex, после
error_reporting(E_ALL);
ini_set('display_errors', 1);

на экране тоже нет ничего - пусто и всё
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Хм, это конечно интересно, логов нет я так понимаю, да?

И зачем сие шаманство? $msg = str_replace("",'<i>',$msg); Местами не перепутал ничего?
 

mity

Новичок
ini_get может не корректно выдавать результат, если пытались изменить лимит

PHP:
function error_log_($FileName,$Text){ 
  if($fp=@fopen($_SERVER['DOCUMENT_ROOT']."/$FileName","a+")){  
    @flock ($fp,LOCK_EX); 
    fwrite($fp,str_replace(array("\r\n","\r","\n"),"",$Text)."\r\n"); 
    fclose($fp); 
   }; 
};
//------------------------------------------------------------------------

function show_message($msg) 
{         
  global $img_dir; 
error_log_("123.log",__FILE__." ".__LINE__."BEGIN use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes");       
  $msg = str_replace("\n",'<br />', trim($msg)); 
error_log_("123.log",__FILE__." ".__LINE__." use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes");
       
  // отступ  
  $msg = str_replace("[indent]",'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;', $msg); 
error_log_("123.log",__FILE__." ".__LINE__." use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes");
       
  // цитата  
  $msg = preg_replace('/\[quote="([^\[]+)"\]/i', '<div align="center"><table cellspacing="0" cellpadding="2" class=quote_table><tr><td class=head_quote_cell><font class=head_quote_font>цитата собеседника  "\\1"</font></td></tr><tr><td class=msg_quote_cell><font class=msg_quote_font>', $msg); 
error_log_("123.log",__FILE__." ".__LINE__." use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes");

  $msg = str_replace("[/quote]",'</font></td></tr></table></div>',$msg); 
error_log_("123.log",__FILE__." ".__LINE__." use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes");       
  // жирный  
  $msg = str_replace("",'<b>',$msg);
error_log_("123.log",__FILE__." ".__LINE__." use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes");
  $msg = str_replace("",'</b>',$msg);

error_log_("123.log",__FILE__." ".__LINE__." use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes");
  // наклон  
  $msg = str_replace("",'<i>',$msg); 
error_log_("123.log",__FILE__." ".__LINE__." use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes");
  $msg = str_replace("",'</i>',$msg); 
error_log_("123.log",__FILE__." ".__LINE__." use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes");

  // подчеркнут  
  $msg = str_replace("[uu]",'<u>',$msg); 
error_log_("123.log",__FILE__." ".__LINE__." use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes");
  $msg = str_replace("[/uu]",'</u>',$msg);
error_log_("123.log",__FILE__." ".__LINE__." use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes");

//И до конца функции
...
...
...

 echo('<font class=default_msg_font>'.$msg.'</font>');
error_log_("123.log",__FILE__." ".__LINE__."END use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes");       
};


//========================================================
//исправьте 
str_replace("",'<b>',$msg);
на 
str_replace("[b]",'<b>',$msg);

А дальше смотреть лог
 

alex-v1

Новичок
вообщем код изменил так:

PHP:
   function show_message($msg)
   {		
	  global $img_dir;
	  
	  // перенос строки
	  $patterns[0] = "/\n/";
	  $replacements[0] = "<br>"; 

	  // отступ [indent]
	  $patterns[1] = "/\[indent\]/";
	  $replacements[1] = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"; 

	  // цитата [quote]
	  $patterns[2] = '/\[quote="([^\[]+)"\]/i';
	  $replacements[2] = '<div align="center"><table cellspacing="0" cellpadding="2" class=quote_table><tr><td class=head_quote_cell><font class=head_quote_font>цитата собеседника  "\\1"</font></td></tr><tr><td class=msg_quote_cell><font class=msg_quote_font>'; 
	  $patterns[3] = "/\[quote\]/";
	  $replacements[3] = '<div align="center"><table cellspacing="0" cellpadding="2" class=quote_table><tr><td class=head_quote_cell><font class=head_quote_font>цитата собеседника</font></td></tr><tr><td class=msg_quote_cell><font class=msg_quote_font>'; 
	  $patterns[4] = "/\[\/quote\]/";
	  $replacements[4] = "</font></td></tr></table></div>"; 

	  // жирный [b]
	  $patterns[5] = "/\[b\]/";
	  $replacements[5] = "<b>"; 
	  $patterns[6] = "/\[\/b\]/";
	  $replacements[6] = "</b>"; 
	  
	  // наклон [i]
	  $patterns[7] = "/\[i\]/";
	  $replacements[7] = "<i>"; 
	  $patterns[8] = "/\[\/i\]/";
	  $replacements[8] = "</i>"; 

	  // подчеркнут [u]
	  $patterns[9] = "/\[u\]/";
	  $replacements[9] = "<u>"; 
	  $patterns[10] = "/\[\/u\]/";
	  $replacements[10] = "</u>"; 

	  // цвет шрифта [color="..."]
	  $patterns[11] = '/\[color="([^\[]+)"\]/i';
	  $replacements[11] = '<font color="\\1">'; 
	  $patterns[12] = "/\[\/color\]/";
	  $replacements[12] = "</font>"; 

	  // размеры шрифта [size="..."]
	  $patterns[13] = '/\[size="([^\[]+)"\]/i';
	  $replacements[13] = '<font size="\\1">'; 
	  $patterns[14] = "/\[\/size\]/";
	  $replacements[14] = "</font>"; 

	  // гипер-ссылка [url="..."]
	  $patterns[15] = '/\[url="([^\[]+)"\]/i';
	  $replacements[15] = '<a href="\\1">'; 
	  $patterns[16] = "/\[\/url\]/";
	  $replacements[16] = "</a>"; 

	  // выравнивание [align="..."]
	  $patterns[17] = '/\[align="([^\[]+)"\]/i';
	  $replacements[17] = '<div align="\\1">'; 
	  $patterns[18] = "/\[\/align\]/";
	  $replacements[18] = "</div>"; 

	  // изображение [img="..."]
	  $patterns[19] = '/\[img="([^\[]+)"\]/i';
	  $replacements[19] = '<img src="'.$img_dir.'\\1">'; 
	  
	  $msg = str_replace('[quote=""]','[quote]',$msg);	  
	  $this->error_log_("123.log",__FILE__." ".__LINE__."BEGIN use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes");
	  	  
	  $msg = preg_replace($patterns, $replacements, $msg);
	  $this->error_log_("123.log",__FILE__." ".__LINE__."BEGIN use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes");
	  
	  echo('<font class=default_msg_font>'.$msg.'</font>');
   }
вот содержимое файла 123.log

/home/christia/public_html/Site_class.php 232BEGIN use 786432 Bytes, 102271 Bytes
/home/christia/public_html/Site_class.php 235BEGIN use 524288 Bytes, 0 Bytes
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
в исходнике html, выводимом браузером есть хоть что-то после того, как скрипт отвалился, или нет? Вопрос про логи остается.
 

alex-v1

Новичок
вот что в исходнике:
<font class=default_msg_font></font>

а логи я выложил. см содержимое файла 123.log
 

mity

Новичок
Я так понимаю что это вывод в лог вызывающий крах

а что выводит простой скрипт ?
PHP:
<?php
echo ini_get("memory_limit");
?>

Закончите функцию так
PHP:
$msg = str_replace('[quote=""]','[quote]',$msg);       
      $this->error_log_("123.log",__FILE__." ".__LINE__." use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes"); 
             
      $msg = preg_replace($patterns, $replacements, $msg); 
      $this->error_log_("123.log",__FILE__." ".__LINE__." use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes"); 
       
      echo('<font class=default_msg_font>'.$msg.'</font>');

      $this->error_log_("123.log",__FILE__." ".__LINE__." use ".memory_get_usage(true)." Bytes, ".strlen($msg)." Bytes"); 
};
и посмотрите будет ли в логах записи после echo

-~{}~ 19.04.10 16:26:

Судя по тому что в исходнике
<font class=default_msg_font></font>

Ошибка возникает в другом месте скрипта

Расставляйте контрольные точки по скриптам
PHP:
error_log_("123.log",__FILE__." ".__LINE__." use ".memory_get_usage(true));
и смотрите где внезапно прекращается выполнение

Логи апача (error.log) можно увидеть?
 

alex-v1

Новичок
скрипт ваш выводит:
32М

закончил функцию как вы написали и после этого в логе вот это:

/home/christia/public_html/Site_class.php 232 use 786432 Bytes, 102271 Bytes
/home/christia/public_html/Site_class.php 235 use 524288 Bytes, 0 Bytes
/home/christia/public_html/Site_class.php 239 use 524288 Bytes, 0 Bytes

-~{}~ 19.04.10 16:29:

исходя из логов видно что длина строки $msg обнуляется после выполнения preg_replace
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
А там выполнение не прекращается)
Кто-то видимо что-то неправильно написал. И preg_replace возвращает null.

var_dump($msg); после preg_replace строчки сделай и посмотри.
 

alex-v1

Новичок
у меня на хостинге тока файл error_log.
вот что там:

[23-Sep-2008 21:55:38] PHP Parse error: syntax error, unexpected T_ECHO in /home/christia/public_html/qwe.php on line 6
[05-Apr-2010 05:01:28] PHP Warning: mysql_connect() [<a href='function.mysql-connect'>function.mysql-connect</a>]: Access denied for user 'root'@'localhost' (using password: NO) in /home/christia/public_html/BD_class.php on line 19
[05-Apr-2010 05:03:22] PHP Warning: mysql_connect() [<a href='function.mysql-connect'>function.mysql-connect</a>]: Access denied for user 'root'@'localhost' (using password: NO) in /home/christia/public_html/BD_class.php on line 19
[05-Apr-2010 06:59:47] PHP Warning: mysql_connect() [<a href='function.mysql-connect'>function.mysql-connect</a>]: Access denied for user 'root'@'localhost' (using password: NO) in /home/christia/public_html/BD_class.php on line 19
[05-Apr-2010 07:00:43] PHP Warning: mysql_connect() [<a href='function.mysql-connect'>function.mysql-connect</a>]: Access denied for user 'root'@'localhost' (using password: NO) in /home/christia/public_html/BD_class.php on line 19
[05-Apr-2010 07:00:48] PHP Warning: mysql_connect() [<a href='function.mysql-connect'>function.mysql-connect</a>]: Access denied for user 'root'@'localhost' (using password: NO) in /home/christia/public_html/BD_class.php on line 19
[05-Apr-2010 07:01:18] PHP Warning: mysql_connect() [<a href='function.mysql-connect'>function.mysql-connect</a>]: Access denied for user 'root'@'localhost' (using password: NO) in /home/christia/public_html/BD_class.php on line 19
[05-Apr-2010 07:01:21] PHP Warning: mysql_connect() [<a href='function.mysql-connect'>function.mysql-connect</a>]: Access denied for user 'root'@'localhost' (using password: NO) in /home/christia/public_html/BD_class.php on line 19
[06-Apr-2010 03:28:47] PHP Fatal error: Call to undefined function exho() in /home/christia/public_html/BD_class.php on line 148
[10-Apr-2010 10:20:45] PHP Warning: session_start() [<a href='function.session-start'>function.session-start</a>]: Cannot send session cache limiter - headers already sent (output started at http://client.regmefast.org/inc_footer_baner.php:12) in /home/christia/public_html/Login_class.php on line 41
[19-Apr-2010 06:20:01] PHP Notice: A session had already been started - ignoring session_start() in /home/christia/public_html/Login_class.php on line 41
[19-Apr-2010 06:20:01] PHP Notice: A session had already been started - ignoring session_start() in /home/christia/public_html/Login_class.php on line 41
[19-Apr-2010 06:20:44] PHP Notice: A session had already been started - ignoring session_start() in /home/christia/public_html/Login_class.php on line 41
[19-Apr-2010 06:20:44] PHP Notice: A session had already been started - ignoring session_start() in /home/christia/public_html/Login_class.php on line 41
[19-Apr-2010 06:20:44] PHP Notice: A session had already been started - ignoring session_start() in /home/christia/public_html/Login_class.php on line 41
[19-Apr-2010 06:23:40] PHP Warning: session_start() [<a href='function.session-start'>function.session-start</a>]: Cannot send session cache limiter - headers already sent (output started at /home/christia/public_html/config.php:7) in /home/christia/public_html/Login_class.php on line 41
[19-Apr-2010 06:25:35] PHP Notice: A session had already been started - ignoring session_start() in /home/christia/public_html/Login_class.php on line 41
[19-Apr-2010 06:25:35] PHP Notice: A session had already been started - ignoring session_start() in /home/christia/public_html/Login_class.php on line 41
 

mity

Новичок
данная функция отработала нормально, памяти предостаточно

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

mity

Новичок
У Вас не в памяти проблема, не вводите людей в заблуждение
У Вас что то с регулярными выражениями

Далайте замены по одной и смотрите, где происходит обнуление $msg
 
Сверху