Schrift
[thread]3558[/thread]

Schnellste Möglichkeit 1 Zeile abzurufen



<< |< 1 2 >| >> 18 Einträge, 2 Seiten
stb2050
 2005-04-14 21:31
#33141 #33141
User since
2003-08-14
87 Artikel
BenutzerIn
[default_avatar]
Hi Ihr,

einfache Frage:

Wie kann ich _am schnellsten_ eine Zeile der MySQL-DB abfragen un die Inhalte in Variablen packen?

Habe es derzeit so:

Code: (dl )
1
2
3
4
5
6
7
8
   use DBI;
$dbh = DBI->connect("DBI:$dbdriver:$dbdatabase:$dbhost:$dbport", $dbuser, $dbpassword);
$data = $dbh->selectrow_hashref("SELECT * FROM hpm_sessions WHERE sid='$uid';");
$dbh->disconnect;

$username = $$data{'username'};
$lng = $$data{'lng'};
$userid = $$data{'userid'};


Geht das noch fixer? :-)

Liebe Grüße,
Steffen
ptk
 2005-04-14 21:47
#33142 #33142
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Schneller oder kuerzer? Um Code injections zu verhindern, solltest du uebrigens mit Platzhaltern arbeiten.
stb2050
 2005-04-14 22:15
#33143 #33143
User since
2003-08-14
87 Artikel
BenutzerIn
[default_avatar]
Schneller, mein Server lahmt total wegen den hohen Userzahlen :-)

Ja, normalerweise kommt der SQL-Code auch in eine Variable. Habe ich jetzt hier nur mal als Beispiel so gemacht.

Hintergrund ist ein Session-System. Ich möchte probieren, ob es mit Datenbanken oder mit Text-Dateien schneller ist.

DB-System:

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
#!/usr/bin/perl

#Einleitung

use CGI;
use CGI::Carp qw(fatalsToBrowser);
use POSIX;
$q = new CGI;

$page = $q->param("page");

require "../hpm_einstellungen.cgi";
require "../templates_login/$logintemplate/daten.cgi";

if ($page eq "index")
{
  #Eingaben einlesen

  $username = $q->param("user");
  $passwort = $q->param("pass");
  $lng = $q->param("lng");

  $username = lc($username);

  if ($username eq "") { print "Location: $maindir/index.php?lng=$lng&page=fehler&er=29\n\n"; exit(); }
  if ($passwort eq "") { print "Location: $maindir/index.php?lng=$lng&page=fehler&er=30\n\n"; exit(); }

  if (!(-e "../$internmaindir/userdaten/main/$username.dat")) { print "Location: $maindir/index.php?lng=$lng&page=fehler&er=31\n\n"; }

  open(FILE, "../$internmaindir/userdaten/main/$username.dat");
  chomp(@userdata = <FILE>);
  close(FILE);

  $userid = $userdata[0];
  $sollpass = $userdata[2];
  $lng = $userdata[3];

  $passwortc = crypt $passwort, 12;
  $pass = $passwort;

  if (!($passwortc eq $sollpass)) { print "Location: $maindir/index.php?lng=$lng&page=fehler&er=31\n\n"; }

  #Session anlegen

  $uid .= ("a".."z")[int rand 62] foreach 1..10;

  use DBI;
  $dbh = DBI->connect("DBI:$dbdriver:$dbdatabase:$dbhost:$dbport", $dbuser, $dbpassword);
  $dbh->do("INSERT INTO hpm_sessions VALUES ('$uid','time();','$username','$lng','$userid');");
}
else
{
  $uid = $q->param("uid");

  #Session vorhanden?

  use DBI;
  $dbh = DBI->connect("DBI:$dbdriver:$dbdatabase:$dbhost:$dbport", $dbuser, $dbpassword);
  $data = $dbh->selectrow_hashref("SELECT username, lng, userid FROM hpm_sessions WHERE sid='$uid';");

  $username = $$data{'username'};
  $lng = $$data{'lng'};
  $userid = $$data{'userid'};

  if (!$username)
  {
     print "Location: $maindir/index.php?lng=$lng&page=fehler&er=31\n\n";
  }

  $bilderdir = "$maindir/sprache/$lng/bilder";
}

require $page . ".cgi";

exit();


System mit Textdateien:

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
#!/usr/bin/perl

#Einleitung

use CGI;
use CGI::Carp qw(fatalsToBrowser);
use POSIX;
$q = new CGI;

$page = $q->param("page");

require "../hpm_einstellungen.cgi";
require "../templates_login/$logintemplate/daten.cgi";

