Ist PHP für sehr große Projekte geeignet?Kann es transaktionssicher sein?

StackOverflow https://stackoverflow.com/questions/934236

  •  06-09-2019
  •  | 
  •  

Frage

Diese Frage mag seltsam erscheinen.

Aber jedes Mal, wenn ich in der Vergangenheit PHP-Projekte erstellt habe, habe ich folgende schlechte Erfahrung gemacht:

Die Ausführung von Skripten wird nach 10 Sekunden abgebrochen.Dies führt zu sehr schlimmen Datenbankinkonsistenzen (schlechtes Beispiel für eine Löschschleife:Der Benutzer ist im Begriff, ein Fotoalbum zu löschen.Das Albumobjekt wird aus der Datenbank gelöscht, und auf halbem Weg zum Löschen der Fotos wird das Skript genau dort abgebrochen, wo es ist, und 10.000 Fotos bleiben ohne Referenz übrig.

Es ist nicht transaktionssicher.Ich habe nie einen Weg gefunden, etwas zu tun sicher, um sicherzustellen, dass es so ist Erledigt.Wenn das Skript getötet wird, wird es getötet.Mitten in einer Schleife.Es wird einfach getötet.Das ist bei Tomcat mit Java nie passiert.Java läuft und läuft und läuft, wenn es lange dauert.

Viele Newsletter-Skripte versuchen, dieses Problem zu umgehen, indem sie den Job in viele Pakete aufteilen, d. h.100 auf einmal senden, dann die Seite neu laden (oh Mann, wirklich dumm), die nächste machen und so weiter.Meistens bleibt etwas hängen oder das Skript dauert länger als 10 Sekunden und Ihre Plattform ist lahmgelegt.

Aber dann habe ich gehört, dass sehr große Projekte PHP wie studivz (der deutsche Facebook-Klon, eigentlich die größte deutsche Website) verwenden.Es gibt also einen kleinen Hoffnungsschimmer, dass dieses schlechte Verhalten nur von unprofessionellen Hosting-Unternehmen herrührt, die PHP-Skripte einfach abschaffen, weil ihre Server so schlecht sind.Was ist daran wahr?Kann es so konfiguriert werden, dass Skripte nie abgebrochen werden, weil sie etwas länger dauern?

Keine korrekte Lösung

Andere Tipps

  

Ist PHP geeignet für sehr große Projekte?

Jedes Mal, wenn ich eine Frage wie das zu sehen, die ich ein bisschen unruhig. Was ist sehr groß bedeuten? Was ist für Sie groß sein kann, oder umgekehrt zu mir klein sein. Und das geht davon aus, auch, dass wir die gleiche Metrik verwenden. Messen Sie Zeit, um das Projekt, vollständigen Lebenszyklus des Projektes zu bauen, Geldes, die beteiligt sind, die Zahl der Menschen mit ihm, der Anzahl der Entwickler zu bauen / pflegen, usw. usw.

Das heißt, die Probleme Sie beschreiben, klingt wie Sie nicht wissen, Ihre Technologie gut genug. Das wäre ein Problem für Sie, unabhängig davon, welche Technologie Sie ausgewählt. Zum Beispiel Datenbank-Transaktionen verwenden, um die Unteilbarkeit sicherzustellen. Und verwenden Sie asynchrone Offline-Jobs zu lange laufende Aufgaben (wie den Versand einer Mailing-Liste) zu verarbeiten.

Eine Menge, wenn das schlechte Verhalten in guter Frameworks wie Zend Framework abgedeckt ist. Alles, was mehr die 10 Sekunden dauert wirklich vermasselt, aber man kann immer die Ausführungszeit erhöhen mit http: // de3. php.net/set_time_limit

Viele große Websites sind in PHP writen: Facebook, Wikipedia, StudiVZ, Digg.com etc .. eine Menge Dinge, die Sie reden werden, sind gerade Konfiguration Dinge sollten Sie vielleicht in die aussehen

?

Performance ist kein Merkmal Sie nur in werfen kann, nachdem die meisten der Website erfolgt. Sie haben die Website für schwere Belastung zu entwerfen.

Wenn eine Datenbank Aufgabe normalerweise 10K Reihen beteiligt, sollen Sie nicht nur die Ausführungszeit Probleme, aber andere Wartungs Fragen vorbereitet werden.

  • Im schlimmsten Fall: eine Konsistenz Werkzeug macht diese Fehler zu überprüfen und zu beheben.
  • Besser:. Statt phisically der Bilder löschen, markieren sie einfach und lassen Dienste Hintergrund des teueren Manövers kümmern
  • Best. Sie können einen Job Queue-Service nutzen und diesen Job in die Warteschlange hinzufügen

Wenn Sie müssen Transaktionen in PHP zu tun, können Sie einfach tun:

mysql_query("BEGIN");

/// do your queries here

mysql_query("COMMIT");

Der Befehl commit wird nur die Transaktion abzuschließen.

Wenn Fehler auftreten, können Sie einfach Rollback mit:

mysql_query("ROLLBACK");

Edit: Hinweis: Dies funktioniert nur, wenn Sie eine Datenbank verwenden, die Transaktionen wie InnoDB

unterstützt

Sie können festlegen, wie viel Zeit für das Ausführen eines Skripts erlaubt ist, entweder in der php.ini Einstellung oder über ini_set / set_time_limit

Statt studivz (der deutschen Facebook-Klon), können Sie bei der tatsächlichen Facebook aussehen könnte, die völlig PHP ist. Oder Digg. Oder viele Yahoo-Sites. Oder viele, viele andere.

ignore_user_abort ist wahrscheinlich das, was Sie suchen, aber man könnte auch eine weitere Ebene in Bezug auf den geplanten Instandhaltungsaufträge hinzuzufügen. Sie laufen im Wesentlichen auf einem bestimmten Intervall und tun verschiedene Dinge, dass Ihre Daten / Dateisystem zu machen, sind in einem Zustand, den Sie wollen ... alt / unlinked Löschen von Dateien nur eine von vielen Dinge, die Sie tun können.

Für diese großen Schleifen wie Fotoalben Löschen oder 1000 von E-Mails Ihre Suche nach ignore_user_abort und set_time_limit senden.
So etwas wie folgt aus:

ignore_user_abort(true); //users leaves webpage will not kill script
set_time_limit(0); //script can take as long as it wants
for(i=0;i<10000;i++)
 costly_very_important_operation();

Seien Sie aber vorsichtig, dass dies möglicherweise das Skript ausführen könnte für immer:

ignore_user_abort(true); //users leaves webpage will not kill script
set_time_limit(0); //script can take as long as it wants
while(true)
  do_something();

Das Skript wird niemals sterben, wenn Sie Ihren Server neu starten.

Daher ist es am besten zu setzen nie die TIME_LIMIT die 0.

Technisch gesehen ist keine Programmiersprache transaktionssicher, es ist die Datenbank, die transaktionssicher sein muss.Wenn also das laufende Skript/der Code aus irgendeinem Grund abstürzt oder die Verbindung unterbrochen wird, wird die Transaktion zurückgesetzt.

Das Einfügen von Abfragen in eine Schleife ist eine sehr schlechte Idee, es sei denn, sie ist speziell dafür konzipiert, in Stapeln ausgeführt zu werden und einen viel größeren Satz in kleinere Teile aufzuteilen.Das Anpassen von PHP-Timern und -Limits stellt im Allgemeinen eine Notlösung dar. Wenn Sie zum Starten eines Skripts das Web verwenden, sind Sie immer noch auf den Client-Browser angewiesen.

Wenn ich einen langen Prozess habe, der von einem Browser gestartet werden muss, „trenne“ ich die Verbindung des Prozesses zum Browser und zum Webserver, sodass die Kontrolle beim Ausführen des Skripts an den Benutzer zurückgegeben wird.PHP-Skripte, die über die Befehlszeile ausgeführt werden, können auf Wunsch stundenlang ausgeführt werden.Anschließend können Sie AJAX verwenden oder die Seite neu laden, um den Fortschritt des lang laufenden Skripts zu überprüfen.

Es gibt Sicherheitsbedenken bei diesem Code, aber um einen Prozess von PHP zu „trennen“, das unter etwas wie Apache läuft:

exec("nohup /usr/bin/php -f /path/to/script.php > /dev/null 2>&1 &");

Das hat aber wirklich nichts damit zu tun, dass PHP für große Projekte geeignet ist oder transaktionssicher ist.PHP kann für große Projekte verwendet werden, aber da es standardmäßig keinen Code gibt, der zwischen den Zugriffen „resident“ bleibt, kann es langsam werden, wenn es nicht richtig entworfen wird.Da es außerdem keine Namespace-Unterstützung gibt, sollten Sie im Voraus planen, wenn Sie über ein großes Entwicklungsteam verfügen.

Es ist kein Problem, dass ein Java-basiertes System ein paar Minuten braucht, um alle Standardobjekte zu starten, zu initialisieren und zu laden.Dies ist jedoch mit PHP nicht akzeptabel.Für größere Systeme erfordert PHP mehr Planung.Die Frage ist, wann wird die durch die Verwendung von PHP eingesparte Zeit durch die zusätzliche Planungszeit verschwendet, die für ein großes System erforderlich ist?

Der Grund, warum Sie höchstwahrscheinlich schlecht Datenbank Konsistenzen in der Vergangenheit ist, weil Sie die MyISAM-Engine für MySQL verwendet wurden (die nicht unterstützt Transaktionen). Verwendung InnoDB Stattdessen unterstützt Transaktionen und führt auf Zeilenebene Verriegelung. Oder verwenden postgreSQL.

Viele, viele Software-Seiten in PHP geschrieben. Allerdings werden Sie hören über nicht Millionen von Webseiten in PHP geschrieben, die nicht mehr existieren, weil sie aufgegeben wurden. Diese Seiten alle Unternehmen Geld verbrannt haben mit PHP Chaos für den Umgang, oder vielleicht bankrott sie, weil ihre weichen so beschissen war, dass Kunden nicht wollten ... PHP scheint beim Start gut, aber nicht sehr gut skalieren. Ja, es gibt viele große Websites in PHP geschrieben, aber sie sind eher Ausnahmen, als eine Norm.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top