[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: проблема с чтением файлов в цикле
oberon
Всем привет!

Есть проблема с анализом содержимого файлов. Количество файлов неизвестно. Посему обрабатывается все в цикле.
Принцип работы:
1. Задается список ключевых слов и список названий файлов. Произвольно.
2. Считывается первый файл через функцию file_get_contens() и там по ключевому слову ищется фраза, его содержащая.
3. Затем следующее ключевое слово и т.д.
Но тут надо учесть, что сам файл тоже динамический. Это выборка из базы, которая уже выбирается по ключевому слову. Одним словом, при смене ключевого слова этот файл формируется заново и его содержимое гружу функцией file_get_contens() еще раз. Потом поиск производится заново.
Найденные фразы пока вывожу на экран. Далее буду сохранять в базу. Это уже несущественно.

Теперь проблема:
При одном файле и 2-3 ключевых словах все проходит хорошо. Когда количество слов доходит примерно до 5-6 получаю сообщение об ошибке:
Warning: strpos() [function.strpos]: Offset not contained in string in C:\web_host\index.php on line 90
строка тут такая:
$pos_begin = strpos($html_text, $tag_a_begin, $pos_begin);


Если количество ключевых слов превышает 7-8, то ошибка такая:
Warning: file_get_contents(http://www.superjob.ru/vacancy/search/?submit=1&keys%5B%5D=менеджер по продажам&skwc%5B%5D=and&srws%5B%5D=10&period=0&t%5B%5D=4&pay1=&pay2=&type_of_work=0&place_of_work=0&old=&pol=0&education=0&lng=0&agency=0&search_hesh=1506669006145950&catalogues=) [function.file-get-contents]: failed to open stream: HTTP request failed! <html> in C:\web_host\index.php on line 87
строка тут такая:
$html_text = file_get_contents($html_url);

то есть, чтение динамического файла через TCP/IP.

Трабла в том, что сначала фразы я получаю. Но потом, когда выходит вторая ошибка, то больше фраз не выходит, хотя отдельно я вижу, что эти фразы там точно есть.

Вот кусок кода, где все происходит (пока это тестовый вариант. не смотрите на оптимальность и т.д.):

массив ключевых слов набирается выше. массив имен файлов (ссылок) тоже.
Вывод на экран в самом низу.

	for( $i = 0; $i < 10/*$KeysCount*/; $i++ ){
$keyword = $ArrayKeywords[$i];
$html_url = $ArrayURLs[0];
$html_url = str_replace('##KEYWORD##', $keyword, $html_url);
$keyword = rawurlencode($keyword);
$html_text = file_get_contents($html_url);
$len = strlen($html_text);

$pos_begin = strpos($html_text, $tag_a_begin, $pos_begin);

while( strpos($html_text, $tag_a_begin, $pos_begin) ){
$pos_begin = strpos($html_text, $tag_a_begin, $pos_begin);

$pos_end = strpos($html_text, $tag_a_end, $pos_begin);
$pos_end = $pos_end + 3;


$result_temp = substr($html_text,$pos_begin, ($len-$pos_begin+1-$len+$pos_end) );
$pos_start = strpos($result_temp,$keyword);

if( $pos_start > 0 ){
$result .= "<tr><td>";
$result .= $result_temp;
$result .= "</td></tr><br>";
}

$pos_begin = $pos_end + 1;
}

$html_text = '';
$html_url = '';
}

print "<br><br><tr><td><b>Resultat poiska:</b></td></tr>";
print "<tr><td>$result</td></tr>";




Спустя 19 часов, 22 минуты, 13 секунд (2.09.2011 - 11:52) oberon написал(а):
Вообще, поменял строку
$html_text = file_get_contents($html_url);

на
		$curl = curl_init($html_url);
$user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3';
curl_setopt($curl, CURLOPT_USERAGENT, $user_agent);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);

$html_text = curl_exec($curl);
if (curl_errno($curl)) {
echo 'curl error';
exit;
}


и вторая ошибка исчезла.

Спустя 10 часов, 25 минут, 40 секунд (2.09.2011 - 22:18) Лена написал(а):
Warning: strpos() [function.strpos]: Offset not contained in string in
$pos_begin = strpos($html_text, $tag_a_begin, $pos_begin);


$pos_begin больше, чем длина строки $html_text.
$pos_begin показывает, с какого символа начинать поиск. Допустим, в сроке 30 символов, и как-то выходит, что $pos_begin = 31, вот и выдает вашу ошибку.

Теперь только увидела. У вас одинаковые переменные. Поиск ведется с позиции $pos_begin и результат сохраняется в $pos_begin. Я бы попробовала или поменять:
$pos_begin2 = strpos($html_text, $tag_a_begin, $pos_begin);
или проверку ставить:
if($pos_begin) $pos_begin2 = strpos($html_text, $tag_a_begin, $pos_begin);
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.