if ($page eq "index")
{
  #Eingaben einlesen

  $username = $q->param("user");
  $passwort = $q->param("pass");
  $lng = $q->param("lng");

  $username = lc($username);

  if ($username eq "") { print "Location: $maindir/index.php?lng=$lng&page=fehler&er=29\n\n"; exit(); }
  if ($passwort eq "") { print "Location: $maindir/index.php?lng=$lng&page=fehler&er=30\n\n"; exit(); }

  if (!(-e "../$internmaindir/userdaten/main/$username.dat")) { print "Location: $maindir/index.php?lng=$lng&page=fehler&er=31\n\n"; }

  open(FILE, "../$internmaindir/userdaten/main/$username.dat");
  chomp(@userdata = <FILE>);
  close(FILE);

  $userid = $userdata[0];
  $sollpass = $userdata[2];
  $lng = $userdata[3];

  $passwortc = crypt $passwort, 12;
  $pass = $passwort;

  if (!($passwortc eq $sollpass)) { print "Location: $maindir/index.php?lng=$lng&page=fehler&er=31\n\n"; }

  #Session anlegen

  $time = time();
  $zf .= ("a".."z","A".."Z",0..9)[int rand 62] foreach 1..8;
  $uid = $time . "_" . $zf;

  open(FILE, ">sessions/$uid");
  print FILE $username . "\n";
  print FILE $lng . "\n";
  print FILE $userid . "\n";
  close(FILE);
}
else
{
  $uid = $q->param("uid");

  #Session vorhanden?

  if (-e "sessions/$uid")
  {
     open(FILE, "sessions/$uid");
     chomp(@sessfile = <FILE>);
     close(FILE);

     ($username, $lng, $userid) = @sessfile;
  }
  else
  {
     print "Location: $maindir/index.php?lng=$lng&page=fehler&er=31\n\n";

  }

  $bilderdir = "$maindir/sprache/$lng/bilder";
}

require $page . ".cgi";

exit();


Bis jetzt habe ich das Gefühl, dass die Text-Version wesentlich schneller ist, aber das muss doch alles noch viel optimierbarer ein.

Bei beiden System wird zum Anlegen der Session mit page=index aufgerufen, danach ist page immer etwas anderes und die Session wird abgefragt.

LG,
Steffen



Viele Grüße,
Steffen\n\n

<!--EDIT|stb2050|1113502798-->
Taulmarill
 2005-04-15 12:13
#33144 #33144
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
hast du schon einmal erwogen mod_perl zu benutzen? damit lässt sich viel zeit sparen, da das script nicht bei jedem aufruf neu geladen werden muss, sondern im speicher bleibt.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
stb2050
 2005-04-15 12:46
#33145 #33145
User since
2003-08-14
87 Artikel
BenutzerIn
[default_avatar]
[quote=Taulmarill,15.04.2005, 10:13]hast du schon einmal erwogen mod_perl zu benutzen? damit lässt sich viel zeit sparen, da das script nicht bei jedem aufruf neu geladen werden muss, sondern im speicher bleibt.[/quote]
Danke für den Tipp, hab ich gestern Nacht noch installieren lassen.

Mal sehen, was es heute zu den Haupt-Zeiten bringt

Liebe Grüße,
Steffen
ptk
 2005-04-15 13:16
#33146 #33146
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Einfach installieren reicht nicht, du musst Apache auch sagen, dass es das Skript auch unter mod_perl ablaufen lassen soll, z.B. so:
Code: (dl )
1
2
3
4
5
  <Location dein_cgi_skript.cgi>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</Location>
stb2050
 2005-04-15 13:25
#33147 #33147
User since
2003-08-14
87 Artikel
BenutzerIn
[default_avatar]
[quote=ptk,15.04.2005, 11:16]Einfach installieren reicht nicht, du musst Apache auch sagen, dass es das Skript auch unter mod_perl ablaufen lassen soll, z.B. so:
Code: (dl )
1
2
3
4
5
  <Location dein_cgi_skript.cgi>
   SetHandler perl-script
   PerlHandler Apache::Registry
   Options +ExecCGI
 </Location>
[/quote]
Hab das meinen Admin machen lassen, da gehe ich davon aus, dass er es richig gemacht hat *gg*

Liebe Grüße,
Steffen

PS: Mich würde die Antwort auf meine Fragen oben trotzdem noch interessieren, weil so ist es ja keine Dauerlösung.
Relais
 2005-04-15 13:41
#33148 #33148
User since
2003-08-06
2246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Es geht schneller, wenn Du nicht für jede Abfrage den Connect machst. Im Idealfall ist der Connect schon passiert und Du machst nur noch die Abfragen. Bei vielen ähnlichen Abfragen bringt ein prepare/execute noch Geschwindigkeitsgewinn.

"Mal eben nur eine Abfrage" ist leider so gar nicht optimal.
Erst denken, dann posten --
27. Deutscher Perl- u. Raku -Workshop (Termin wird noch gesucht) 2025 in München.

Winter is Coming
GwenDragon
 2005-04-15 14:22
#33149 #33149
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Vorsicht, bei mod_perl nicht vergessen, dass das Skript nur einmal geladen wird!
Variablen immer zu Beginn initialisieren und am Ende wieder per undef oder so löschen! Ansonsten bleiben sie statisch im Speicher des Apache.

Also:
mod_perl <> CGI || mod_perl ~~ CGI
Manches ist ähnlich.
Einiges geht, aber aufpassen und Doku lesen.
stb2050
 2005-04-15 15:20
#33150 #33150
User since
2003-08-14
87 Artikel
BenutzerIn
[default_avatar]
[quote=Relais,15.04.2005, 11:41]Es geht schneller, wenn Du nicht für jede Abfrage den Connect machst. Im Idealfall ist der Connect schon passiert und Du machst nur noch die Abfragen. Bei vielen ähnlichen Abfragen bringt ein prepare/execute noch Geschwindigkeitsgewinn.

"Mal eben nur eine Abfrage" ist leider so gar nicht optimal.[/quote]
hmm... und was heißt das genau für eine Änderung in meinem Code, der ganz oben steht?

Liebe Grüße,
Steffen
<< |< 1 2 >| >> 18 Einträge, 2 Seiten



View all threads created 2005-04-14 21:31.