Too many connections - Πρόβλημα συνεχές

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
Άβαταρ μέλους
charavge
Δημοσιεύσεις: 378
Εγγραφή: 14 Σεπ 2006 15:47

Too many connections - Πρόβλημα συνεχές

Δημοσίευση από charavge » 30 Ιούλ 2013 20:10

Καλησπέρα σε όλους,

Στα error logs κάποιων σελίδων μας εμφανίζεται το εξής σφάλμα:
PHP Warning: mysql_connect() [<a href='function.mysql-connect'>function.mysql-connect</a>]: Too many connections in /home/mydomainname/public_html/dbconnection.php on line 3
Το σφάλμα εμφανίζεται διάσπαρτα χρονικά σε μία σελίδα ενώ σε άλλη σελίδα εμφανίζεται συχνότερα (σχεδόν κάθε μέρα). Η επισκεψιμότητα της 1ης είναι περίπου 2-8 επισκέψεις την ημέρα (15 pageviews), ενώ της άλλης 160-180 (500 pageviews). Έχουμε παρατηρήσει ότι πολλές φορές οι σελίδες αυτές όταν πάμε να μπούμε μέσα δε φορτώνουν ή αργούν πάρα πολύ να φορτώσουν.

Να πω ότι οι σελίδες αυτές είναι custom και το σφάλμα "χτυπάει" στο παρακάτω script:

[dbconnection.php]

Κώδικας: Επιλογή όλων

<?php
// Make MySQL Connection
$link=mysql_connect&#40;"localhost", "***", "***"&#41; or die&#40;mysql_error&#40;&#41;&#41;;
mysql_query&#40;"set character set 'utf8'", $link&#41;;
mysql_query&#40;"SET NAMES 'utf8'", $link&#41;;
//connect to DB
mysql_select_db&#40;"***"&#41; or die&#40;mysql_error&#40;&#41;&#41;;
?>
Από την εταιρεία φιλοξενίας μου εξήγησαν ότι έχουν όριο τις 25 συνδέσεις και μας επισήμαναν ότι φταίει ο κώδικάς μας. Μάλιστα, τόνισαν ότι αν δεν διορθώσουμε τον κώδικα θα πρέπει να τον "σταματήσουν".

Η αλήθεια είναι ότι μου κάνει εντύπωση όταν μου είπαν από την εταιρεία ότι δεν παίζει ρόλο η επισκεψιμότητα π.χ. αν έχω 8 επισκέψεις και ο server εξυπηρετεί 25 συνδέσεις ταυτόχρονα... Επειδή δε γνωρίζω όμως πολλά πράγματα ας μου πει κάποιος που γνωρίζει, γιατί δε θέλω να αδικήσω κανένα.

Μία μικρή αναφορά ακόμα θέλω να κάνω: η σελίδα με τη μεγάλη επισκεψιμότητα εξαρχής εμφάνιζε αυτό το πρόβλημα για περίπου 5-6 μήνες. Είναι σελίδα 3ετίας. Για ένα διάστημα 1 έτους (ίσως και λίγο παραπάνω) δεν πήραμε σφάλματα, ενώ φέτος ξαναάρχισε να εμφανίζεται. Στη σελίδα αυτή προσθέσαμε σε όλες τις σελίδες που γίνονται ερωτήματα mysql το mysql_close() και πάλι δεν άλλαξε τότε κάτι.

Στις σελίδες αυτές τρέχει το ίδιο script που έχουμε και σε άλλες. Παρόλα αυτά, εμφανίζεται μόνο σε αυτές το error αυτό.

Θα παρακαλούσα όποιον έχει κάποια ιδέα του τι μπορεί να φταίει, ας μας δείξει λίγο τα φώτα του ώστε να προβούμε σε όποια διόρθωση χρειάζεται.

Άβαταρ μέλους
_tasos
Δημοσιεύσεις: 116
Εγγραφή: 03 Μάιος 2007 15:06
Επικοινωνία:

Too many connections - Πρόβλημα συνεχές

Δημοσίευση από _tasos » 30 Ιούλ 2013 23:34

Είχα το ίδιο πρόβλημα με αριθμό συνδέσεων σε MySQL αλλά σε ASP.NET εφαρμογή.

Δοκίμασε να χρησιμοποιήσεις τη mysql_pconnect() η οποία κάνει pooling τα connections οπότε δεν δημιουργεί νέα, αλλά χρησιμοποεί τα ίδια. Με το pooling όταν καλείς την mysql_close() η TCP σύνδεση δεν κλείνει, αλλά παραμένει ανοιχτή και μαρκάρεται ως διαθέσιμη από τον driver της MySQL μέσα στο connection pool. Έτσι, όταν θα καλέσεις την mysql_pconnect(...) δεν θα δημιουργηθεί μία νέα TCP σύνδεση αλλά θα πάρεις μία ήδη ανοιχτή σύνδεση, η οποία όμως ξέρεις πως δεν τη χρησιμοποιεί κάποιος άλλος.

Στη δική μου περίπτωση το πρόβλημα ήταν κυρίως κακογραμμένος κώδικας αλλά επίσης (μετά από πολύ ψάξιμο) βρήκα πως ο driver που χρησιμοποιούσα (.NET/Connector) είχε bug και δεν έκανε cleanup τις παλιές συνδέσεις και έτσι το pool μόνο γέμιζε και ποτέ δεν άδειαζε. Αναγκάστηκα και έγραψα μία function η οποία έκανε kill τα παλιά processes στη mysql ώστε να αδειάζω το pool.

Αν δεις πως το πρόβλημα παραμένει με το mysql_pconnect() και δεν μπορείς να διαθέσεις χρόνο για να κάνεις refactor τον κώδικα σου, μπορώ να σου δώσω τον κώδικα για να κάνεις kill τα παλιά connections από το pool.

Δες εδώ ένα σχετικό post στο stackoverflow: http://stackoverflow.com/questions/8307 ... ling-mysql

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Too many connections - Πρόβλημα συνεχές

Δημοσίευση από Apostolis_38 » 31 Ιούλ 2013 00:00

Σύμφωνα με την php όταν το script τελειώνει τότε η σύνδεση κλείνει αυτόματα, χωρίς να χρειάζεται καν η mysql_close.
Οπότε το πιο πιθανό είναι οτι το πρόβλημα δεν βρίσκεται στην mysql_connect.
Μήπως καλείται πολλές φορές το dbconnection.php μέσα στο script και ανοίγει "ταυτόχρονα" πολλές συνδέσεις μέχρι να εκτελεστεί;

Άβαταρ μέλους
charavge
Δημοσιεύσεις: 378
Εγγραφή: 14 Σεπ 2006 15:47

Too many connections - Πρόβλημα συνεχές

Δημοσίευση από charavge » 31 Ιούλ 2013 00:33

Apostolis_38 έγραψε:Σύμφωνα με την php όταν το script τελειώνει τότε η σύνδεση κλείνει αυτόματα, χωρίς να χρειάζεται καν η mysql_close.
Οπότε το πιο πιθανό είναι οτι το πρόβλημα δεν βρίσκεται στην mysql_connect.
Μήπως καλείται πολλές φορές το dbconnection.php μέσα στο script και ανοίγει "ταυτόχρονα" πολλές συνδέσεις μέχρι να εκτελεστεί;
Εννοείς να γίνεται include το αρχείο πολλές φορές μέσα. Όχι δε γίνεται κάτι τέτοιο.
Συγκεκριμένα στην αρχή της σελίδας υπάρχει αυτό:

Κώδικας: Επιλογή όλων

//Make a MySQL Connection
include &#40;'dbconnection.php'&#41;;
Τίποτα άλλο. Και εγώ ξέρω ότι δε χρειάζεται να κλείσεις τη σύνδεση της mysql, παρόλα αυτά εμείς το βάλαμε μήπως αλλάξει κάτι. Τίποτα... Δε μπορώ να καταλάβω, δε γνωρίζω.

Απλώς αναρωτιέμαι, πώς μπορείς με 8 χρήστες όλη την ημέρα (σε διαφορετικό χρόνο) να έχεις 25 ταυτόχρονες συνδέσεις σε ένα ιστότοπο με 10 σελίδες όλες κι όλες. Πρέπει να καλώ 25 φορές τη σύνδεση με τον παραπάνω κώδικα σε κάθε αρχείο; Σε άλλες σελίδες με τον ίδιο ακριβώς κώδικα και μεγαλύτερη επισκεψιμότητα από "8" επισκέπτες δεν υπάρχει αυτό το πρόβλημα...
Πάντως ο μόνος τρόπος να κληθεί 25 φορές το include είναι να φορτώσεις 25 φορές τη σελίδα...
Μπορεί να είναι κάποιος άλλος παράγοντας ή φταίει ο παραπάνω κώδικας;

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Too many connections - Πρόβλημα συνεχές

Δημοσίευση από geomagas » 31 Ιούλ 2013 00:44

Ερώτηση: Τους 8 επισκέπτες από πού τους μετράτε; Από τα logs του webserver ή από κανένα google analytics;
Ρωτάω γιατί, το ga δεν μετράει bots, spiders και γενικά custom agents που δεν μπορούν (ή δεν θέλουν) να εκτελέσουν javascript.
Στη χειρότερη, μου "μυρίζει" DOS Attack...

Άβαταρ μέλους
charavge
Δημοσιεύσεις: 378
Εγγραφή: 14 Σεπ 2006 15:47

Too many connections - Πρόβλημα συνεχές

Δημοσίευση από charavge » 31 Ιούλ 2013 00:48

_tasos έγραψε:Είχα το ίδιο πρόβλημα με αριθμό συνδέσεων σε MySQL αλλά σε ASP.NET εφαρμογή.

Δοκίμασε να χρησιμοποιήσεις τη mysql_pconnect() η οποία κάνει pooling τα connections οπότε δεν δημιουργεί νέα, αλλά χρησιμοποεί τα ίδια. Με το pooling όταν καλείς την mysql_close() η TCP σύνδεση δεν κλείνει, αλλά παραμένει ανοιχτή και μαρκάρεται ως διαθέσιμη από τον driver της MySQL μέσα στο connection pool. Έτσι, όταν θα καλέσεις την mysql_pconnect(...) δεν θα δημιουργηθεί μία νέα TCP σύνδεση αλλά θα πάρεις μία ήδη ανοιχτή σύνδεση, η οποία όμως ξέρεις πως δεν τη χρησιμοποιεί κάποιος άλλος.

Στη δική μου περίπτωση το πρόβλημα ήταν κυρίως κακογραμμένος κώδικας αλλά επίσης (μετά από πολύ ψάξιμο) βρήκα πως ο driver που χρησιμοποιούσα (.NET/Connector) είχε bug και δεν έκανε cleanup τις παλιές συνδέσεις και έτσι το pool μόνο γέμιζε και ποτέ δεν άδειαζε. Αναγκάστηκα και έγραψα μία function η οποία έκανε kill τα παλιά processes στη mysql ώστε να αδειάζω το pool.

Αν δεις πως το πρόβλημα παραμένει με το mysql_pconnect() και δεν μπορείς να διαθέσεις χρόνο για να κάνεις refactor τον κώδικα σου, μπορώ να σου δώσω τον κώδικα για να κάνεις kill τα παλιά connections από το pool.

Δες εδώ ένα σχετικό post στο stackoverflow: http://stackoverflow.com/questions/8307 ... ling-mysql
Η εφαρμογή είναι πολύ μικρή... Δε νομίζω ότι χρειάζεται να υπάρχουν ανοικτές συνδέσεις. Στην ουσία σε κάθε σελίδα καλούμε τη σύνδεση και αναλόγως το περιεχόμενο καλούμε τον αντίστοιχο πίνακα. Το ίδιο γίνεται σε όλες "Σύνδεση και Πίνακας". Είναι πραγματικά πάρα πολύ μικροί οι πίνακες για να αργεί π.χ. να φορτώσει.

Άβαταρ μέλους
charavge
Δημοσιεύσεις: 378
Εγγραφή: 14 Σεπ 2006 15:47

Too many connections - Πρόβλημα συνεχές

Δημοσίευση από charavge » 31 Ιούλ 2013 00:48

geomagas έγραψε:Ερώτηση: Τους 8 επισκέπτες από πού τους μετράτε; Από τα logs του webserver ή από κανένα google analytics;
Ρωτάω γιατί, το ga δεν μετράει bots, spiders και γενικά custom agents που δεν μπορούν (ή δεν θέλουν) να εκτελέσουν javascript.
Στη χειρότερη, μου "μυρίζει" DOS Attack...
Analytics. Μισό να δω και τα stats του server.
Να πω ότι είναι shared hosting...

edit: Τα παραθέτω παρακάτω.
Robots/Spiders visitors (Top 25) - Full list - Last visit
10 different robots* Hits Bandwidth Last visit
Unknown robot (identified by 'robot') 1,357+15 8.28 MB 30 Jul 2013 - 06:19
Unknown robot (identified by 'bot*') 783+64 6.71 MB 30 Jul 2013 - 00:13
Googlebot 686+77 3.05 MB 30 Jul 2013 - 05:36
Unknown robot (identified by 'crawl') 291+43 1.88 MB 09 Jul 2013 - 10:38
Unknown robot (identified by '*bot') 40+52 859.19 KB 30 Jul 2013 - 05:41
Alexa (IA Archiver) 25+8 554.19 KB 26 Jul 2013 - 21:25
MSNBot-media 0+10 450 Bytes 27 Jul 2013 - 09:49
Unknown robot (identified by hit on 'robots.txt') 0+5 225 Bytes 27 Jul 2013 - 07:42
Unknown robot (identified by 'spider') 3 15.96 KB 29 Jul 2013 - 23:48
Unknown robot (identified by empty user agent string) 2 18.59 KB 22 Jul 2013 - 12:28
* Robots shown here gave hits or traffic "not viewed" by visitors, so they are not included in other charts. Numbers after + are successful hits on "robots.txt" files.
Οι ημερομηνίες (20, 24, 25 και 26) δε συμπίπτουν με τις ημερομηνίες των bots.
Οι διαφορές ανάμεσα στα Analytics και AwStats είναι π.χ.
Unique: 162 - 244
Visits: 203 - 391
Pages: 931 - 2140

geomagas
Δημοσιεύσεις: 667
Εγγραφή: 06 Απρ 2013 13:36
Τοποθεσία: Ηράκλειο Κρήτης
Επικοινωνία:

Too many connections - Πρόβλημα συνεχές

Δημοσίευση από geomagas » 31 Ιούλ 2013 01:24

Αυτά τα νούμερα δεν "δικαιολογούν" DOS attack... Εκτός αν κάποιος βρήκε τον τρόπο να κοροϊδέψει τον web server ή τα awstats....
Εντελώς πληροφοριακά, σε περίπτωση που τα χρειαστείς:
- Αν θυμάμαι καλά, στο ga μία επίσκεψη λήγει στα 30' idle, ενώ στα awstats στα 60' (πάντως σε περισσότερη ώρα από το ga). Αυτό επηρεάζει τα visits, άρα και τα unique.
- Αν κάνεις ajax requests, το awstats θα τα υπολογίσει σαν pageviews, ενώ το ga όχι (εκτός αν το responseText περιέχει το ga.js και γίνει eval() με κάποιο τρόπο...)
- Αν ο server σου είναι *nix και έχεις shell (πχ ssh) μπορείς να δεις το activity σε realtime με

Κώδικας: Επιλογή όλων

tail -f web_server_log_file
- Αν δεις "ύποπτη" δραστηριότητα, μπορείς προσωρινά να αποκλείσεις την πρόσβαση σε ips / agents είτε μέσω htaccess είτε βάζοντας ένα

Κώδικας: Επιλογή όλων

if&#40;!ανεπιθύμητος&#41; &#123; τρέξε_το_script &#125;
Και τα δύο είναι δύσκολο να υλοποιηθούν με 100% επιτυχία...
Αυτά, λίγο σκόρπια και βιαστικά.
Καλή τύχη...

Άβαταρ μέλους
cpulse
Script Master
Δημοσιεύσεις: 1527
Εγγραφή: 21 Μαρ 2006 19:30
Τοποθεσία: Αθήνα village
Επικοινωνία:

Too many connections - Πρόβλημα συνεχές

Δημοσίευση από cpulse » 31 Ιούλ 2013 02:59

Το όριο στις συνδέσεις της MySQL συνήθως είναι γενικό σε όλο το server. Η εταιρεία που σου κάνει την φιλοξενία έχει τα site σου σε ένα server. Στον ίδιο server υπάρχουν κι άλλα sites. Άρα το φταίξιμο δεν είναι αναγκαστικά δικό σου.

Θεωρητικά για να γίνει αυτό πρέπει από όλα τα sites που υπάρχουν στον server να μπούνε ταυτόχρονα 25+1 χρήστες. Επίσης, θεωρητικά, πρέπει η εκτέλεση των προγραμμάτων να καθυστερεί. Αν το δείς ιδεατά, δηλαδή τα προγράμματα τρέχουν στιγμιαία τότε είναι πολύ δύσκολο να συμπέσουν 25 χρήστες. Αν καθυστερούν τότε η πιθανότητα αυξάνεται.

Στην πράξη υπάρχει μια ακόμα ρύθμιση της MySQL που κάνει την εκτέλεση των προγραμμάτων να καθυστερεί. Υπάρχει συνήθως όριο 100 tables να είναι ταυτόχρονα ανοιχτά. Δηλαδή αν έχεις ένα magento που έχει 300 πίνακες και μπούνε 2-3 χρήστες το όριο των 100 πινάκων θα ισχύει μόνο και μόνο από ένα site, άρα τα scripts των άλλων sites στον ίδιο server θα καθυστερούν μέχρι αηδίας, και έτσι κάπως εξηγείται να μπουκώνει όλος ο server.

Αυτό που σου είπε ο Αποστόλης είναι σωστό, αλλά επίσης λύνεται και εύκολα. Γράφεις include_once('dbconnection.php'); και έτσι ξέρεις οτι σίγουρα θα κλειθεί μόνο μια φορά το αρχείο αυτό.

Με αυτό που είπε ο _tasos διαφωνώ οριζοντίως και καθέτως. Είναι ένα από τα παιδικά λάθη που έκανα κι εγώ όταν ξεκίνησα να προγραμματίζω σε php. Σε shared hosting μακριά από τα permanent connections. Αυτά έχουν νόημα μόνο σε dedicated servers.

Μάλιστα στο http://php.net/mysql_pconnect γράφει:
Warning
Using persistent connections can require a bit of tuning of your Apache and MySQL configurations to ensure that you do not exceed the number of connections allowed by MySQL.

Πρακτικά αυτό που μπορείς να κάνεις είναι να βάλεις έναν timer στα scripts σου να δεις πόσο αργά ή γρήγορα είναι. Κάτι σαν

Κώδικας: Επιλογή όλων

// αρχή
$t0 = microtime&#40;true&#41;;

...

// τέλος
echo '<!-- script loaded in ' . &#40;microtime&#40;true&#41; - $t0&#41; . ' secs -->';
Αν χρησιμοποιείς πολλά tables, προσπάθησε να τα μειώσεις.

Βάλε χέρι στον admin σου. Πέτα και σε εκείνον το μπαλάκι γιατί μπορεί να φταίει κάποιος άλλος, άρα ακόμα κι αν σε διώξουν το πρόβλημα να παραμείνει στον server τους.

Ο admin από την δικιά του πλευρά μπορεί να ρίξει μια ματιά στις πραγματικές συνθήκες μέσω terminal. Να δεί δηλαδή ποιά tables από ποιες databases είναι ανοιχτά όταν το server load είναι αυξημένο. Αυτό γίνεται με ένα από "mysql" για να μπεί στην κονσόλα της MySQL και μετά να γράψει "show open tables;"

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Too many connections - Πρόβλημα συνεχές

Δημοσίευση από Apostolis_38 » 31 Ιούλ 2013 08:53

cpulse έγραψε:Το όριο στις συνδέσεις της MySQL συνήθως είναι γενικό σε όλο το server.
Αυτή θα ήταν η επόμενη απάντησή μου.

Πάντως ακόμα και με ένα include υπάρχει η πιθανότητα να μένει "ανοιχτό" ένα script, ειδικά αν περιέχει μέσα class που περιλαμβάνουν άλλες class και πάει λέγοντας.
Η περιμένοντας ένα user input κ.λ.π.
Με λίγα λόγια, κακκογραμμένος κώδικας όπως ανέφερες κι εσύ.

Για να είσαι σίγουρος κάνε αυτό που λέει ο cpulse και κάνε κι εδώ http://tools.pingdom.com/fpt/ ένα test τις σελίδες σου να δεις αν όντως υπάρχει τέτοιο πρόβλημα.

Άβαταρ μέλους
burnmind
Script Master
Δημοσιεύσεις: 954
Εγγραφή: 26 Σεπ 2009 02:14
Τοποθεσία: UK
Επικοινωνία:

Too many connections - Πρόβλημα συνεχές

Δημοσίευση από burnmind » 31 Ιούλ 2013 09:33

Apostolis_38 έγραψε:Πάντως ακόμα και με ένα include υπάρχει η πιθανότητα να μένει "ανοιχτό" ένα script [...] περιμένοντας ένα user input
Δε νομίζω πως γίνεται αυτό στην php. :P

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Too many connections - Πρόβλημα συνεχές

Δημοσίευση από Apostolis_38 » 31 Ιούλ 2013 09:43

Περκέ βρε;

Άβαταρ μέλους
burnmind
Script Master
Δημοσιεύσεις: 954
Εγγραφή: 26 Σεπ 2009 02:14
Τοποθεσία: UK
Επικοινωνία:

Too many connections - Πρόβλημα συνεχές

Δημοσίευση από burnmind » 31 Ιούλ 2013 10:17

Δεν έχω συναντήσει (ούτε χρειαστεί) ποτέ κάποιον τρόπο για να κάνω ένα php script να περιμένει (καθώς εκτελείται) κάποιο user input όπως πχ στη C++ (cin) και στη Java (System.in).

Apostolis_38
Δημοσιεύσεις: 1969
Εγγραφή: 14 Φεβ 2008 16:20
Τοποθεσία: ΠΕΙΡΑΙΑΣ

Too many connections - Πρόβλημα συνεχές

Δημοσίευση από Apostolis_38 » 31 Ιούλ 2013 10:23

Α, λες μόνο για το user input :D
Παράδειγμα έδωσα.
Εντάξει, τραβηγμένο αλλά που να ξέρω τι έχει το script;

Άβαταρ μέλους
burnmind
Script Master
Δημοσιεύσεις: 954
Εγγραφή: 26 Σεπ 2009 02:14
Τοποθεσία: UK
Επικοινωνία:

Too many connections - Πρόβλημα συνεχές

Δημοσίευση από burnmind » 31 Ιούλ 2013 10:26

Ναι, μόνο αυτό το κομμάτι (user input) έκανα quote. :)

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες