![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 11.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
Witam,
Mam skrypt, ktory wykorzystuje rekurencje i czasem wywala taki blad na konsoli: "Naruszenie zasad ochrony pamieci". Ktos wie w czym moze tkwic problem albo jak to mozna sprawdzic? i druga kwestia czy jest jakies rozwiazanie, ktore jesli dzialanie skryptu zostaje przerwane wywoluje inna funkcje/plik ? |
|
|
![]()
Post
#2
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
rekurencja ma to do siebie, ze zjada duzo pamieci. Jak sie twoja rekurencja dlugo nie konczy to taki jest efekt (IMG:style_emoticons/default/smile.gif)
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 11.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
hmmm czyli jakie rozwiazania mozna zastosowac zeby tego uniknac?
|
|
|
![]()
Post
#4
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
unikac rekurencji jak ognia. A jak sie nie da, to tak ją pisac by bylo optymalnie.
No ale wrozką nie jestem - pokaz kod i co on ma robic. |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 11.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
a mozna jakos sprawdzic ile pamieci juz rekurencja pozarla, i np przerwac wykonywanie skryptu zanim zezre wszystko co dostepne i np zwolnic pamiec i uruchomic skrypt od nowa ? (wtedy i tak bedzie kontynuuowal od momentu przerwania bo to operacje na bazie danych );
|
|
|
![]()
Post
#6
|
|
Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
Cytat wtedy i tak bedzie kontynuuowal od momentu przerwania bo to operacje na bazie danych Skoro jestes w stanie kontynuowac, to po co ci ta rekurencja tam? POkaz kod to ci poprawimy (IMG:style_emoticons/default/smile.gif)
Powód edycji: [nospor]:
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 11.09.2009 Ostrzeżenie: (0%) ![]() ![]() |
to jest taki spider/crawler do np robienia sitemap'y, zrobilem to z wykorzystaniem mysql:
function crawl($domain) { //select url not crawled yet $sql = "SELECT * FROM tmpUrlCrawled WHERE visited IS NULL LIMIT 1"; $result = mysql_query($sql) or die (mysql_error()."<br>Query: $sql"); if(mysql_num_rows($result)>0) { $url = mysql_result($result,0,"url"); $url = mysql_real_escape_string($url); //update url which was crawled $sql = "UPDATE tmpUrlCrawled set visited = 'y' WHERE url = '$url'"; $result = mysql_query($sql) or die (mysql_error()."<br>Query: $sql"); //crawl links if(preg_match("/^http[s]?:\/\/[^\/]*".str_replace('.', '\.', $domain)."/i", $url)) { $tmpLinks = getUrls($url); $tmpLinks = array_unique($tmpLinks); } //add crawled links to DB if($tmpLinks) foreach ($tmpLinks as $tmpLink) { $tmpLink = mysql_real_escape_string($tmpLink); $sql = "INSERT IGNORE INTO tmpUrlCrawled set url = '$tmpLink'"; $result = mysql_query($sql) or die (mysql_error()."<br>Query: $sql"); } //rekurencja crawl($domain); } }
Powód edycji: [thek]: Proszę oBBCode, bo czyta się to źle każdemu...
|
|
|
![]()
Post
#8
|
|
Grupa: Moderatorzy Postów: 4 362 Pomógł: 714 Dołączył: 12.02.2009 Skąd: Jak się położę tak leżę :D ![]() |
Tutaj rekurencja? Ty chyba zgłupiałeś... (IMG:style_emoticons/default/winksmiley.jpg) Chcesz cały net zaindeksować? Ktoś zrobi motyw http://www.domena.pl?url=http://www.domena2.pl i wlatujesz z crawlerem na całkiem inną domenę. Ewentualnie wpadasz na farmę linków i znów masz dym. Sprawdzaj wpierw czy znajdujesz się nadal na domenie z jakiej wyruszyłeś i sprawdzaj poziom zagłębienia. Bo jak wpadniesz w pętlę przekierowań to się robi potem jazda... A nie widzę byś się zabezpieczał jakkolwiek na taką sytuację. Poza tym myśl trochę przy pisaniu. Robisz dziesiątki zapytań i bazę zarżynasz. A powinieneś wyciągnąć z bazy listę linków aktualnie dla tej strony zaindeksowanych i w pętlach porównywać oznaczając: ta już była, ta jest nowa itd. Bo inaczej robisz sieczkę ostrą.
Do sitemapy Twojej własnej strony wystarcza znajomość jej struktury. Pewne linki masz stałe i możesz je na pałę wpisać do kodu. To co z bazy to zwykłe pętle while i banalne zapytania: Tak się to robi, choć ja mocno okroiłem, ale żadne crawlery bo to mocno niewydajne i jedzie zarówno po serwisie, jak i po bazie. Nawet mocno rozbudowane serwisy się tak robi. Tyle, że wtedy robi kilka plików sitemap, nie zaś jeden duży. Ludzie myślcie trochę chociaż... |
|
|
![]() ![]() |
![]() |
Aktualny czas: 15.09.2025 - 05:04 |