» »

PHP povezava z Mysql

PHP povezava z Mysql

snooze77 ::

Torej delam eno stran s pomočjo php. Stvar je sledeča. Ko kliknemo na neko stran npr. pridobi_studente se v kodi povežem z bazo in prikažem rezultate. Problem je,ker je čas povezovanja in pridobivanja podatkov iz baze počasen. Čas sem izmeril in mi je pokazalo 1,01s na sql. Stran imam zgrajeno na naslednji način:
Sql stavke imam v ločeni datoteki v funkcijah na ta način

function PridobiStudente()
    {
        povezava();
        
        $utf8="SET NAMES utf8";
        mysql_query($utf8);
        $result = mysql_query("SELECT ime, priimek FROM studenti");
        ConnectionClose();
        return $result;
    }


Za connection in disconnection imam funkciji, ki jih v sql stavkih kličem.

Ni mi jasno zakaj tako počasna povezava. Uporabljam xampp, torej je vse localhost. Sem že probal, da ne bi klical funkcij ampak bi imel kodo kar na strani ampak so isti rezultati.
Mi lahko kdo pomaga?

Hvala

maticb492 ::

Zakaj moraš vsakič dat na utf-8? če je velika baza ga mogoče celo to zavira, da celo bazo spremeni na utf-8?

carota ::

Kaj če bi najprej izmeril čas vsakega koraka, recimo čas potreben za izvedbo povezava(), za mysql_query($utf8), za $result..., za ConnectionClose()?

Ne vidimo kaj se zgodi v funkcijah povezava() in ConnectionClose();

snooze77 ::

Baza ni tako velika, da bi ga to oviralo vsaj po mojem. To zato naredim, ker sem imel problem z š,č,ž in sem našel to kot rešitev. Imam v meta,php in bazo na utf-8 in mi niso delovali.

function povezava()
    {
        $con = mysql_connect("localhost","++++","++++");
        if (!$con)
            {
                die('Could not connect: ' . mysql_error());
            }
           else
           {
               mysql_select_db("ovks", $con);
           }
    }

function ConnectionClose()
  {
      $con = mysql_connect("localhost","++++","+++++");
      mysql_close($con);
  }

To sta ti dve funkciji.

Časi:

        $msc=microtime(true);
        $con = mysql_connect("localhost","+++++","++++");
        mysql_select_db("ovks", $con);
        $msc=microtime(true)-$msc;
Čas:1,01s


        $msc=microtime(true);
        $utf8="SET NAMES utf8";
        mysql_query($utf8);
        $msc=microtime(true)-$msc;
Čas:0.0004s

        $msc=microtime(true);
        $result = mysql_query("SELECT naziv FROM predmeti");
        mysql_close($con);
        $msc=microtime(true)-$msc;

        $msc=microtime(true);
        $result = mysql_query("SELECT naziv FROM predmeti");
        mysql_close($con);
        $msc=microtime(true)-$msc;
Čas:0.0004s


Torej največ mu vzame vzpostavitev povezave z bazo.

Zgodovina sprememb…

  • spremenil: snooze77 ()

DeeJay ::

napiši vsebino mysql konfiguracije (my.cnf)

Mesar ::

Your turn to burn!

snooze77 ::

Mesar sem že probal to, kar piše v tem članku ubistvu sem našu podoben članek in mi ni delovalo. Ne vem zakaj ampak sem probal še enkrat in ugotovil, da sem prej pozabil v ConnectionClose funkciji zamenjat localhost z 127.0.0.1. Sedaj je dostop 0.002s s tem, da preberem tri različne stvari iz baze.

Hvala

DeeJay ::

Šele zdej opazu... ti ne zapiraš povezave od povezava() ampak, pri ConnectionClose() še 1x odpreš povezavo in to zapreš. To je napačno. Zato ti povezave odprte ostajajo.
Spremenljivko $con dej izven funkcije in jo potem kot global uvozi v vsako funkcijo posebi:


$con = isset ($con)  ? $con : FALSE;
function povezava()
{
	global $con;
	if (!$con)
	{
		$con = mysql_connect("localhost","++++","++++") or die('Could not connect: ' . mysql_error());
		mysql_select_db("ovks", $con);
		mysql_query("SET NAMES utf8");
	}
}

function ConnectionClose()
{
	global $con;
	if($con)
	{
		mysql_close($con) or die('Could not disconnect: ' . mysql_error());
		$con = FALSE;
	}
}


Tko da sedaj samo kličeš:
function PridobiStudente()
{
	povezava();
	$result = mysql_query("SELECT ime, priimek FROM studenti");
	ConnectionClose();
	return $result;
}

Zgodovina sprememb…

  • spremenil: DeeJay ()

DeeJay ::

