| |
|
|
| | Скрипт имеет вот такую структуру:
<form method="POST" >
<textarea rows="1" name="name_dir" cols="20"></textarea>
<input type="submit" value="Начали!" name="B2">
</form>
</body>
</html>
<?php
$name_dir = stripslashes ($_POST['name_dir']);
$adr_name_file_ogl = $name_dir . '/' . $name_dir . '.htm' ;
$file_ogl = file_get_contents($adr_name_file_ogl);
if (!$file_ogl) exit('<br><br>Нет такой папки, или папка пуста');
echo "<br>";
echo "Маршрут";
echo "<br>";
Море других операций.
|
При настройке работал нормально, но теперь далее последней операции не исполняется (Маршрут - вывод для контроля).
Точнее, дело обстоит так.
Скрипт предназначен для обработки книг. Первую и вторую книги прекрасно обрабатывает, на третьей стабильно зависает! Вот на этом месте.
Почему бы это? Что бы такое проверить?
Можно предположить, что это как-то связано с глобальными переменными. Ибо, "повисев" несколько минут, может и сработать... | |
| |
|
|
| |
|
|
| |
для: Владимир55
(04.04.2007 в 17:36)
| | | 1.Я не вижу здесь цикла по книгам.
2.Почему Вы полагаете, что скрипт зависает именно в этом месте?
3. Писать stripslashes() без проверки на get_magic_quotes_gpc() весьма рискованно.
Лучше выключить magic quotes в корневом .htaccess, а если сервер - Ваш, то вообще в php.ini | |
| |
|
|
| |
|
|
| |
для: Trianon
(04.04.2007 в 18:01)
| | | Чтобы локализовать проблему, я разделили скрипт на два файла.
В первом файле оставил только форму ввода:
<html>
<head>
<title>Корректор книжных файлов</title>
</head>
<body bgcolor="#F0F0FF">
<form method="POST" action="inn.php">
<textarea rows="1" name="name_dir" cols="20"></textarea>
<input type="submit" value="Начали!" name="B2">
</form>
</body>
</html>
|
А второй файл сделал обработчиком:
<?php
echo "<br>";
echo "Вошли во второй файл ";
echo "<br>";
$name_dir = stripslashes ($_POST['name_dir']); // Ввыбранная папка с книгой
$adr_name_file_ogl = $name_dir . '/' . $name_dir . '.htm' ; // Это адрес файла оглавления
$file_ogl = file_get_contents($adr_name_file_ogl); //считываем файл оглавления
if (!$file_ogl) exit('<br><br>Нет такой папки, или папка пуста');
Команды обработки книги.
|
Когда я ввожу заведомо ошибочную информацию, мгновенно вызывается файл-обработчик, и я получаю сообщение: "Вошли во второй файл " - это мне для контроля ситуации.
Если же ввожу действительную информацию, то реакция скрипта выявлена такая:
- после первого ввода правильной информации мгновенно появляется сообщение "Вошли во второй файл", успешно и быстро обрабатывается первая книга;
- после второго ввода правильной информации очень нескоро появляется сообщение "Вошли во второй файл", но после него мгновенно и правильно обрабатывается вторая книга. Причем, если при втором вводе указана предыдущая книга, все равно обрабатывается медленно;
- после третьего ввода правильной информации сообщения "Вошли во второй файл" дождаться не удается.
Получается, что работа скрипта очень резко замедляется от раза к разу, проявляется какой-то накопительный эффект. Память 64 Мб. | |
| |
|
|
| |
|
|
| |
для: Владимир55
(04.04.2007 в 18:33)
| | | чтобы такие контрольные сообщения имели смысл, после них нужно ставить вызов flush();
echo "<br>Вошли во второй файл <br>";
flush();
|
иначе слов "Вошли во второй файл" можно не увидеть, не смотря на то, что оператор echo давным давно выполнился. | |
| |
|
|
| |
|
|
| |
для: Trianon
(04.04.2007 в 18:45)
| | | Так и оказалось, как Вы предрекали: строка с тестовым сообщением исполнялась, а само сообщение не выводилось!
Зато теперь, со сделанной Вами добавкой, диагностическое сообщение можно использовать, перемещая его по телу скрипта, что я и сделал. И получил совершенно новые результаты, а именно: скрипт зависает при обработке сто двадцать девятой страницы! В первой книге было 64 страницы, во второй 99, а в третьей - 130 страниц, и он зависает на предпоследней. Что-то переполняется - может, какой-нибудь буфер памяти или еще что?
Что бы такое проверить? | |
| |
|
|
| |
|
|
| |
для: Владимир55
(04.04.2007 в 19:03)
| | | Сложно посоветовать что-либо, не видя скрипта. | |
| |
|
|
| |
|
|
| |
для: Trianon
(04.04.2007 в 19:13)
| | | Проблема локализовалась. Она возникает вот здесь:
$m = - 1 ;
while (++$m <= 10000) // Максимально 10.000 страниц!
{
$name_str = $name_dir . '-' . $m . '.htm' ;
$adr_str = $name_dir . '/' . $name_str ;
$text_ish = file_get_contents($adr_str);
echo "Страница до проверки: " ;
flush();
echo $m ;
echo "<br>" ;
if (!$text_ish) break ; // Место сбоя
echo "Страница после проверки:" ;
flush();
echo "<br>" ;
Другие коды тела скрипта
}
echo "Выход из цикла " ;
flush();
echo "<br>" ;
|
Последние сообщения скрипта перед зависанием:
Страница до проверки: 128
Страница после проверки: 128
Сообщение о выходе из цикла отсутствует. Стало быть, из цикла не вышел. Но и в цикле его нет, ибо иначе сыпались бы сообщения. Похоже, что ошибка в операторе
Или где? | |
| |
|
|
| |
|
|
| |
для: Владимир55
(04.04.2007 в 20:31)
| | | Сколько секунд у вас ограничение на выполнение скриптов PHP? (смотреть в php.ini)
Может время скрипта закончилось. Если разрешена функция set_time_limit, то используйте ее для увеличения времени работы скрипта. | |
| |
|
|
| |
|
|
| |
для: XPraptor
(04.04.2007 в 20:42)
| | | Все гораздо проще: просто у меня не хватает знаний, как прекратить выполнение цикла, когда я пытаюсь открыть несуществующий файл...
$text_ish = file_get_contents($adr_str);
if (!$text_ish) break ; // Место сбоя
|
Когда $adr_str относится к несуществующему файлу, цикл должен прерываться. А вместо этого он зависает...
Какая то пустяшная синтаксическая ошибка всему причиной! | |
| |
|
|
| |
|
|
| |
для: Владимир55
(04.04.2007 в 20:51)
| | |
<?php
$text_ish = file_get_contents($adr_str) or die ('Не смог открыть файл');
?>
|
| |
| |
|
|
| |
|
|
| |
для: Владимир55
(04.04.2007 в 20:31)
| | | Не хватает контрольных точек перед file_get_contents()
и перед закрывающей скобкой тела цикла. | |
| |
|
|
| |
|
|
| |
для: Trianon
(04.04.2007 в 20:59)
| | | На самом деле я поставил контроль и там и в других местах , только постеснялся об этом написать.
Итоговое сообщение:
Цикл закончен 127 (от предпоследнего цикла)
Начало цикла 128
До извлечения адреса 128
адрес sf03/sf03-128.htm
Страница до проверки условия 128
Страница после проверки условия 128
Текст страницы 128 (выводится полный текст)
Вроде бы все, как следует ожидать... | |
| |
|
|
| |
|
|
| |
для: Владимир55
(04.04.2007 в 21:11)
| | | Я не предлагал выводить текст страницы.
Я предложил вывести точку конца оператора цикла. | |
| |
|
|
| |
|
|
| |
для: Trianon
(04.04.2007 в 21:17)
| | | Ваша интуиция в очередной раз указала верное направление поиска! Действительно, на последней странице третьей книги цикл не завершается! Там оказалась практически невозможная комбинация текста, по отношению к которой скрипт оказался бессилен. Более того, я и сам не знаю, какую логику применить в этом случае...
А от моей первоначальной гипотезы о причине сбоя реальность оказалась исключительно далека! Большое Вам спасибо за помощь! | |
| |
|
|