Kom ihåg mig?
Home Menu

Menu


MySQL servern har vandrat sin väg

 
Ämnesverktyg Visningsalternativ
Oläst 2009-02-23, 10:06 #1
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
Jag har ett batch-script i php som tar väldigt lång tid att exekvera. Den består av en massa sql-frågor och beräkningar. I början av scriptet så gör jag en en mysql_connect(). Samma koppling använder jag genom hela scriptet.

Men, nu har det börjat dyka upp en felmeddelande "MySQL server has gone away". Som jag förstår det har själva kopplingen timat-ut någon gång under körningen av php-scriptet.

Frågan är hur jag upptäcker att jag inte längre har någon connection.

Om jag gör

$db = mysql_connect(...)

kan jag då senare i mitt script kolla

if (!$db) {
$db = mysql_connect(...)
}

Eller finns det något smidigare sätt att kolla om uppkopplingen finns eller ej?
radioaktivitet är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-02-23, 11:05 #2
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Uppkopplingen finns väl kvar som en handle, men när du väl använder den får du ett felmeddelande som innebär att servern gått och fiskat.
Har haft det problemet från och till och det är svåranalyserat. Mysql-manualen är inte särskilt meddelsam.
Tydligen är det inte bara en tidsfråga som kan få servern att sluta lyssna på det örat.
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-02-23, 11:23 #3
martines avatar
martine martine är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Mar 2005
Inlägg: 767
martine martine är inte uppkopplad
Mycket flitig postare
martines avatar
 
Reg.datum: Mar 2005
Inlägg: 767
Kanske går det att lösa med exceptioner:
Kod:
try {
// databasfråga
} catch (Exception $e) {
  echo 'Caught exception: ', $e->getMessage(), "\n";
}
Annars får du väl kontrollera felmeddelanden mysql_errno() och koppla upp dig igen.
martine är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-02-23, 11:39 #4
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
Magnus_A: Så du menar att det inte räcker med att kolla handeln, dvs $db variabeln (i mitt fall)?

martine: Jag vill helst inte behöva ställa en extra fråga till databasen, bara för att kolla om min connection fungerar. Ditt tips med mysql_errno() fungerar säkert. Problemet är bara att jag vill veta, innan jag ställer min fråga, att min connection fungerar.

Fler förslag?
radioaktivitet är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-02-23, 11:46 #5
studiox studiox är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2004
Inlägg: 1 356
studiox studiox är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2004
Inlägg: 1 356
Kör du scriptet på servern eller på en annan server med IP?

Kör du IP kan det ju vara själva IP connectionen som har en timeout. Om du kör lokalt skulle jag köra SOCKS (om det är linux) - Tror inte dom har samma timeout, men det är inte riktigt "my cup of tea"
studiox är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-02-23, 11:49 #6
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
Jag kör scriptet på servern. Databasen ligger dock på en annan server på samma nätverk. Jag kopplar mig till databasen mha ip-adressen. Skulle du rekommendera socks i mitt fall? I så fall får jag kolla upp vad det är.
radioaktivitet är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-02-23, 12:37 #7
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
Efter lite grävande så har jag hittat följande funktioner. Har dock ingen aning om hur de relaterar till varandra

is_resource($dblink)
mysql_ping($dblink)

Vad tror ni om denna kod?

function getdb() {
global $db;
if (!$db || !is_resource($db)) {
$db = mysql_connect(...);
} else {
mysql_ping($db);
}
return $db;
}

Då skulle jag i min kod då och då anropa getdb() för att få en koppling. Är dock inte säker på att ovanstående kod fungerar då jag inte riktigt förstår vad is_resource och mysql_ping gör i olika situationer.
radioaktivitet är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-02-23, 16:00 #8
studiox studiox är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2004
Inlägg: 1 356
studiox studiox är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Aug 2004
Inlägg: 1 356
Ett annat alternativ kan väl vara och göra en stored procedure av din förfrågan, om det är möjligt att köra den helt i mysql "så att säga" och användas console för att anropa scriptet. Då borde du inte få timeout med php->IP iaf.
studiox är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-02-23, 18:50 #9
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Clarence Clarence är inte uppkopplad
Administratör
 
Reg.datum: Jan 2003
Inlägg: 1 974
Jag misstänker att det räcker med att öka på din wait_timeout i mysql, använder du en användare med SUPER lär du kunna öka på den endast för aktuell session i ditt batch-script.

Aldrig använt mysql_ping då jag inte haft problemet så kollade upp funktionen och följande lilla klipp förefaller vara ok, om du bara wrappar in det i en funktion som du skickar en query till:
Kod:
If you're having problems auto-reconnecting when the connection is dropped, use this code:

<?php

$conn = mysql_connect('localhost','user','pass');
mysql_select_db('db',$conn);

if (!mysql_ping ($conn)) {
  //here is the major trick, you have to close the connection (even though its not currently working) for it to recreate properly.
  mysql_close($conn);
  $conn = mysql_connect('localhost','user','pass');
  mysql_select_db('db',$conn);
}

//run queries knowing that your connection is alive....

?>
Clarence är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-02-25, 08:41 #10
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
radioaktivitet radioaktivitet är inte uppkopplad
Flitig postare
 
Reg.datum: Jun 2006
Inlägg: 336
Tack för svar. Skulle nedanstående kod fungera? Observera att jag även använder mig av is_resource()-funktionen. Jag vet fortfarande inte riktigt hur man skall använda sig av den...

Citat:

function getdb() {
global $db;
if (!$db || !is_resource($db)) {
$db = mysql_connect(...);
mysql_select_db('db',$db);
} else {
if (!mysql_ping ($db)) {
mysql_close($db);
$db = mysql_connect(...);
mysql_select_db('db',$db);
}
}
return $db;
}
radioaktivitet är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 06:01.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017