Če pa hočeš, da nardi povezavo samo 1x na vrhu strani in jo potem sam zapre, ko neha izvajati kodo, pa lahko uporabiš tole funkcijo:
register_shutdown_function('ConnectionClose');


primer:

connect.php
<?php
$con = isset ($con)  ? $con : FALSE;
function povezava()
{
    global $con;
    if (!$con)
    {
        $con = mysql_connect("localhost","++++","++++") or die('Could not connect: ' . mysql_error());
        mysql_select_db("ovks", $con);
        mysql_query("SET NAMES utf8");
    }
}
 
function ConnectionClose()
{
    global $con;
    if($con)
    {
        mysql_close($con) or die('Could not disconnect: ' . mysql_error());
        $con = FALSE;
    }
}
register_shutdown_function('ConnectionClose');
?>


index.php
<?php
include ('connect.php');
povezava();

$stud = mysql_query("SELECT ime, priimek FROM studenti");
while ($row = mysql_fetch_assoc($stud))
{
    echo $row['ime'], ' ' , $row['priimek'], '<br>';
}
mysql_free_result($stud);
?>

4kik4 ::

Ali ti sicer baza dela hitro? Kaj pa v kakšnem drugem primeru, ali dela vedno počasi? Doma imam namreč server (na win7), in mi baza dela neverjetno počasi, in nevem, zakaj. Z isto kodo mi na najetem serverju to dela z normalno hitrostjo.

DeeJay ::

@4kik4 veliko je odvisno tudi od konfiguracije mysql serverja. Preveri kakšne imaš nastavitve my.cnf doma in na serverju. Seveda pa je odvisno tudi od samega računalnika (RAM, CPU, disk, ...)

Ziga Dolhar ::

Joj.

$con = isset ($con)  ? $con : FALSE;
..
$con = mysql_connect("localhost","++++","++++")


Ne tega delat. Imeti spremenljivko, ki je lahko različnih tipov ... je zelo, zelo slaba praksa. Imej dve ločeni spremenljivki.
https://dolhar.si/

DeeJay ::

In kaj bi blo v tem primeru lahko slabo? Me zanima, da se še kej novga naučim.

maticb492 ::

Malo offtopic, sam jaz nisem nikol uporabljal tega connection close, kaj je razlika med tem in kako jaz delam:
database.php file:

    $db_user = 'root';
    $db_pass = 'root';
    $db_name = 'baza';
    $db_server = 'localhost';
    
    mysql_connect($db_server,$db_user,$db_pass);
    mysql_select_db($db_name);


In potem se v drugih filih include ta file in sql query se nardi z enim stavkom, recimo takole :
  $query = sprintf("INSERT INTO admin (uname,pass) 
            VALUES ('%s', '%s')", mysql_real_escape_string($uname), mysql_real_escape_string($pass)
            );
          
          mysql_query($query);


Bi billo bolje če zapiram povezavo?

DeeJay ::

Definitivno je bolš da jo zapreš, drugače jo mora mysql timeoutat. In če maš dost obiskano stran se ti lahko zgodi, da ti bo zmanjkalo povezav.

Zgodovina sprememb…

  • spremenil: DeeJay ()

DeeJay ::

v my.cnf imaš nastavitev, koliko povezav dopuščaš (max_connections) in koliko časa potrebuje za timout povezave (wait_timeout)
če te nastavitve nimaš nastavljene je default wait_timeout 28800 sekund, kar pomeni, da povezava ostane odprta še 8 ur, če je prej ne zapreš. In če imaš nizek max_connections, lahko pomeni, da ti server ne bo več dopuščal novih povezav, dokler katera od odprtih povezav ne timeouta.

EDIT
Sm šu pogledat v php manual za mysql_connect in očitno ni več potrebno explicitno zapirat povezave:
Note:
The link to the server will be closed as soon as the execution of the script ends, unless it's closed earlier by explicitly calling mysql_close().


To je PHP, lahko pa da kak drug programski jezik tega ne počne. Zato je pomojem dobra praksa, da počistiš zadeve za sabo.

Zgodovina sprememb…

  • spremenil: DeeJay ()

snooze77 ::

DeeJay hvala za odgovor. Ne vem kk sem lahka naredil tako napako. Sem uporabil takšen način kot si ga ti pokazal, da avtomatsko zapre povezavo. Sem nov v php zato pride do kakšnih napak.
Še enkrat hvala, Lp


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

php pomoč (sql)

Oddelek: Programiranje
6848 (676) joebanana
»

[php] Knjiga gostov

Oddelek: Izdelava spletišč
293072 (2275) darix
»

PHP login skript

Oddelek: Izdelava spletišč
282714 (1300) Lion29
»

php update

Oddelek: Programiranje
7858 (672) keworkian
»

napaka pri instalaciji foruma

Oddelek: Izdelava spletišč
81310 (1140) no_use4

Več podobnih tem