2017-11-13 4 views
0

Ich arbeite an einem Projekt, das meinen Server xyz.com benötigt, um POST/GET-Antworten von abc.com (SMS-Gateway-Provider) an xyz.com/callback.php zu erhalten.Minimieren der MYSQL-Verbindung vom Webhook-Callback

Unten ist, wie ich zur Zeit die Antworten auf callback.php

1. Griff Erhalten Sie die POST-Daten von abc.com (Dieser Beitrag enthält eine eindeutige ID)

2. Verbinden Sie mysql Datenbank- und UPDATE-Benutzer WHERE messageId = Same_ID_from_POST_data

Dies funktioniert und Daten werden aktualisiert. Es verursacht jedoch wegen der Tausenden von MYSQL-Verbindungen CPU-Überlastung. Dies liegt daran, dass callback.php mit mysql eine Verbindung herstellt und die Datenbank aktualisiert, sobald für jede einzelne Nachricht eine Übermittlungsbestätigung vom api-Server vorliegt.

Gibt es eine Best Practice, um die Anzahl der Verbindungen mit MYSQL zu minimieren?
Ich dachte über folgendes nach, ich bezweifle jedoch, ob es einen Sinn ergibt.

1. Empfangen Sie Postdaten vom api-Server wie zuvor.

2. Stattdessen MySQL aktualisieren, schreibe ich einfach in eine TXT-Datei mit dem folgenden Code

$ query. = "Update Benutzer Status gesetzt = '$ post_data_for_status', wo einzigartigen $ post_unique '= ';

Dann benutze ich Cron, um eine PHP-Datei zu starten, die mysqli_multi_query ($ connection, $ query) verwendet, um die Tabelle zu aktualisieren, so dass es eine einzige Verbindung ist. Nach dem Update entferne ich einfach die .txt-Datei

Auch wenn die obige Methode funktionieren wird, weiß ich nicht kn wie es geht. Ich bin mir sicher, dass es eine bessere Alternative gibt.

Irgendwelche Ideen bitte und Entschuldigung für lange Epistel.

+0

Ich denke, was ich im Grunde will, ist die beste Methode, Lieferbelege von externen API Callback ohne Verbindung zu MYSQL pro einzelnen Empfang zu behandeln. –

+1

Die PHP-APIs zur Verwendung von MySQL ('mysqli' und' PDO') haben beide eine Verbindungs-Pooling-Funktion. Daher sollte Ihr php-Webhook-Responder keine neue Datenbankverbindung aufbauen, sondern eine vorhandene wiederherstellen, jedes Mal, wenn ein Webhook darauf trifft. Ihr Problem scheint also die Leistung Ihrer 'UPDATE'-Abfrage zu sein. Können Sie Ihre Frage bearbeiten, um uns die Definition der Benutzertabelle anzuzeigen, einschließlich der Indizes? Wir müssen auch die genaue Abfrage sehen, die Sie zum 'UPDATE' verwenden. –

+0

Beachten Sie, dass die Dateiwarteschlange ein Sicherheitsrisiko darstellt. Wenn ein Absturz auftritt, kann eine bestimmte Anzahl von Belegen verloren gehen. –

Antwort

0

Was Sie suchen, klingt nach Vermeidung von Connection-Churning. Dies ist einer der Vorteile, die wir aus einem "Verbindungspool" ziehen, der häufig in Java/J2EE-Webanwendungen verwendet wird.

PHP bietet keine Verbindungspooling (AFAIK). PDO und mysqli bieten jedoch "persistente" Verbindungen, die den gleichen Vorteil wie der Verbindungspool bieten (Vermeidung von Verbindungsschwankungen).

Für mysqli, "p:" dem Hostnamen in mysqli_connect voranstellen.

http://php.net/manual/en/mysqli.persistconns.php

Für PDO, umfassen PDO::ATTR_PERSISTENT => true in der Verbindung.

http://php.net/manual/en/pdo.connections.php

Beachten Sie, dass mit beharrte Verbindungen, die MySQL-Verbindung hält es Zustand (Session-Variablen, temporäre Tabellen, benutzerdefinierte Variablen, et al ist.) Wenn ein Client beispielsweise eine Anweisung wie SET time_zone = '+00:00'; oder SET @foo = 'bar'; ausgibt, erbt ein nachfolgender Client, der diese MySQL-Verbindung wiederverwendet, die time_zone-Einstellung oder die benutzerdefinierte Variable @foo value; was auch immer sich an dem MySQL-Sitzungszustand ändert, den die vorherigen Clients gemacht haben.