9
votes

ERREUR MYSQL / PHP: [2002] Une seule utilisation de chaque adresse de prise (protocole / adresse réseau / port) est normalement autorisée.

Je n'ai pas pu trouver une solution à ce sujet déjà sur Stackoverflow, la plupart des autres sujets connexes ont à voir avec Apache ne démarrent pas d'abord et à obtenir cette erreur. Mon problème est qu'après l'exécution d'Apache, certains de mes utilisateurs connectés à notre site Web PHP / MySQL recevront cette erreur:

PHP Warning:  mysql_connect() [function.mysql-connect]:
[2002] Only one usage of each socket address (protocol/network address/port)
is normally permitted.


5 commentaires

utilisez-vous des connexions persistantes? Quel type d'utilisation utilisateur avez-vous (simultanément)


Je n'utilise pas MySQL_PConnect, au moment où nous avons environ 200 utilisateurs concurrents et j'ai mon ensemble HTTPD-MPM pour Win_nt pour nous donner environ 350 threads, au moment où je regarde Server-Statut Apache compte environ 237 demandes pour le moment. Et environ 100 oisifs donner ou prendre mais un moment où il fluctue autour de cela.


J'ai remarqué hier que nous avions une énorme pointe sur les demandes d'Apache, passée de 150 à 272 intérieures et Apache s'est écrasée, malheureusement, j'ai eu accès.log à l'époque. Je l'ai réactivé au cas où cela se produise aujourd'hui pour que je puisse attraper ce qu'Ip ils venaient de si cela se produit à nouveau. Nous sommes sur un réseau intranet sécurisé et personne ne peut y accéder de l'extérieur facilement.


Apache-montre l'état du serveur comme actuellement: 239 demandes en cours de traitement, 111 travailleurs inactifs K_KKK__KCKKKKKK ___ ___ KK_KK_KKKKKKKKCKKKKKK__KK_K_KK_K K_KKCKK KKKK K__K_KKKKKKK_KK_K ___ ____ KKK_K_KKCKKKKK_KK_K_K_KKKK_K_KKK_K KK KKK_ KKK_KKK_KKKKKKWK_CK_K_KKK_KK__KKKKKKKKKKKK_C__K ___ KKK_K_K_KK _K_K K ___ ___ KKCWKK__K_KKKKKK_KK__K__KK_CK_KKK_KKKW__KKKCKKKKCKKKK_KK KKKK KK_K_K__KK_K__K__KK__K_KK_K_K_K_K__KK_KK_KKK_KKKK CK_KKK_K KKKC CKKKKKKKK_KK_KC_KKK ____ K_K_K_K ................. ............. ... .... ................................... .....


Je suis curieux si cela pourrait être un problème avec un cadre que j'ai changé avec KeepAliveTimeOut hier, je l'ai baissé à 2, je l'ai remis jusqu'à 15 et redémarré Apache, jusqu'à présent, pas de problèmes, mais pas sûr que cela a quelque chose à faire avec ça.


6 Réponses :


10
votes

L'erreur ne vient pas réellement de mysql, mais de Windows elle-même :

Lorsqu'une connexion est fermée, sur le côté qui ferme la connexion, le 5 tuple {Protocole, IP locale, Port local, IP à distance, Port distant} passe dans un état Time_Wait pendant 240 secondes par défaut.

Dans ce cas, le protocole est fixe - TCP

L'IP locale, IP à distance et le port distant sont également typiquement fixés. La variable est donc le port local.

Que se passe-t-il, c'est que lorsque vous ne liez pas un port dans la plage 1024-5000 est utilisé. Donc grossièrement vous avez 4000 ports. Si vous les utilisez tous dans 4 minutes - ce qui signifie grossièrement vous Faites 16 appels de service Web par seconde pendant 4 minutes, vous épuiserez tous les ports. C'est la cause de cette exception.

En d'autres termes, vous êtes sorti des ports de la gamme dynamique. Cela ne devrait probablement pas se passer. Combien d'utilisateurs simultanés traitez-vous ici?

Le blog lié a des solutions de contournement:

  1. Augmentez la plage de ports dynamiques via la modification du registre.
  2. Réduisez le temps que le système souhaite que les connexions dépensées dans TIME_WAIT via la modification du registre.
  3. Exécutez un peu de code pour effectuer la modification de registre ci-dessus sans regredit.

    Quelle grande variété de solutions de contournement!

    Voir aussi Cette question Sur les forums Visual Studio , qui explique:

    Le port sera verrouillé pendant une autre minute ou deux pour attraper tous les paquets qui auraient pu être envoyés avant la fin de la demande mais ne sont pas encore arrivés. Dans Winsock API, vous pouvez définir l'option SOCK SO_REUSEADDRDR pour résoudre ce problème (cette option peut également être définie dans la classe de socket .NET), mais TCplistener est trop haut niveau et ne vous permet pas de définir cette option.

    Il est très probable que le code sous-jacent se connecte à MySQL ou au code qui gère les connexions dans Apache n'essaye pas d'utiliser SO_REUSeADDRDR . .

    Je vais parier que votre passage du délai de conserve a eu un impact direct ici. Même si la réduction théoriquement libère de la prise, la fenêtre n'est pas d'accord et conserve la prise réservée.


1 commentaires

Le Gamme de ports dynamiques modifiée à partir de Windows Vista : Port de démarrage: 49152 Terrain de fin: 65535. Vous Peut voir les paramètres actuels à l'aide de la commande netsh int ipv4 show dynamicport TCP .



-1
votes

FWIW, j'ai eu le même problème sur une configuration similaire (Windows XP). Le même code a fonctionné sans ce numéro sur Mac (OS X).

J'ai résolu le problème en utilisant une connexion persistante dans la classe MySQLI.

Voir ici pour plus d'informations: http://php.net/mysqli.persistConns

Assurez-vous que vous êtes au courant de tous les gothas / mises en garde associés à l'utilisation d'une connexion persistante.


1 commentaires

Cela ne résout pas le problème, mais le contourne. Les connexions persistantes se comportent tellement différemment qu'ils vous obligent à faire très attention à la manière dont vous codez votre application. Sauf si vous êtes familier avec eux ou que vous ne les transformez que sur votre machine locale, je ne le recommanderais pas. Cette solution pourrait créer beaucoup plus de problèmes que ce serait corrigé.




19
votes

2 commentaires

Merci. À propos, l'article que vous avez référencé semble affirmer qu'il s'agit d'une question de fenêtre 10. Windows 10 a été publié 2015 et la question a été postée en 2012 ... Toutefois, j'ai ce problème en 2018 et votre réponse résolvait pour moi, alors Kudos!


@hemnathmouli j'espère vous aider



2
votes

m'arrive à développer mes projets Laravel. À des fins de développement, ce n'est pas une biguë surtout lorsque vous utilisez Windows System. Mais pour la production, je fonctionne simplement sur Linux et le problème résolu. De plus, modifiez la connexion MySQL de "localhost" en "127.0.0.1" si possible.


1 commentaires

Notez que cette question a été posée il y a plus de six ans, a plusieurs réponses fournissant des informations et votre réponse ne donne aucune nouvelle perspective ou résolution pour le problème. Veuillez vous abstenir de creuser de vieilles questions à moins que vous n'ayez une solution réelle.



4
votes

C'est le Doldurma Réponse mais pour les paresseux, il vous suffit de placer cela dans un fichier .reg et que Cliquez dessus (le redémarrage n'a pas été nécessaire dans mon cas)

Contenu de fichier: P>

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]

"TcpTimedWaitDelay"=dword:0000001e
"MaxUserPort"=dword:0000fffe
"TcpNumConnections"=dword:00fffffe
"TcpMaxDataRetransmissions"=dword:00000005


2 commentaires

Travaillé comme un charme. Merci du fond de mon cœur paresseux.


même ici :-) Merci.