|
|
|
| Здравствуйте. Требуется помощь профессионалов.
Есть скрипт который ежедненвно скачивает десятки xml файлов со стороннего сервера. Часто бывает так что некоторые файлы скачивается не полностью и при последующей обработке даннных выдаётся ошибка.
Я решил написать дополнительный скрипт для проверки файла. Идея такая проверить наличие определённых тегов которые должны находиться в конце файла.
Знаю только один способ - регулярные выражения - такой скрипт сделал, но он рабтает медленно (перебирает файл с самого начала) - файлы довольно большие и их много. Попробовал по другому, почти тоже что и с регулярными выражениями:
$inp = fopen('/home/prosto/www/mon.plx','r');
while($line = fgets($inp, 1024)){
if(strrpos($line, '</offer></offers></shop>')) break;
else $gh=false;
}
|
Но функция strrpos() не находит теги, ищет только текст - наверное этот скрипт работал бы быстрее чем регулярки, но не могу придумать, чего в нём не хватает, что бы он видел теги.
И ещё такой вопросик, можно ли как-то сделать так ,что бы не перебирать весь xml файл, а проверить только несколь строк в конце на наличие нужных тегов?
Возможно всё гораздо проще и есть какой-то другой способ - намекните пожалуйста если что ))).
Буду очень благодарен за помощь. | |
|
|
|
|
|
|
|
для: simbel
(06.08.2009 в 15:32)
| | fseek(.. -100, SEEK_END) | |
|
|
|
|
|
|
|
для: Trianon
(06.08.2009 в 15:50)
| | Спасибо за подсказку - судя по всему эта функция как раз то что нужно. Только почему то она у меня не работает. На каком-то форуме нашёл тестовый скриптик:
$f = fopen("/home/prostor/www/robots.txt", "r");
$offset = 100;
$test = fseek($f, $offset);
if (-1 == $test)
print "Невозможно сместить указатель в файле на такое количество байт.";
else
echo 'всё ок';
|
При таких параметрах функции fseek() - "всё ок".
Как только в функцию подставляю один из специфицированной параметров SEEK_SET, SEEK_CUR, SEEK_END - "Невозможно сместить указатель в файле на такое количество байт."
С чем это может быть связано? Как исправить? Подажите пожалуйста. | |
|
|
|
|
автор: ...... (06.08.2009 в 18:45) |
|
|
для: simbel
(06.08.2009 в 18:22)
| | минус поставили ?
или так
if (preg_match('#</offers>\s*</shop>#i', $txt, $matches, PREG_OFFSET_CAPTURE, -50))
print_r($matches);
|
| |
|
|
|
|
|
|
|
для: ......
(06.08.2009 в 18:45)
| | Когда ставлю один из параметров SEEK_SET, SEEK_CUR, SEEK_END, не важно какой знак стоит - не работает. Если без параметра и без минуса - работает.
На счёт регулярных выражений - да по другому наверное никак.
А вот как бы сделать так, что бы не перечитывать весь файл, а только несколько последних строк... Разобраться бы с fseek().
Не может использоваться с файловыми указателями, возвращаемыми функцией fopen(), если они используют форматы "http://" или "ftp://".
| - вычитал в справочнике. Что это значит? Может здесь собака зарыта? | |
|
|
|
|
автор: ........ (06.08.2009 в 21:19) |
|
|
для: simbel
(06.08.2009 в 19:03)
| | >fopen('/home/.....
у Вас локальный файл
<pre><?php
$fp = fopen('c:\WINDOWS\Driver Cache\i386\driver.cab', 'rb');
fseek($fp, -8, SEEK_END);
$data = fgets($fp, 4096);
fclose($fp);
var_dump($data);
?>
|
или нет ? | |
|
|
|
|
|
|
|
для: ........
(06.08.2009 в 21:19)
| | да, локальный на денвере
Спасибо разобрался - всё работает.
Проблема похоже была в том, что перепутал местами аргументы функции fseek | |
|
|
|