Ist PHP geeignet für sehr große Projekte? Kann es transaktionssicher sein?
https://stackoverflow.com/questions/934236
- |
Frage
Diese Frage kann seltsam erscheinen.
Aber jedes Mal, wenn ich PHP-Projekte in der Vergangenheit gemacht, stieß ich auf diese Art von schlechter Erfahrung:
Scripts cancel läuft nach 10 Sekunden. Dies führt zu einem sehr schlechter Datenbank-Inkonsistenzen (schlechtes Beispiel für eine Löschschleife: Der Nutzer ist über ein Fotoalbum löschen Album Objekt aus der Datenbank gelöscht wird, und dann auf halbem Weg nach unten die Fotos zu löschen das Skript direkt getötet wird, wo es ist, und. 10.000 Fotos sind ohne Bezug links).
Es ist nicht transaktionssicher. Ich habe nie einen Weg, etwas zu tun, sicher , um sicherzustellen, es ist fertig . Wenn Skript getötet wird, wird es getötet. Genau in der Mitte einer Schleife. Es wird nur getötet. Das geschah nie auf tomcat mit Java. Java läuft und läuft und läuft, wenn es lange dauert.
Eine Menge an Newsletter-Skripte versuchen, durch Aufteilung der Arbeit nach oben in eine Menge von Paketen um dieses Problem zu kommen, also 100 zu einem Zeitpunkt zu senden, dann relading die Seite (oh Mann, wirklich dumm), die nächsten zu tun, und bald. Meistens etwas hängt oder das Skript wird länger dauern als 10 Sekunden, und Ihre Plattform ist gelähmt werden.
Aber dann höre ich, dass sehr große Projekte PHP wie studivz verwenden (das Deutsch Facebook-Klon, eigentlich die größte Deutsch Website). So gibt es ein kleines Licht der Hoffnung, dass dieses schlechte Verhalten kommt gerade von unprofessionell Hosting-Unternehmen, die nur PHP-Skripte töten, weil ihre Server so schlecht sind. Was ist die Wahrheit über diese? Kann es so konfiguriert werden, dass Skripte nie, weil sie ein wenig länger dauern getötet?
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
?Suchen Sie set_time_limit () und ignore_user_abort () ?
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ütztSie 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 keine Programmiersprache ist Transaktion sicher, es ist die Datenbank, die Transaktion sicher sein muss. Also, wenn das Skript / Code Lauf stirbt oder trennt, gleich aus welchem Grund, wird die Transaktion rückgängig gemacht.
Abfragen in einer Schleife zu platzieren, ist eine sehr schlechte Idee, wenn es speziell in Chargen sein läuft zu entwerfen und eine viel größere Menge in kleinere Stücke brechen. Einstellen PHP-Timer und Grenzen ist in der Regel einer Lösung Lückenbüßer, sind Sie auf dem Client-Browser abhängig noch, wenn die Bahn mit einem Skript zu beginnen.
Wenn ich einen langen Prozess, der von einem Browser, I „disconnect“ dem Prozess vom Browser und Web-Server gekickt werden muss, um die Steuerung an den Benutzer zurückgegeben wird, während das Skript ausgeführt wird. PHP-Skripte von der Kommandozeile ausgeführt werden kann stundenlang laufen, wenn Sie wollen. Anschließend können Sie AJAX verwenden, oder die Seite neu zu laden, über den Fortschritt des langen laufenden Skript zu überprüfen.
Es gibt Sicherheitsproblem mit diesem Code, sondern „trennen“, ein Prozess von PHP läuft unter so etwas wie Apache:
exec("nohup /usr/bin/php -f /path/to/script.php > /dev/null 2>&1 &");
Aber das wirklich nichts zu tun haben mit PHP für große Projekte geeignet ist oder zu seiner Transaktion sicher. PHP für große Projekte verwendet werden, aber da standardmäßig kein Code, der „resident“ zwischen Treffer bleibt, kann es langsam, wenn nicht richtig ausgelegt. Da auch keine Namespace-Unterstützung da ist, wollen Sie im Voraus planen, wenn Sie ein großes Entwicklungsteam haben.
Es ist in Ordnung für ein Java-basiertes System einige Minuten in Anspruch nehmen bis zur Inbetriebnahme, initialisieren und laden Sie alle Standardobjekte. Aber dies ist nicht akzeptabel, mit PHP. PHP wird für größere Systeme mehr Planung nehmen. Die Frage ist, wann ist die Zeitersparnis PHP bei der Verwendung durch die zusätzliche Planungszeit für ein großes System erforderlich verschwendet werden?
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.