FAQ |
Kalender |
2009-02-23, 10:06 | #1 | ||
|
|||
Flitig postare
|
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? |
||
Svara med citat |
2009-02-23, 11:05 | #2 | ||
|
|||
Klarade millennium-buggen
|
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. |
||
Svara med citat |
2009-02-23, 11:23 | #3 | |||
|
||||
Mycket flitig postare
|
Kanske går det att lösa med exceptioner:
Kod:
try { // databasfråga } catch (Exception $e) { echo 'Caught exception: ', $e->getMessage(), "\n"; } |
|||
Svara med citat |
2009-02-23, 11:39 | #4 | ||
|
|||
Flitig postare
|
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? |
||
Svara med citat |
2009-02-23, 11:46 | #5 | ||
|
|||
Har WN som tidsfördriv
|
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" |
||
Svara med citat |
2009-02-23, 11:49 | #6 | ||
|
|||
Flitig postare
|
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.
|
||
Svara med citat |
2009-02-23, 12:37 | #7 | ||
|
|||
Flitig postare
|
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. |
||
Svara med citat |
2009-02-23, 16:00 | #8 | ||
|
|||
Har WN som tidsfördriv
|
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.
|
||
Svara med citat |
2009-02-23, 18:50 | #9 | ||
|
|||
Administratör
|
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.... ?>
__________________
eldefors.com - Personlig (teknik)-blogg |
||
Svara med citat |
2009-02-25, 08:41 | #10 | ||
|
|||
Flitig postare
|
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:
|
||
Svara med citat |
Svara |
|
|