![]() |
City Network förbjuder mysql_pconnect
Jag skapade en site åt en kund för ett tag sen där jag använde mysql_pconnect för att koppla upp till databasen. Siten fungerade som den skulle under en tid för att helt plötsligt sluta fungera. Ett felmeddelande visades om att det inte gick att koppla upp till databasen, vilket tydde på att felet låg hos webbhotellet.
Felet verkade ligga hos webbhotellet, så jag tog kontakt med dem och det visar sig att de nyligen har ändrat så att de inte längre tillåter siter att koppla upp till respektive databaser via mysql_pconnect. Detta betyder en hiskeligt massa extrajobb för mig för att få siten att fungera igen (måste byta ut alla mysql_pconnect till mysql_connect och stänga databasuppkopplingarna efteråt). Känns inte direkt säkert att ha med dem att göra igen, tänk om de börjar hindra andra funktioner som belastar deras system i framtiden. Hoppas de nu blir nerringda så att de också får lida för detta. |
Persistent connections är något som brukar vara avstängt på webbhotell då det tar enorma resurser i anspråk på databasservrarna utan någon märkbar skillnad i laddningstid.
Du måste inte stänga databasuppkopplingarna efter dig i PHP; det sköter PHP automatiskt när skriptet avslutas. Det normala brukar vara att man lägger databasuppkopplingen i en fil som man sedan inkluderar på andra sidor, så då är det bara ett ställe att ändra på. Jag tror att även City network utgått från detta när de gjorde ändringen. Jag tycker också det är dåligt av dem att stänga av det utan att först kolla vilka som använder det och kontakta dessa kunder. Kräv kompensation, till exempel i form av en gratis månad eller liknande. |
Citat:
Detta skulle i och för sig inte vara så jobbigt eftersom jag använder dreamweaver och kan infoga en uppkoppling innan varje anrop. Slipper jag stänga uppkopplingen efteråt så skulle det underlätta väldigt mycket. |
Jag tycker att du verkar ha ett väldigt rörigt upplägg av din kod (eller missförstår jag något i det du skriver?). Inte behöver du koppla upp till databasen innan varje anrop; det räcker med en gång per sidladdning.
Gör en fil som du kanske kallar för 'sqlconnect.php' där du kopplar upp till databasen. Denna fil inkluderar du högst upp på de sidor som ska göra databasanrop (eller i alla sidor). Därefter kan du köra hur många databasfrågor du vill över den uppkopplingen. PHP avslutar automatiskt uppkopplingen när sidan är klar. Använder du require_once eller include_once så kommer filen dessutom bara att inkluderas en gång per sidladdning, ifall du har svårt att hålla reda på om den inkluderats eller inte. |
Måste instämma med Emil. Har du en vettig kodstruktur så innebär det inget direkt arbete för dig att göra denna ändring. Råkar du ha kodat tokigt så kan du köra en enkel search and replace. Tycker det är helt korrekt agerat av City Network att stänga av denna funktion. Däremot bör man givetvis ha informerat sina kunder om det i förväg, att de inte gjort det är ytterst märkligt.
|
|
Citat:
I en delad hosting-miljö vet du inte tillräckligt om situationen för att kunna avgöra om persistant connections ger någon som helst fördel eller bara nackdelar. Jag skulle till och med vilja påstå att det _aldrig_ på en sajt i en delad hosting-miljö finns anledning att överväga persistant connections. Vidare föreslår jag att du skaffar en vettig editor, eller extra verktyg, med en enkel search and replace i filer (google "search and replace in files" borde ge dig en del resultat på de första sidorna). Byter du ut alla pconnect mot connect så får du inga problem alls förutsatt att din sajt inte är extremt ineffektivt skriven i övrigt. Anslutningarna stängs nämligen (som andra redan informerat) så fort ditt script exekverats färdigt. |
Jag har endast en pconnect, skulle jag kunna byta ut den mot en connect då menar du?
|
Citat:
|
Citat:
Jag tycker att City Network har gjort rätt beslut, men de bör informera alla sina kunder i god tid innan! |
Citat:
För mig som inte fått någon info så var det mycket märkligt att sidan helt plötsligt låg nere. Så jag ringde supporten som gav mig svaret att jag troligtvis hade något fel i mitt uppkopplings anrop. Till slut så fick en av deras tekniker kolla på min kod och då upptäckte han pconnect. |
Citat:
|
Citat:
Citat:
|
Citat:
|
Om man vill "simulera" persistenta connections och undvika flera connections per request så finns det ett sätt via kod.
T.e.x kanske man kör ett antal frågor på en sida men dessa frågor ligger i olika include filer, och man för att behålla modularitet i koden vill göra en connection i varje fil, då bör man hantera så att kopplingen återanvänds.. Ungefär så (osäker om syntax är helt korrekt) : function db_connect() { static $cn; if($cn == null){ $cn = mysql_connect("localhost","root",""); } return $cn; } En mysql_connect sker alltså endast första gången funktionen anropas men den returnerar alltid en connection. (Principen kallas "Singleton pattern" i en objektorienterat kod) |
Nja, nu måste jag nog skicka dig att läsa på lite.
Du har missuppfattat vad funktionen gör. Din kod är dock relativt korrekt, men är totalt onödig och värdelös :) http://se2.php.net/manual/en/functio...l-pconnect.php |
Alltså jag menade inte simulera men "simulera" : ) i bemärkelsen att man vill undvika för många connections och stort minnesutnyttjande vid anslutning till databas.
Koden ovan är inte värdelös , den gör inte flera anrop till "mysql_connect". Dock så kanske prestandavinsten är liten i detta fall, jag hade för mig att mysql_connect skapar ny connection link för varje anrop, men i PHP versioner nyare än 4.2 är så inte fallet: "If a second call is made to mysql_connect() with the same arguments, no new link will be established, but instead, the link identifier of the already opened link will be returned." (Det är viktigare med ett Singleton eller en global variabel vad gäller PDO, då man skapar ett nytt objekt och vill spara den instansen under hela scriptets livslängd ) |
Alla tider är GMT +2. Klockan är nu 16:00. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson