Эта тема на forum.dklab.ru


sleepstrim: проблема с ф-ей set_time_out()
скрипт(пример):
set_time_limit($limit);
while(1)
{
$today=getdate();
$string=$today['seconds'].':'.$today['minutes'].':'.$today['hours'].'<br>';
echo $string.'<br>';
}
////////

если $limit задается больше 70 минут (4200) секунд, ведет себя не корректно, он вырубается через примерное 50-60 минут, стабильно.
Запускаю из под Денвера.
P.S. скрипт просто пример....

P.P.S почему если направить вывод ошибок в файл журнала там не будет выведена ошибка о тайм ауте? в браузер выводит после направления в файл, в нем не появляется (файле)
Г.О.:
Скрипт вырубается или браузер коннект рвет?
И не влом такие тест проводить? :) Зачем?
sleepstrim:
просто так отболды написал у меня скрипт больше гораздо....
браузер вообще не в теме, скрипт фоновый. останавливается сам скрипт.
.....

ща лимит на 0 поставил...поглядим скоко так работать будет...
Никита Косолaпов:
скрипт запускается через веб или в командной строке?
sleepstrim:
через браузер. запускается стартовая страничка там указывается что надо, жмется старт и идется пить кофе...
пару минут назад повисла ф-ия fopen начала открывать и виссит ждал 15минут и отрубил в php.ini для fopen стоит тайм аут 60 сек...
sleepstrim:
не не могу больше... опять повисла...
признаюсь это скрипт поиска, собирает ссылки со страничек....
ща мож весего выложу... сделан только на ф-ях.... не хочет работать и усе...
Юрий Насретдинов:
sleepstrim
Пишите его на Perl или Си...
sleepstrim:
вы меня пугаете... на С++ еще смогу.... пхп ближе к сердцу....
или это практически невыполнимая задача?
в обшем может я уже совсем погряз, вот скрипт может кто что заметит.....



function login($string)
{
if($fp=fopen('log.dat','a'))
{
$date=getdate();
$string=$date['hours'].':'.$date['minutes'].':'.$date['seconds'].' ---- '.$string."\n";
if(fwrite($fp, $string))
{
fclose($fp);
return 1;
}
fclose($fp);
return 0;

}
return 0;
}
function formatHttp($url, $key=0)
{
$url=trim($url);
$url=trim($url, "\n");
//$url=strtolower($url);
if($key)
{
$last=strrpos($url, '/')+1;
$url=substr($url, 0, $last);
return $url;
}
if(strcasecmp($url{0}, "'")==0)
{
$url=substr($url, 1, strlen($url)-2);
}
if($l=strpos($url, 'http://', strlen('http://')+1) and strlen($url)<1000)//ссылка переадресована на другую страницу
$url=substr($url, $l);
if($l=strpos($url, 'HTTP://', strlen('HTTP://')+1) and strlen($url)<1000)//ссылка переадресована на другую страницу
$url=substr($url, $l);
if(strpos($url, '/', strlen('http://')))///ссылка звершена - нет надобности в ее правки
{
return $url;
}
else///не завершена - завершаем
{
$url.='/';
return $url;
}
return $url;
}
function formatHref($url, $workurl)
{
$url=trim($url);
$url=trim($url, "\n");
if(preg_match('/http\:\/\//i', $url)) return 0;
//$url=strtolower($url);
$warkurl=substr($workurl, 0, strrpos($workurl, '/')+1);
if(strcasecmp($url{0},'/')==0)
{
$end=strpos($workurl, '/',strlen('http://')+1);
$len=$end;
$workurl=substr($workurl,0, $len).$url;

return $workurl;
}
$cut=substr($workurl, strpos($workurl, '/', strlen('http://')));
$ex=explode('/', $cut);
if($i=substr_count($url, '../'))
{
$end=strpos($workurl, '/',strlen('http://')+1);
$len=$end+1;
$workurl=substr($workurl,0, $len);
$count=count($ex)-1;
$url=substr($url, strlen('../')*$i);
while($i>=0 and $count)
{
unset($ex[$count]);
$count--;
$i--;
}
foreach($ex as $val)
{
if($val<>'')$workurl.=$val.'/';
}
}
$ex2=explode('/', $url);
if(preg_match('/[A-za-z0-9]/i', $ex2[0]) and !preg_match('/http\:\/\//i', $url))
{
$url=substr($workurl,0, strrpos($workurl, '/')+1).$url;
return $url;
}
if(strcasecmp($ex2[0],'.')==0)
{
unset($ex2[0]);
foreach($ex2 as $pas)
{
//if(!in_array($val, $ex))
$warkurl.=$pas.'/';
}
$warkurl=substr($warkurl, 0, strlen($warkurl)-1);

return $warkurl;

}
if($ex2[0]<>'')
{
foreach($ex2 as $pas)
{
//if(!in_array($val, $ex))
$workurl.=$pas.'/';
}
}
return $workurl;
}
function chekUrl($url)
{
$check=0;
if(!preg_match( '/\.dtd/i',$url))
{$check=1;}
else
return 0;
if(!preg_match('/\.exe/i', $url))
{$check=1;}
else
return 0;
if(!preg_match('/\.avi/i', $url))
{$check=1;}
else
return 0;
if(!preg_match('/\.jpg/i',$url))
{$check=1;}
else
return 0;
if(!preg_match('/\.gif/i', $url))
{$check=1;}
else
return 0;
if(!preg_match('/\.pdf/i', $url))
{$check=1;}
else
return 0;
if(!preg_match('/\.png/i', $url))
{$check=1;}
else
return 0;
if(!preg_match('/\.wmv/i',$url))
{$check=1;}
else
return 0;
/*if(!preg_match('/\.cgi/i',$url))
{$check=1;}
else
return 0;*/
if(!preg_match('/\.css/i',$url))
{$check=1;}
else
return 0;
if(!preg_match('/\.ico/i', $url))
{$check=1;}
else
return 0;
if(!preg_match('/mailto/i', $url))
{$check=1;}
else
return 0;
if(!preg_match('/JavaScript/i',$url))
{$check=1;}
else
return 0;
if(!preg_match('/\+/',$url))
{$check=1;}
//echo $url;
else
return 0;
return $check;
}
function cheKBase($url, $pk=0)
{
global $connect;
if($pk)
{
$query='SELECT * FROM `'.TABLE_NAME.'` WHERE pk='.$pk;
$res=mysql_query($query, $connect);
if($val=mysql_fetch_assoc($res)) return 1;
}
$query='SELECT * FROM `'.TABLE_NAME.'` WHERE link="'.$url.'"';
$res=mysql_query($query, $connect);
if($val=mysql_fetch_assoc($res)) return 1;
return 0;

}
function takeFromBd($param)
{

global $connect;
$newMas=array();
if(strcasecmp($param[0], 'link')==0)
{$query='SELECT * FROM `'.TABLE_NAME.'` WHERE '.$param[0].'="'.$param[1].'"';}
else $query='SELECT * FROM `'.TABLE_NAME.'` WHERE '.$param[0].'='.$param[1];
$res=mysql_query($query, $connect);
while($val=mysql_fetch_assoc($res))
{
$newMas[]=$val;
}
if(!isset($newMas[0])) return 0;
return $newMas;
}
function addBd($zn)
{
global $connect;
$query='INSERT INTO `'.TABLE_NAME.'` VALUES (';
foreach($zn as $val)
{
$query.='"'.$val.'",';
}
$query=substr($query, 0, strlen($query)-1);
$query.=')';
if($res=mysql_query($query, $connect)) {login('ADDED'); return 1;}
else return 0;
}
function dletFromBd($param)
{
global $connect;
if(preg_match('/[0-9]/',$param[1]))
{$query='DELETE FROM `'.TABLE_NAME.'` WHERE '.$param[0].'='.$param[1];}
else $query='DELETE FROM `'.TABLE_NAME.'` WHERE '.$param[0].'="'.$param[1].'"';
if($res=mysql_query($query, $connect)) {login('deleted'); return 1;}
else return 0;
}
function apdateBd($param, $zn, $where)
{
global $connect;
$query='UPDATE `'.TABLE_NAME.'` SET ';
$i=0;
foreach($param as $val)
{
if(preg_match('/[0-9]/',$zn[$i])) {$query.=$val.'='.$zn.', ';}
else $query.=$val.'="'.$zn[$i].'",';
$i++;
}
$query=substr($query, 0, strlen($query)-1);
if(preg_match('/[0-9]/',$where[1])) {$query.=' WHERE '.$where[0].'='.$where[1];}
else $query.=' WHERE '.$where[0].'="'.$where[1].'"';
if($res=mysql_query($query, $connect)) {return 1;}
else return 0;
}
function takeUrls($url)
{
$d1=0;
$d2=0;
$d3=0;
$newMas=array();
if(preg_match('/http:/i', $url)) $url=formathttp($url);
login("пробуем открыть $url");
if($fp=fopen($url, 'r'))
{
login("открыли $url");
$page_contents="";
while($next_text=fread($fp, 1024))
$page_contents.=$next_text;
//echo $page_contents.'<br>';
if($match_result=preg_match_all('/<\s*A\s*\S*\s*HREF="([^\"]+)"\s*[^>]+>([^>]*)<\/A>/i', $page_contents, $match_array, PREG_SET_ORDER))
{
$d1=1;
}
if($match_result=preg_match_all('/<\s*A\s*\S*\s*HREF=([^\"][^>]+)\s*[^>]*>([^>]*)<\/A>/i', $page_contents, $match_array2, PREG_SET_ORDER))
{
$i=0;
foreach($match_array2 as $val)
{
if($match_result=preg_match("/'([^']+)'/i", $val[1], $match))
{$match_array2[$i][1]=$match[1]; $val[1]=$match[1];}
if($match_result=preg_match('/(\S+)\s+\S*/i', $val[1], $match_array4))
{
$match_array2[$i][1]=$match_array4[1];
}
$i++;
}
$d3=1;
}
if($match_result=preg_match_all('/\s*HREF="([^\"]+)"/i', $page_contents, $match_array1, PREG_SET_ORDER))
{
$d2=1;
}
$i=0;
if($d3)
{
foreach($match_array2 as $val)
{
if(!preg_match('/http\:\/\//i', $val[1]) and $pa=formatHref($val[1], $url))
{
$val[1]=$pa;
}
else
{
$pa=formatHttp($val[1]);
$val[1]=$pa;
}
if(!preg_match('/[A-Za-z0-9а-я\.\,\:\;]/i', $val[2])) $val[2]=$val[1];
$flag=0;
foreach($newMas as $pas)
{
if(in_array($val[1], $pas))
{
break;
}
else $flag++;
}
if($flag==count($newMas) and chekUrl($val[1]))
{
$newMas[$i]=array($val[1], $val[2]);

$i++;
}
}
}
if($d2)
{
foreach($match_array1 as $val)
{
if(!preg_match('/http\:\/\//i', $val[1]) and $pa=formatHref($val[1], $url))
{
$val[1]=$pa;
}
else
{
$pa=formatHttp($val[1]);
$val[1]=$pa;
}
$val[2]=$val[1];
$flag=0;
foreach($newMas as $pas)
{
if(in_array($val[1], $pas))
{
break;
}
else $flag++;
}
if($flag==count($newMas) and chekUrl($val[1]))
{
$newMas[$i]=array($val[1], $val[2]);

$i++;
}
}
}
if($d1)
{
foreach($match_array as $val)
{
if(!preg_match('/http\:\/\//i', $val[1]) and $pa=formatHref($val[1], $url))
{
$val[1]=$pa;
}
else
{
$pa=formatHttp($val[1]);
$val[1]=$pa;
}
if(!preg_match('/[A-Za-z0-9а-я\.\,\:\;]/i', $val[2])) $val[2]=$val[1];
$flag=0;
foreach($newMas as $pas)
{
if(in_array($val[1], $pas))
{
break;
}
else $flag++;
}
if($flag==count($newMas) and chekUrl($val[1]))
{
$newMas[$i]=array($val[1], $val[2]);

$i++;
}
}
}
if(fclose($fp)) {login('закрыл');}
else login('ВНИМАНИЕ!!! НЕ ЗАКРЫТ ФАЙЛ!!!');
return $newMas;

}
else {login("возможно не открыли.... $url");return 0;}
}
function getIn($url, $key)
{
global $connect;
switch($key)
{
case '1':
$query='SELECT * FROM `links` where link="'.$url.'"';
$res=mysql_query($query, $connect);
if($res=mysql_fetch_assoc($res))
{
$deep=$res['deep'];
$Pk=$res['pk'];
}
else
{
$param=array('pk','fk','link','title','status','deep');
$zn=array('',0,$url,'start','NO', 0);
if(!addBd($zn)) break;
$query='SELECT * FROM `links` where link="'.$url.'"';
$res=mysql_query($query, $connect);
if($res=mysql_fetch_assoc($res))
{
$deep=$res['deep'];
$Pk=$res['pk'];
}
else return 0;
}
if($urls=takeUrls($url))
{
foreach($urls as $val)
{
$param=array('link', $val[0]);
if(!takeFromBd($param))
{
$param=array('pk','fk','link','title','status','deep');
$zn=array('', $Pk, $val[0], $val[1], 'STOP', $deep+1);
//if(strlen($val[0])>1000) continue;
if(addBd($zn)){$string='<a href="'.$val[0].'">'.$val[1].'</a>'; login($string); $k=1;}
}
}
$param=array('status');
$zn=array('OK');
$where=array('pk',$Pk);
$string=count($urls).' Всего ссылок на старнице';
login($string);
if(apdateBd($param, $zn, $where))
{
$query='SELECT * FROM `links` where deep='.$deep.' and status="NO" LIMIT 0,1';
$res=mysql_query($query, $connect);
if($result=mysql_fetch_assoc($res)) {$url=$result['link']; getIn($url, 1);}
else return 0;
}
else return 0;
}
else
{
$string=count($urls).' Всего ссылок на старнице';
login($string);
$param=array('status');
$zn=array('ERROR');
$where=array('pk',$Pk);
if(apdateBd($param, $zn, $where))
{
$query='SELECT * FROM `links` where deep='.$deep.' and status="NO" LIMIT 0,1';
$res=mysql_query($query, $connect);
if($result=mysql_fetch_assoc($res)) {$url=$result['link']; getIn($url, 1);}
else return 0;
}
else return 0;
}
break;
case '2':
$query='SELECT * FROM `links` where status="NO" LIMIT 0,1';
$res=mysql_query($query, $connect);
if($result=mysql_fetch_assoc($res)) {$url=$result['link']; getIn($url, 1);}
else return 0;
break;
default: return 0;
}
}
function main()
{
global $connect;
$count=0;
$url=$_POST['url'];
$lim=$_POST['limit'];
$key=$_POST['key'];
if($key==1)//ищим заново по новому пути
{
while($count<$lim)
{
if($count)
{
$param=array('status');
$zn=array('NO');
$where=array('status','STOP');
if(apdateBd($param, $zn, $where))
{
$query="SELECT * FROM `links` WHERE status='NO' limit 0,1";
$res=mysql_query($query, $connect);
$url=mysql_fetch_assoc($res);
$url=$url['link'];
}
else break;
}
getIn($url,1);
login("глюбина вложения $count");
$count++;
}
}
else if($key=2)//продолжаем поиск
{
while($count<$lim)
{
$param=array('status');
$zn=array('NO');
$where=array('status','STOP');
if(apdateBd($param, $zn, $where))
{
$query="SELECT * FROM `links` WHERE status='NO' limit 0,1";
$res=mysql_query($query, $connect);
if($url=mysql_fetch_assoc($res))
{
$url=$url['link'];
getIn($url, 1);
$count++;
}
else break;
}
else {login('ERROR'); break;}
}
}
else login('Incorrect enter');
}
ignore_user_abort();
set_time_limit(600); // run script forever
$today=getdate();
$string=$today['seconds'].':'.$today['minutes'].':'.$today['hours'].'<br>';
login($string);
define("TABLE_NAME", "links");
$connect=mysql_pconnect('localhost','root','');
$select=mysql_select_db('link', $connect);
main();
$today=getdate();
$string=$today['seconds'].':'.$today['minutes'].':'.$today['hours'].'<br>';
login($string);
mysql_close($connect);



извиняйте за небольшую корявость ф-ий делать их более совершенными уже нет сил, по идее должны работать.
в общем если что разъясню....
хелп кто в теме.
Ksnk:
Может уж лучше паучков не придумывать самому, а поискать в гугле? Их там много работающих...
sleepstrim:
мне приспичило самому написать :) типо для самоудовлетворения. че чужим то пользоваться...
sleepstrim:
и смысл не в том чтобы просто по сайтам лазить иискать инфу, а собрать ссылочки, не обращая внимания на все запреты (robots.txt).
Ksnk:
браузер вообще не в теме, скрипт фоновый. останавливается сам скрипт.

$url=$_POST['url'];
$lim=$_POST['limit'];
$key=$_POST['key'];

Точно браузер не в теме?
sleepstrim:
браузер вообще не в теме, скрипт фоновый. останавливается сам скрипт.

$url=$_POST['url'];
$lim=$_POST['limit'];
$key=$_POST['key'];

Точно браузер не в теме?
почти не в теме :) в том смысле что это скрипт ничего в браузер не выводит. работает в фоновом режиме.

ему лишь через браузер стартовые значения передаются
Владимир Хоменко:
Может быть ignore_user_abort поможет?
Ksnk:
Скрипты в фоне запускаются примерно вот так. Полезно также познакомится и с другими комментариями. Может это спасет. imho Апач, не очень любит "подвисшие" в нем процессы...
Владимир Хоменко
Не помогает! Он там есть :(
Владимир Хоменко:
Не помогает! Он там есть :(

ignore_user_abort();

It will return the previous setting and can be called without an argument to not change the current setting and only return the current setting.

Или я чего-то не понимаю?
Ksnk:
Или я чего-то не понимаю?
Или я :) Всегда думал, что параметров там нет... Судя по комментариям - не я один.
sleepstrim:
Всегда думал, что параметров там нет... Судя по комментариям - не я один.
так как мне кажется ее можно вызывать без параметров а можно и с...

сенк за ссылку но я не влетаю вработу той ф-ии (execInBackground)
ей передаются очень интересные параметры...
proc_open ( string cmd, array descriptorspec, array &pipes [, string cwd [, array env [, array other_options]]] )
а что если воспользоваться этим?
вот
Владимир Хоменко:
так как мне кажется ее можно вызывать без параметров а можно и с...

Почитайте мануал, я там выше ссылку на него кидал.

Ваше:

set_time_limit()

ровным счетом ничего не делает.
sleepstrim:
ровным счетом ничего не делает.
как это ничего?!
sleepstrim:
мануал на английском не очень удобно читать...
удобно но не очень...
Владимир Хоменко:
как это ничего?!

Это я опечатался, имелось ввиду

Ваше:ignore_user_abort();

ровным счетом ничего не делает.
sleepstrim:
да даже если и не делает, проблема не в ней.
sleepstrim:
ну так что никто не поможет? мдя.... ну изаварил я кашу :)

Эта тема на forum.dklab.ru