Реклама на сайте Advertise with us

Вопрос по PHP

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:



С нами с 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) не помогает.
Может кто знает как это обойти?

0
 

www.phpdevs.com

С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105


Передовик Master-X (01.09.2005) Передовик Master-X (16.09.2005) Передовик Master-X (01.10.2005) Передовик Master-X (16.08.2006) Передовик Master-X (16.10.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 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 есть)?

Или я неправ?

0
 

programmer

С нами с 08.12.02
Сообщения: 7615
Рейтинг: 5760

Ссылка на сообщениеДобавлено: 13/09/06 в 14:42       Ответить с цитатойцитата 

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

крипта на ByBit

1
 

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 секунд

1
 



С нами с 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()
наверное все-таки проблема с таймаутом в хосте...

0
 



С нами с 04.01.03
Сообщения: 71
Рейтинг: 98

Ссылка на сообщениеДобавлено: 14/09/06 в 10:12       Ответить с цитатойцитата 

set_time_limit ?

0
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »