WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   City Network förbjuder mysql_pconnect (https://www.wn.se/forum/showthread.php?t=1046836)

robincox 2011-02-28 18:05

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.

emilv 2011-02-28 18:48

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.

robincox 2011-02-28 19:00

Citat:

Ursprungligen postat av emilv (Inlägg 20395212)
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.

På den siten så kopplade jag upp mot databasen en gång med mysql_pconnect, sen behövde jag inte göra annat än att skriva mina sql anrop i koden utan någon form av uppkoppling. Eftersom det bara finns en uppkoppling och en massa sql anrop överallt i koden så måste jag altså koppla upp mot databasen innan varje sql anrop.

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.

emilv 2011-02-28 19:07

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.

tartareandesire 2011-02-28 19:23

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.

Jawn 2011-02-28 20:45

http://www.php.net/manual/en/feature...onnections.php

Clarence 2011-02-28 21:04

Citat:

Ursprungligen postat av robincox (Inlägg 20395213)
På den siten så kopplade jag upp mot databasen en gång med mysql_pconnect, sen behövde jag inte göra annat än att skriva mina sql anrop i koden utan någon form av uppkoppling. Eftersom det bara finns en uppkoppling och en massa sql anrop överallt i koden så måste jag altså koppla upp mot databasen innan varje sql anrop.

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 tror du saknar kunskap om vad persistent connections faktiskt är. Skillnaden i ditt script är inga vad gäller antalet anslutningar som måste göras per page load. Normalt sätt ska du inte stänga en anslutning förrän du gjort alla dina queries - oavsett anslutningsmetod. Undantaget är när du har bakgrundsjobb eller liknande som tar väldigt lång tid på sig att slutföras.

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.

robincox 2011-02-28 23:21

Jag har endast en pconnect, skulle jag kunna byta ut den mot en connect då menar du?

Clarence 2011-03-01 08:07

Citat:

Ursprungligen postat av robincox (Inlägg 20395269)
Jag har endast en pconnect, skulle jag kunna byta ut den mot en connect då menar du?

Ja, så länge du inte stänger anslutningen är den öppen under hela scriptets exekveringstid. Skillnaden mot pconnect ligger först efter det.

eliasson 2011-03-01 08:35

Citat:

Ursprungligen postat av robincox (Inlägg 20395269)
Jag har endast en pconnect, skulle jag kunna byta ut den mot en connect då menar du?

Finns det någon anledning till att du använder mysql_pconnect (persistant) framför mysql_connect?

Jag tycker att City Network har gjort rätt beslut, men de bör informera alla sina kunder i god tid innan!

robincox 2011-03-01 10:03

Citat:

Ursprungligen postat av eliasson (Inlägg 20395291)
Finns det någon anledning till att du använder mysql_pconnect (persistant) framför mysql_connect?

Jag tycker att City Network har gjort rätt beslut, men de bör informera alla sina kunder i god tid innan!

De har säkert informerat alla kunder. Har ingen aning eftersom jag inte är kund där. Däremot har ju jag en kund till mig som ligger där. Detta innebär att min kund som inte har någon aning om vad pconnect är har fått infon och troligtvis inte brytt sig om den.

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.

robincox 2011-03-01 10:17

Citat:

Ursprungligen postat av Clarence (Inlägg 20395290)
Ja, så länge du inte stänger anslutningen är den öppen under hela scriptets exekveringstid. Skillnaden mot pconnect ligger först efter det.

Tack för hjälpen. Det fungerade med att byta ut pconnect mot connect på ett ställe. Behöver jag inte stänga uppkopplingen till databasen vid något tillfälle då?

eliasson 2011-03-01 10:37

Citat:

Ursprungligen postat av robincox (Inlägg 20395315)
Tack för hjälpen. Det fungerade med att byta ut pconnect mot connect på ett ställe. Behöver jag inte stänga uppkopplingen till databasen vid något tillfälle då?

Som tidigare påpekat sköter PHP det automatiskt.

Citat:

Using mysql_close() isn't usually necessary, as non-persistent open links are automatically closed at the end of the script's execution.
Ref: http://php.net/manual/en/function.mysql-close.php

robincox 2011-03-01 12:49

Citat:

Ursprungligen postat av eliasson (Inlägg 20395327)
Som tidigare påpekat sköter PHP det automatiskt.


Ref: http://php.net/manual/en/function.mysql-close.php

Tackar allihopa, ni har räddat min dag :)

danjel 2011-03-01 15:42

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)

Jine 2011-03-02 03:34

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

danjel 2011-03-02 10:06

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