1 (изменено: Mark, 2006-04-19 13:55:19)

Тема: поиск в таблице приводит к пожиранию памяти Apache и выдаёт пусто (+)

При поиске Apachе начинает кушать память в пределах 200-300 МБ (всего оперативки 248 МБ), потом отдаёт её и браузер выдаёт пустую страницу. Весь процесс происходит в течение 2-3х минут, комп тормозит.
Проблема появляется в 8 случаях из 10, причину не установил.
Как лечить?
Windows XP SP1, Apache 1.3.33, PHP 5.1.2, phpMyAdmin 2.8.0.3, Firefox 1.5.0.2

2

Re: поиск в таблице приводит к пожиранию памяти Apache и выдаёт пусто (+)

Mark
Что Апач в логи пишет?

Нет неразрешимых проблем, есть неприятные решения. (Э. Борн)

3 (изменено: Mark, 2006-04-20 10:25:36)

Re: поиск в таблице приводит к пожиранию памяти Apache и выдаёт пусто (+)

[Thu Apr 20 10:55:18 2006] [error] PHP Fatal error:  Maximum execution time of 30 seconds exceeded in d:\\...\\libraries\\string.lib.php on line 90
Вот код из этого файла. 90-я строка помечена жирным
function PMA_substr($string, $start, $length = 2147483647)
{
  if (defined('PMA_MULTIBYTE_ENCODING') || $GLOBALS['PMA_allow_mbstr']) {
        return mb_substr($string, $start, $length);
    } else {
        return substr($string, $start, $length);
    }
}

В common.lib есть такая строка
define('PMA_MULTIBYTE_ENCODING', 1);

заглядываю периодически в error.log, увидел такую строку
Notice:  Undefined offset:  1 in d:\\...\\libraries\\common.lib.php on line 925

