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

Форум PHP

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

 

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

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

тема: Maximum execution time of 30 seconds(файлы+UPDATE)
 
 автор: Лена   (17.01.2009 в 22:50)   письмо автору
 
 

При загрузке файлов на сервер заношу данные про текстовый файл в базу(id, название и т.д.). Есть поле offset, куда вставляются смещения по тексту, если текст большой и его нужно разбить на страницы. Например, offset = 200,400,600.
Но скрипт про смещения я написала позже, чем грузила данные про файлы в базу, в итоге, в некоторых рядах поле offset пустое.
Для того, чтобы это исправить, составила скрипт, где хочу пройтись по всем директориям, в которых лежат тексты, и разбить их по смещению, а данные занести в базу.

Вот он:

<?php
include("configs/dbopen.php");
function 
insert_offset($dir){ 
if(!(
$dp=opendir($dir))) die ("Not exist $dir"); 
while (
false !== ($file=readdir($dp))){ 
    if (
is_dir($dir "/" .$file)) { 
        if (
$file!='.' && $file!='..'){ 
        
insert_offset($dir "/" .$file); 
        } 
    }else{
        
$fp fopen($dir "/" $file"r") or die('Could not open file'); 
        
flock($fpLOCK_EX); 
        
$text fread($fpfilesize($dir "/" $file)) . "<br>"
        
$size str_word_count($text); //число слов во всем тексте
        
$number 600//число слов на одной странице 
        
if($size $number){
            
$all_lenth= array(); //смещения в файле 
            
$len_offs ""//разность смещений 
               
$str "/([^\s]+\s+){" $number "}/"
            
preg_match_all ($str$text$out); 
            for(
$i 0;$i<count($out[0]);$i++){ 
            
$len strlen($out[0][$i]); 
            
$len_offs += $len;
            
$all_lenth[] = $len_offs;
            }
        
//объединяем все элементы
        
$all_offset implode(","$all_lenth);
        
//помещаем данные в базу        
        
$filename basename($dir "/" $file".txt");
        
$sql "UPDATE texts SET offset = '" $all_offset "' WHERE main_text = '" $filename "'";
        
$res mysql_query ($sql);
        if(!
$res) exit("Error in $sql:" mysql_error());
        } 
    }

closedir ($dp); 
}
$d 'content/'
insert_offset($d); 
?>


Результат - ошибка, что исчерпан лимит времени: Fatal error: Maximum execution time of 30 seconds exceeded in...
Может быть, у кого-нибудь появятся мысли, как мне из этого выкрутиться.

  Ответить  
 
 автор: ddhvvn   (17.01.2009 в 23:19)   письмо автору
 
   для: Лена   (17.01.2009 в 22:50)
 

Сам скрипт не анализировал, отвечаю только на вопрос
>Может быть, у кого-нибудь появятся мысли, как мне из этого выкрутиться.
<?php
set_time_limit
(n); //n - в секундах, 0 - неограниченно
...
?>

  Ответить  
 
 автор: Trianon   (17.01.2009 в 23:33)   письмо автору
 
   для: Лена   (17.01.2009 в 22:50)
 

как же людям нравится к месту и не к месту рекурсивный обход....

Ну почему не пройти по таблице, и обсчитать лишь те тексты, offset для которых неизвестны?

Даже если не удастся сделать это в один проход, следующий запуск выполнит очередную порцию работы, и т.д.

  Ответить  
 
 автор: Лена   (17.01.2009 в 23:41)   письмо автору
 
   для: Trianon   (17.01.2009 в 23:33)
 

>Ну почему не пройти по таблице, и обсчитать лишь те тексты, offset для которых неизвестны?
а как найти эти тексты, если они находятся в разных папках, которые лежат в директории content? Не понимаю вас.

  Ответить  
 
 автор: Trianon   (18.01.2009 в 00:27)   письмо автору
 
   для: Лена   (17.01.2009 в 23:41)
 

вообщем-то, полные пути к этим файлам должны жить в таблице.

Сейчас же имеет смысл, вероятно, разделить задачу на два этапа.
Первый (без открытия и обсчета файлов) закидывает пути в таблицу.
Второй - собственно, проход по таблице и обсчет смещений.

  Ответить  
 
 автор: Лена   (18.01.2009 в 22:07)   письмо автору
 
   для: Trianon   (18.01.2009 в 00:27)
 

Сделала.
>Первый
прошлась по директориям и забросила пути в таблицу:

<?php
$sql 
"UPDATE texts SET path ='".$path."' WHERE main_text = '" $filename "'"//$filename - название файла в директории
?>

>Второй
тут пришлось делать "порциями", брала по 10 штук файлов и делала в них смещения
Выбрала путь из таблицы:

<?php
$sql 
"SELECT path FROM texts WHERE id BETWEEN 1 AND 10";
?>

открыла файл, расчитала смещение, вставила смещение в таблицу:
<?php
$sql 
"UPDATE texts SET offset = '" $all_offset "' WHERE path = '" $path "'";
?>

Спасибо, что находите для меня время.

  Ответить  
 
 автор: Trianon   (18.01.2009 в 23:27)   письмо автору
 
   для: Лена   (18.01.2009 в 22:07)
 

а зачем по 10 штук?

Во-первых можно лишь те, что надо.
SELECT path FROM texts WHERE offset IS NULL LIMIT 10

Во-вторых можно и по 100
SELECT path FROM texts WHERE offset IS NULL LIMIT 100

В-третьих можно вообще все выбрать
SELECT path FROM texts WHERE offset IS NULL
а обработать столько сколько успеет скрипт.

И повторять, пока будет чего молоть.

  Ответить  
 
 автор: Лена   (19.01.2009 в 10:01)   письмо автору
 
   для: Trianon   (18.01.2009 в 23:27)
 

Стала делать по 10 штук, поскольку скрипт не успевал все обработать. Запускала снова - и опять он обрабатывал те же самые файлы.

  Ответить  
 
 автор: Loki   (19.01.2009 в 10:21)   письмо автору
 
   для: Лена   (19.01.2009 в 10:01)
 

Я такую штуку делал так: ставил в файле счетчик времени и, как только он достигал критической величины, файл сам себя вызывал снова, передав в качестве параметра последнюю отработанную строку.

  Ответить  
 
 автор: Trianon   (19.01.2009 в 10:39)   письмо автору
 
   для: Лена   (19.01.2009 в 10:01)
 

>Стала делать по 10 штук, поскольку скрипт не успевал все обработать. Запускала снова - и опять он обрабатывал те же самые файлы.

Вообще это странно довольно.
Как я понимаю, скрипт сразу после обработки файла записывает в поле посчитанное значение.
Как же он на следующем вызове возьмет строку из БД, когда условие стоит WHERE поле не заполнено ?

  Ответить  
 
 автор: Лена   (19.01.2009 в 11:00)   письмо автору
 
   для: Trianon   (19.01.2009 в 10:39)
 

Вы меня не поняли. Когда я делала по своему варианту:
"SELECT path FROM texts" - то есть без вашег условия, требующего заполнять только пустые ячейки, вот тогда скрипт и останавливался.
А можно так, как Loki предложил, сделать? Есть просто файлы, в которых смещение вообще не высчитывается, потому как в них количество слов меньше, чем необходимо на страницу, но скрипт, расчитывающий смещения, все равно в этом случае запускается.

  Ответить  
 
 автор: Trianon   (19.01.2009 в 11:29)   письмо автору
 
   для: Лена   (19.01.2009 в 11:00)
 

>А можно так, как Loki предложил, сделать?

можно, конечно.
Но одно другое не исключает, а дополняет.


>Есть просто файлы, в которых смещение вообще не высчитывается,

конечное смещение (длина текста) так или иначе есть у всех фрагментов.

  Ответить  
 
 автор: Николай2357   (17.01.2009 в 23:48)   письмо автору
 
   для: Лена   (17.01.2009 в 22:50)
 

При таком раскладе желательно хотя бы проконтролировать выполнение операций. Совсем недавно вот и вот видите сколько проблем с рекурсией...

  Ответить  
 
 автор: USED   (19.01.2009 в 10:09)   письмо автору
 
   для: Лена   (17.01.2009 в 22:50)
 


<?
ignore_user_abort 
TRUE ) ;

тоже слудеут попробовать

  Ответить  
Rambler's Top100
вверх

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