С нами с 12.01.02
Сообщения: 667
Рейтинг: 371
|
Добавлено: 13/09/06 в 14:06 |
Подскажите пожалуйста по следующей проблеме. Простой скрипт которому подсовывается урл со списком линков в содержимом которых надо проверять наличие определенной подстроки.
Вот код:
Код: | ini_set('default_socket_timeout', $timeout);
$html=file_get_contents($url);
preg_match_all("/href=\"(.*?)\"/i",$html, $listurls);
echo "Start scanning string [".$str."] in ".count($listurls[1])." urls...<br><br>";
for ($i=0; $i<count($listurls[1]); $i++)
{
if ($i>$limits) { exit;}
$cururl=file_get_contents($listurls[1][$i]);
if (strpos($cururl,$str))
{
echo "<b>".$listurls[1][$i]."</b><br>";
}
|
проблема в том что при небольшом объеме ($limits=(10..20) все работает (хоть и достаточно долго). Если $limits поставить хотя бы 50 линков для проверки - долго думает, потом выдает ошибку по таймауту 504.
Причем ini_set('default_socket_timeout', $timeout) не помогает.
Может кто знает как это обойти?
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 13/09/06 в 14:12 |
Код: |
$cururl=file_get_contents($listurls[1][$i]);
print $i.'<br />';
flush();
|
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
1
|
|
|
С нами с 12.01.02
Сообщения: 667
Рейтинг: 371
|
Добавлено: 13/09/06 в 14:30 |
to Stek: получше и вроде побыстрее, но на 50 линках опять затыкается по 504.
Я так понял, что в приципе это плохой путь, и лучше дергать страницы через сокеты (там хоть явное задание timeout есть)?
Или я неправ?
|
|
|
|
programmer
С нами с 08.12.02
Сообщения: 7615
Рейтинг: 5760
|
Добавлено: 13/09/06 в 14:42 |
лучше через CURL там таймаут задается, через сокеты криво работает.
и резал лучше в файл выводи - таймаут браузера исключишь как явление
|
|
|
|
127.0.0.1
С нами с 26.04.06
Сообщения: 1092
Рейтинг: 557
|
Добавлено: 13/09/06 в 16:19 |
кусок моего рабочего скрипта:
<?php
# get html from URL
$_list=file($this_url);
$_urls=array();
# search string
$_string="sweet teens";
foreach ($_list as $c) {
# lets find only correct HREFs
if (preg_match("/href=\"(.*\/)(.*\.)(php|htm|html|asp)\" /",$c,$href)){
array_shift($href);
array_push($_urls,join("",$href));
}
}
# search in urls...
foreach ($_urls as $z) {
$_this=file($z);
#skip if lines in html < 10
if (count($_this)<10) { echo "<b>${z} skipped...</b><br><br>\n";continue; }
echo "searching in ${z}<br><br>\n";
for($i=0;$i<count($_this);$i++) {
if (strstr($_this[$i],$_string)) { echo "<b>Found string at line: ${i}</b><br>\n"; }
}
}
?>
--------------------
пояснения:
прег_матч в пхп немного не соотвествует перловому регэкспу, и если скажем в одной строке встречаются два вхождения с одинаковым началом и окончанием, типо href="что-то", то прег_матч вернет строку начиная от начала вхождения первой подстроки до конца второй, то есть будет возврат:
href="что-то" что-то между строками href="что-то"
плюс корректный поиск всех возможных урлов по маске окончания:
php|html|htm|asp
скрипт работает относительно быстро, насколько быстро качается хтмл-страница, плюс парсинг.
по опыту - хтмл весом 140кб, размером в 3600 строк парсится по десяти рег_экспам около 5-8 секунд
|
|
|
|
С нами с 12.01.02
Сообщения: 667
Рейтинг: 371
|
Добавлено: 13/09/06 в 23:39 |
localhost писал: | кусок моего рабочего скрипта:
<?php
# get html from URL
$_list=file($this_url);
$_urls=array();
# search string
$_string="sweet teens";
foreach ($_list as $c) {
# lets find only correct HREFs
if (preg_match("/href=\"(.*\/)(.*\.)(php|htm|html|asp)\" /",$c,$href)){
array_shift($href);
array_push($_urls,join("",$href));
}
}
# search in urls...
foreach ($_urls as $z) {
$_this=file($z);
#skip if lines in html < 10
if (count($_this)<10) { echo "<b>${z} skipped...</b><br><br>\n";continue; }
echo "searching in ${z}<br><br>\n";
for($i=0;$i<count($_this);$i++) {
if (strstr($_this[$i],$_string)) { echo "<b>Found string at line: ${i}</b><br>\n"; }
}
}
?>
--------------------
пояснения:
прег_матч в пхп немного не соотвествует перловому регэкспу, и если скажем в одной строке встречаются два вхождения с одинаковым началом и окончанием, типо href="что-то", то прег_матч вернет строку начиная от начала вхождения первой подстроки до конца второй, то есть будет возврат:
href="что-то" что-то между строками href="что-то"
плюс корректный поиск всех возможных урлов по маске окончания:
php|html|htm|asp
скрипт работает относительно быстро, насколько быстро качается хтмл-страница, плюс парсинг.
по опыту - хтмл весом 140кб, размером в 3600 строк парсится по десяти рег_экспам около 5-8 секунд |
спасибо попробую... но похоже это то-же метод (только через file()
наверное все-таки проблема с таймаутом в хосте...
|
|
|
|
С нами с 04.01.03
Сообщения: 71
Рейтинг: 98
|
Добавлено: 14/09/06 в 10:12 |
set_time_limit ?
|
|
|
|
Текстовая реклама в форме ответа Заголовок и до четырех строчек текста Длина текста до 350 символов Купить рекламу в этом месте! |