common.lib, функция PMA_mysqlDie, строка помечена жирным:
        if (substr($error_message, 1, 4) == '1062') {
            // get the duplicate entry

            // get table name
            // TODO: what would be the best delimiter, while avoiding
            // special characters that can become high-ascii after editing,
            // depending upon which editor is used by the developer?
            $error_table = array();
            preg_match('@ALTER\sTABLE\s\`([^\`]+)\`@iu', $the_query, $error_table);
            $error_table = $error_table[1];

            // get fields
            $error_fields = array();
            preg_match('@\(([^\)]+)\)@i', $the_query, $error_fields);
            $error_fields = explode(',', $error_fields[1]);

4

Re: поиск в таблице приводит к пожиранию памяти Apache и выдаёт пусто (+)

Mark сказал:

.....
Windows XP SP1, Apache 1.3.33, PHP 5.1.2, phpMyAdmin 2.8.0.3, Firefox 1.5.0.2.....

а какой мускул юзаешь ?

5

Re: поиск в таблице приводит к пожиранию памяти Apache и выдаёт пусто (+)

MySQL 4.0.21

6 (изменено: Rash, 2006-04-21 21:12:41)

Re: поиск в таблице приводит к пожиранию памяти Apache и выдаёт пусто (+)

Mark
в php.ini попробуй изменить значение директивы max_execution_time, которая определяет лимит времени отведенный на выполнение скрипта. По умолчанию - 30 секунд, увеличь его до 60

7

Re: поиск в таблице приводит к пожиранию памяти Apache и выдаёт пусто (+)

Rash сказал:

Mark
в php.ini попробуй изменить значение директивы max_execution_time, которая определяет лимит времени отведенный на выполнение скрипта. По умолчанию - 30 секунд, увеличь его до 60

Вываливание по таймауту - это не причина отжирания памяти, а её следствие, IMHO.
Не вижу, как связано увеличение потребления памяти и время работы скрипта. При 30 сек. таймауте комп просто висит около 3-х минут. Босюь, при 60 секундах он просто провисит дольше.

8 (изменено: Rash, 2006-04-25 21:32:47)

Re: поиск в таблице приводит к пожиранию памяти Apache и выдаёт пусто (+)

Не вижу, как связано увеличение потребления памяти и время работы скрипта.

lol  Не видишь? По-твоему серверу все равно выполняется импорт дампа размером в 50 Мегабайт и вставкой нескольких тысяч записей, или запрос-вставка одной записи? Я тебе подскажу - ему будет не все равно.

Ошибка  порождена PHP, который просто не стал дожидаться окончания работы скрипта и "завернул" процесс, соответственно phpMyAdmin выдал тебе пустое окно.

Босюь, при 60 секундах он просто провисит дольше.

Бояться не надо - надо делать, а если не получается, тогда проверять свою конфигурацию и искать ошибку.

Какой размер дампа? Какую кодировку используешь?

9

Re: поиск в таблице приводит к пожиранию памяти Apache и выдаёт пусто (+)

Rash сказал:
Mark сказал:

Не вижу, как связано увеличение потребления памяти и время работы скрипта.

lol  Не видишь? По-твоему серверу все равно выполняется импорт дампа размером в 50 Мегабайт и вставкой нескольких тысяч записей, или запрос-вставка одной записи? Я тебе подскажу - ему будет не все равно.

Ошибка  порождена PHP, который просто не стал дожидаться окончания работы скрипта и "завернул" процесс, соответственно phpMyAdmin выдал тебе пустое окно.

Всё равно не вижу. Я не выполняю никаких ресурсоёмких операций, я делаю поиск по таблице из трёх строк. Никаких импртов и вставок (это написано в первом посте).

Rash сказал:
Mark сказал:

Босюь, при 60 секундах он просто провисит дольше.

Бояться не надо - надо делать, а если не получается, тогда проверять свою конфигурацию и искать ошибку.

Не побоялся. Скрипт провисел дольше с такой же ошибкой. Увеличить интервал до 180 секунд?
[Wed Apr 26 10:33:38 2006] [error] PHP Fatal error:  Maximum execution time of 60 seconds exceeded in d:\\...\\tbl_select.php on line 9

Rash сказал:

Какой размер дампа? Какую кодировку используешь?

Размер дампа - 0 байт, кодировка win1251.

Заметил, что при поиске по ID падает реже, чем при поиске по фрагменту строки (like '%aaa').
Какие ещё варианты решения проблемы?

10

Re: поиск в таблице приводит к пожиранию памяти Apache и выдаёт пусто (+)

Mark, ты не прав, считая что серверу все равно с какими объемами данных работать, тем более когда дело касается поиска. Ведь ты сам не уточнил в начале темы исходные данные - неточность породила лишние вопросы.

Rash, сильно сказано:

Бояться не надо - надо делать, а если не получается, тогда проверять свою конфигурацию и искать ошибку.

прямо как "Бороться, искать, найти и не сдаваться" big_smile

Какие ещё варианты решения проблемы?

подключить модуль mbstring.

Нет неразрешимых проблем, есть неприятные решения. (Э. Борн)

11

Re: поиск в таблице приводит к пожиранию памяти Apache и выдаёт пусто (+)

Lokki сказал:

подключить модуль mbstring.

Подключил. Проблема осталась без изменений.
Инфа из phpinfo():
mbstring
Multibyte Support     enabled
Multibyte string engine     libmbfl
Multibyte (japanese) regex support     enabled
Multibyte regex (oniguruma) version     3.7.1

mbstring extension makes use of "streamable kanji code filter and converter", which is distributed under the GNU Lesser General Public License version 2.1.

Directive    Local Value    Master Value
mbstring.detect_order    no value    no value
mbstring.encoding_translation    Off    Off
mbstring.func_overload    0    0
mbstring.http_input    pass    pass
mbstring.http_output    pass    pass
mbstring.internal_encoding    ISO-8859-1    no value
mbstring.language    neutral    neutral
mbstring.strict_detection    Off    Off
mbstring.substitute_character    no value    no value

12

Re: поиск в таблице приводит к пожиранию памяти Apache и выдаёт пусто (+)

Mark
К сожалению не могу воспроизвести твою проблему. Пиши репорт разработчикам, потом напишешь в чем была проблема.

Нет неразрешимых проблем, есть неприятные решения. (Э. Борн)