Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: То работает, то не работает...
 
 автор: Владимир55   (04.04.2007 в 17:36)   письмо автору
 
 

Скрипт имеет вот такую структуру:

<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>";
Море других операций.

При настройке работал нормально, но теперь далее последней операции не исполняется (Маршрут - вывод для контроля).

Точнее, дело обстоит так.
Скрипт предназначен для обработки книг. Первую и вторую книги прекрасно обрабатывает, на третьей стабильно зависает! Вот на этом месте.

Почему бы это? Что бы такое проверить?

Можно предположить, что это как-то связано с глобальными переменными. Ибо, "повисев" несколько минут, может и сработать...

   
 
 автор: Trianon   (04.04.2007 в 18:01)   письмо автору
 
   для: Владимир55   (04.04.2007 в 17:36)
 

1.Я не вижу здесь цикла по книгам.
2.Почему Вы полагаете, что скрипт зависает именно в этом месте?
3. Писать stripslashes() без проверки на get_magic_quotes_gpc() весьма рискованно.
Лучше выключить magic quotes в корневом .htaccess, а если сервер - Ваш, то вообще в php.ini

   
 
 автор: Владимир55   (04.04.2007 в 18:33)   письмо автору
 
   для: 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 Мб.

   
 
 автор: Trianon   (04.04.2007 в 18:45)   письмо автору
 
   для: Владимир55   (04.04.2007 в 18:33)
 

чтобы такие контрольные сообщения имели смысл, после них нужно ставить вызов flush();

echo "<br>Вошли во второй файл <br>"; 
flush();

иначе слов "Вошли во второй файл" можно не увидеть, не смотря на то, что оператор echo давным давно выполнился.

   
 
 автор: Владимир55   (04.04.2007 в 19:03)   письмо автору
 
   для: Trianon   (04.04.2007 в 18:45)
 

Так и оказалось, как Вы предрекали: строка с тестовым сообщением исполнялась, а само сообщение не выводилось!

Зато теперь, со сделанной Вами добавкой, диагностическое сообщение можно использовать, перемещая его по телу скрипта, что я и сделал. И получил совершенно новые результаты, а именно: скрипт зависает при обработке сто двадцать девятой страницы! В первой книге было 64 страницы, во второй 99, а в третьей - 130 страниц, и он зависает на предпоследней. Что-то переполняется - может, какой-нибудь буфер памяти или еще что?

Что бы такое проверить?

   
 
 автор: Trianon   (04.04.2007 в 19:13)   письмо автору
 
   для: Владимир55   (04.04.2007 в 19:03)
 

Сложно посоветовать что-либо, не видя скрипта.

   
 
 автор: Владимир55   (04.04.2007 в 20:31)   письмо автору
 
   для: 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

Сообщение о выходе из цикла отсутствует. Стало быть, из цикла не вышел. Но и в цикле его нет, ибо иначе сыпались бы сообщения. Похоже, что ошибка в операторе

if (!$text_ish) break ; 


Или где?

   
 
 автор: XPraptor   (04.04.2007 в 20:42)   письмо автору
 
   для: Владимир55   (04.04.2007 в 20:31)
 

Сколько секунд у вас ограничение на выполнение скриптов PHP? (смотреть в php.ini)
Может время скрипта закончилось. Если разрешена функция set_time_limit, то используйте ее для увеличения времени работы скрипта.

   
 
 автор: Владимир55   (04.04.2007 в 20:51)   письмо автору
 
   для: XPraptor   (04.04.2007 в 20:42)
 

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


$text_ish = file_get_contents($adr_str); 
if (!$text_ish) break ; //  Место сбоя  


Когда $adr_str относится к несуществующему файлу, цикл должен прерываться. А вместо этого он зависает...

Какая то пустяшная синтаксическая ошибка всему причиной!

   
 
 автор: mihdan   (04.04.2007 в 21:05)   письмо автору
 
   для: Владимир55   (04.04.2007 в 20:51)
 


<?php
$text_ish 
file_get_contents($adr_str) or die ('Не смог открыть файл');   
?>

   
 
 автор: Trianon   (04.04.2007 в 20:59)   письмо автору
 
   для: Владимир55   (04.04.2007 в 20:31)
 

Не хватает контрольных точек перед file_get_contents()
и перед закрывающей скобкой тела цикла.

   
 
 автор: Владимир55   (04.04.2007 в 21:11)   письмо автору
 
   для: Trianon   (04.04.2007 в 20:59)
 

На самом деле я поставил контроль и там и в других местах , только постеснялся об этом написать.

Итоговое сообщение:

Цикл закончен 127 (от предпоследнего цикла)

Начало цикла 128
До извлечения адреса 128
адрес sf03/sf03-128.htm
Страница до проверки условия 128
Страница после проверки условия 128
Текст страницы 128 (выводится полный текст)

Вроде бы все, как следует ожидать...

   
 
 автор: Trianon   (04.04.2007 в 21:17)   письмо автору
 
   для: Владимир55   (04.04.2007 в 21:11)
 

Я не предлагал выводить текст страницы.
Я предложил вывести точку конца оператора цикла.

   
 
 автор: Владимир55   (05.04.2007 в 00:54)   письмо автору
 
   для: Trianon   (04.04.2007 в 21:17)
 

Ваша интуиция в очередной раз указала верное направление поиска! Действительно, на последней странице третьей книги цикл не завершается! Там оказалась практически невозможная комбинация текста, по отношению к которой скрипт оказался бессилен. Более того, я и сам не знаю, какую логику применить в этом случае...

А от моей первоначальной гипотезы о причине сбоя реальность оказалась исключительно далека! Большое Вам спасибо за помощь!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования