Schrift
[thread]10943[/thread]

suchscript geht meistens nicht



<< >> 7 Einträge, 1 Seite
Rocco
 2007-12-03 15:12
#103397 #103397
User since
2005-11-18
37 Artikel
BenutzerIn
[default_avatar]
nachdem mir renee schon ein paar mal mit dem suchscript weitergeholfen hat, wieder einmal eine anfrage von mir zum thema.

es geht um die suche auf dieser seite -> http://www.marktgemeinde-seibersdorf.at/start.html

unten das script um das es geht, leider gibt es probleme mit der suche.
sie geht manchmal, aber manchmal auch nicht und wenn sie nicht geht kommt folgende fehlermeldung:

[an error occurred while processing this directive] Die Anfrage kann nicht beantwortet werden, da im Server ein interner Fehler aufgetreten ist. [an error occurred while processing this directive] Fehlermeldung:
Premature end of script headers: search.pl [an error occurred while processing this directive]

ich schätze mal es liegt am server, der zeitweilig zu langsam ist und dann diese fehlermeldung produziert.

kann man das script irgendwie beschleunigen?
oder was kann man sonst machen damit die suche immer funktioniert?

auf die error_logs hab ich leider nicht so ohne weiteres zugriff, da müsste ich beim hoster nachfragen, in dem bereich auf den ich zugriff habe sind keine errorlogs enthalten.

kenn mich auch zuwenig mit caching methoden aus, um diesbezüglich was zu probieren




Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#!/usr/bin/perl

use CGI::Carp qw(fatalsToBrowser);
use strict;
use warnings;
use CGI;
use File::Find;
use HTML::Parser;

my $cgi = CGI->new();
print $cgi->header(-type => 'text/html');
my %params = $cgi->Vars();
my $string = '';
my $title = '';
my $basedir = '/home/netzgrafik/www.marktgemeinde-seibersdorf.at/';
my $base_url = 'http://www.marktgemeinde-seibersdorf.at/';
my $hp_title = 'Startseite';


# hier noch den Pfad zur Vorlage eintragen
my $template = '/home/netzgrafik/www.marktgemeinde-seibersdorf.at/vorlagen/vorlage_02.html';

# dateien die nicht durchsucht werden sollten
my @unwanted = qw(amadeus.htm);

my @files = ();
find(\&find_files,$basedir);
@files = grep{ my $i = $_; !grep{ $i =~ /\Q$_\E$/ }@unwanted }@files;
my ($includes) = search($params{terms},\@files,$basedir);
print_html($base_url,$template,$hp_title,$params{terms},$includes);


sub find_files{
push(@files,$File::Find::name) if(-f $File::Find::name && $_ =~ /\.htm$/);
push(@files,$File::Find::name) if(-f $File::Find::name && $_ =~ /\.html?$/);
}

sub print_html{
my ($base,$template,$title,$terms,$hashref) = @_;

my $content = '';
{
local $/;
open(my $fh,'<',$template) or die $!;
$content = <$fh>;
close $fh;
}

my $html = '<ul>';
for my $key(keys(%$hashref)){
$html .= '<li><a href="'.$base.$key.'">'.$hashref->{$key}."</li>\n";
}
$html .= qq~</a></ul><hr align="left" width="100%" size="2" noshade color="#685B24">\n
<font color="#685B24">Such Information:</font><p>
<ul>\n<li><b><FONT COLOR=#685B24>Suchbegriff: </FONT></b>~;

$html.= join(", ",split(/\s+/,$terms));

$html .= qq~<li><a href="$base">$title</a>\n</ul>
<hr align="left" width="100%" size="2" noshade color="#685B24">\n~;

#<a href="http://www.netzgrafik.com">netzgrafik.com</a>.\n~;


$content =~ s/\$Titel/$title/;
$content =~ s/\$Message/$html/;

print $content;
}

sub search{
my ($termsstring,$files,$basedir) = @_;
my @terms = split(/\s+/,$termsstring);

my $parser = HTML::Parser->new(
api_version => 3,
start_h => [\&start,"self,tagname,attr"],
text_h => [\&text,"self,dtext"],
end_h => [\&end,"self,tagname"]);

$parser->{divs} = 0;

my %include;
for my $html_file(@$files){
$string = '';
$title = '';
$parser->parse_file($html_file);

foreach my $term (@terms) {
$term = umlauts($term);

# hier wurde noch das "i" angef?gt f?r "ignore case" also
# matching ohne Ber?cksichtigung von Gro?- und Kleinschreibung

if ($string =~ /$term/i or $title =~ /$term/i) {
(my $local_file = $html_file) =~ s/\Q$basedir\E//;
$include{$local_file} = $title;
last;
}


}
}
return \%include;
}

sub start{
my ($self,$tag,$attr) = @_;
if($tag eq 'body'){
$self->{search} = 1;
}

# if($tag eq 'div' and $self->{search}){
# $self->{divs}++;
# }

if($tag eq 'title'){
$self->{title} = 1;

}
}

sub text{
my ($self,$dtext) = @_;
$string .= $dtext if($self->{search});
$title = $dtext if($self->{title});
}

sub end{
my ($self,$tag) = @_;
if($tag eq 'div' and $self->{search}){
$self->{divs}--;
}

if($tag eq 'title'){
$self->{title} = 0;
}
}

sub umlauts{
my ($term) = @_;
$term=~ s/&#8221;/?\;/g;
$term=~ s/x/?\;/g;
$term=~ s/&#8211;/?\;/g;
$term=~ s/\?/?\;/g;
$term=~ s/&#184;/?\;/g;
$term=~ s/\?/?\;/g;
$term=~ s/\?/?\;/g;
return $term;
}
Gast Gast
 2007-12-03 15:47
#103398 #103398
Ich nehme mal an, dass das Durchsuchen der ganzen Unterverzeichnisse und die Umwandlung von HTML in Text durch den Parser arg lang dauert und dann ein Timeout geschieht.

Wenn die Inhalte nicht sich ändern (statische Seiten), dann wäre ein vorgenerierter Index sinnvoller.

Wie wäre es mit Perlfect. Perlfect greift auf einen generierten Index zurück und ist daher schneller.
Rocco
 2007-12-06 15:50
#103516 #103516
User since
2005-11-18
37 Artikel
BenutzerIn
[default_avatar]
die inhalte ändern sich eigentlich nicht.

gibts eine möglichkeit die vorhandene suche von renee so umzubauen, dass das timeout abgefangen wird?

weil jetzt wieder eine neue suche bzw. ein neues system einzubauen, davor fürcht ich mich ehrlich gesagt.

hab selber so gut wie keine ahnung von perl, und war froh, dass mir renee soweit mit dem script geholfen hat, dass es prinzipiell perfekt für die seite funktioniert.
GwenDragon
 2007-12-06 17:31
#103523 #103523
User since
2005-01-17
14747 Artikel
Admin1
[Homepage]
user image
Du kannst nicht herausfinden, warum es den Serverfehler gab?

CGI-Skripte haben auf den meisten Servern eine maximale Laufzeit. Danach killt der Server das Skript.
Das kannst du leider nicht ändern; bei den meisten Anbieter bleibt das auch so.

Das Onlinedurchsuchen von Seiten nach deiner Methode wird wohl so bei größeren Websites und längeren Webseiten nicht gerade schnell, wenn überhaupt gehen.
Wenn der Server viele verscheiden Websites hostet und Anfragen zu bedienen hat, kostet das Resourcen und dann langt es vielleicht nicht mehr für deine Seite.
Rocco
 2007-12-10 12:43
#103681 #103681
User since
2005-11-18
37 Artikel
BenutzerIn
[default_avatar]
ist es möglich das vorhandene script, mit einfachen mitteln so anzupassen, um das servertimeout zu umgehen?
Oder ist die einzig vernünftige möglichkeit die, das ganze script umschreiben bzw. ein anderes verwenden?
renee
 2007-12-10 13:26
#103684 #103684
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Wie GwenDragon schon schrieb kannst Du in der Regel relativ wenig gegen das Killen des Skripts durch den Webserver machen.

Wenn Du wirklich eine Suchmaschine machen möchtest, kannst Du Dir ja mal CPAN:Plucene anschauen.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
RalphFFM
 2007-12-11 11:50
#103728 #103728
User since
2006-11-16
258 Artikel
BenutzerIn
[Homepage] [default_avatar]
Zu Skriptanfang und zu Skriptende eine einfache Zeile in eine (Log-)File schreiben dann müßte man erkennen können ob es durchläuft oder nicht (w/ Timeout).

Im letzteren Falle ginge diese Aufgabe aber m.E. prinzipiell trotzdem zu lösen. Ein nicht selten benutzter Trick für die Timeout-Falle ist den eigentlichen Prozeß in mehrere Häppchen aufzuspalten, in (kleinere/kürzere) Prozesse, die innerhalb der Timeoutfrist bleiben.

Ein Auslösen mehrerer Prozesse in kurzen Zeitabständen kann man z.B. mittels HTML-Refresh machen. Also m.a.W. z.B. Verzeichnisse einzeln durchsuchen, und die Suchergebnisse jeweils in ein und dieselbe Datei schreiben. Und der letzte angestoßene Prozeß gibt dann die Suchergebnisse (Datei-Inhalt) an den Browser zurück ...

Einfacher wäre vielleicht einen Provider zu suchen mit längerer Timeout-Frist. Hier gibt es nämlich größere Unterschiede. -> Provider fragen.

Gruß, Ralph
<< >> 7 Einträge, 1 Seite



View all threads created 2007-12-03 15:12.