|
|
|
| При загрузке файлов на сервер заношу данные про текстовый файл в базу(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($fp, LOCK_EX);
$text = fread($fp, filesize($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...
Может быть, у кого-нибудь появятся мысли, как мне из этого выкрутиться. | |
|
|
|
|
|
|
|
для: Лена
(17.01.2009 в 22:50)
| | Сам скрипт не анализировал, отвечаю только на вопрос
>Может быть, у кого-нибудь появятся мысли, как мне из этого выкрутиться.
<?php
set_time_limit(n); //n - в секундах, 0 - неограниченно
...
?>
|
| |
|
|
|
|
|
|
|
для: Лена
(17.01.2009 в 22:50)
| | как же людям нравится к месту и не к месту рекурсивный обход....
Ну почему не пройти по таблице, и обсчитать лишь те тексты, offset для которых неизвестны?
Даже если не удастся сделать это в один проход, следующий запуск выполнит очередную порцию работы, и т.д. | |
|
|
|
|
|
|
|
для: Trianon
(17.01.2009 в 23:33)
| | >Ну почему не пройти по таблице, и обсчитать лишь те тексты, offset для которых неизвестны?
а как найти эти тексты, если они находятся в разных папках, которые лежат в директории content? Не понимаю вас. | |
|
|
|
|
|
|
|
для: Лена
(17.01.2009 в 23:41)
| | вообщем-то, полные пути к этим файлам должны жить в таблице.
Сейчас же имеет смысл, вероятно, разделить задачу на два этапа.
Первый (без открытия и обсчета файлов) закидывает пути в таблицу.
Второй - собственно, проход по таблице и обсчет смещений. | |
|
|
|
|
|
|
|
для: 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 . "'";
?>
|
Спасибо, что находите для меня время. | |
|
|
|
|
|
|
|
для: Лена
(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
а обработать столько сколько успеет скрипт.
И повторять, пока будет чего молоть. | |
|
|
|
|
|
|
|
для: Trianon
(18.01.2009 в 23:27)
| | Стала делать по 10 штук, поскольку скрипт не успевал все обработать. Запускала снова - и опять он обрабатывал те же самые файлы. | |
|
|
|
|
|
|
|
для: Лена
(19.01.2009 в 10:01)
| | Я такую штуку делал так: ставил в файле счетчик времени и, как только он достигал критической величины, файл сам себя вызывал снова, передав в качестве параметра последнюю отработанную строку. | |
|
|
|
|
|
|
|
для: Лена
(19.01.2009 в 10:01)
| | >Стала делать по 10 штук, поскольку скрипт не успевал все обработать. Запускала снова - и опять он обрабатывал те же самые файлы.
Вообще это странно довольно.
Как я понимаю, скрипт сразу после обработки файла записывает в поле посчитанное значение.
Как же он на следующем вызове возьмет строку из БД, когда условие стоит WHERE поле не заполнено ? | |
|
|
|
|
|
|
|
для: Trianon
(19.01.2009 в 10:39)
| | Вы меня не поняли. Когда я делала по своему варианту:
"SELECT path FROM texts" - то есть без вашег условия, требующего заполнять только пустые ячейки, вот тогда скрипт и останавливался.
А можно так, как Loki предложил, сделать? Есть просто файлы, в которых смещение вообще не высчитывается, потому как в них количество слов меньше, чем необходимо на страницу, но скрипт, расчитывающий смещения, все равно в этом случае запускается. | |
|
|
|
|
|
|
|
для: Лена
(19.01.2009 в 11:00)
| | >А можно так, как Loki предложил, сделать?
можно, конечно.
Но одно другое не исключает, а дополняет.
>Есть просто файлы, в которых смещение вообще не высчитывается,
конечное смещение (длина текста) так или иначе есть у всех фрагментов. | |
|
|
|
|
|
|
|
для: Лена
(17.01.2009 в 22:50)
| | При таком раскладе желательно хотя бы проконтролировать выполнение операций. Совсем недавно вот и вот видите сколько проблем с рекурсией... | |
|
|
|
|
|
|
|
для: Лена
(17.01.2009 в 22:50)
| |
<?
ignore_user_abort ( TRUE ) ;
|
тоже слудеут попробовать | |
|
|
|