WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   MySQL servern har vandrat sin väg (https://www.wn.se/forum/showthread.php?t=35318)

radioaktivitet 2009-02-23 10:06

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?

Magnus_A 2009-02-23 11:05

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.

martine 2009-02-23 11:23

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.

radioaktivitet 2009-02-23 11:39

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?

studiox 2009-02-23 11:46

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" :(

radioaktivitet 2009-02-23 11:49

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 2009-02-23 12:37

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.

studiox 2009-02-23 16:00

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.

Clarence 2009-02-23 18:50

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....

?>


radioaktivitet 2009-02-25 08:41

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;
}


Magnus_A 2009-02-25 10:06

Hjälper det att åter ansluta om du har en öppen fråga som rullar? Då är väl den borta?
Annars kan du stänga anslutningen och öppna ny för varje delmoment i ditt script.

radioaktivitet 2009-02-25 10:14

Hur menar du?

Jag tänker att jag skall anropa getdb() för varje nytt delmoment i mitt script. Men att det är onödigt att skapa en ny anslutning om det redan finns en fungerande. Men det kanske är fel tänkt?

Danielos 2009-02-25 10:25

Att du inte bara ändrar värdena på my.cnf:
interactive_timeout
wait_timeout

Så du inte får timeout?

martine 2009-02-25 12:42

Om det är viktigt att sql-frågorna faktiskt utförs så kan det nog vara en bra idé att kolla mysql_errno() i efterhand för att se att frågorna faktiskt utförts…?

Magnus_A 2009-02-25 13:14

Om du använder singelton-principen( http://www.talkphp.com/advanced-php-progra...gn-pattern.html ) för att skapa databasanslutningar så kan du lägga till en kodrad som kollar om anslutningen verkligen fungerar och inte bara finns , och i så fall som Clarence föreslår tar bort anslutningen och skapar en ny.


Alla tider är GMT +2. Klockan är nu 14:23.

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