Heim >Backend-Entwicklung >PHP-Tutorial >So generieren Sie asynchron Excel-Dateien in PHP und speichern sie auf dem Server
1. Ich glaube, jeder kennt die Funktion des Exportierens von Bestellungen. Die Datenmenge ist groß und das Geschäft komplex. Jetzt muss das Produkt die Daten eines Monats exportieren, etwa 20.000 Stück, und die Abfrageschnittstelle ruft die von Java bereitgestellte API auf.
2. Das Abfragen von 2000 Daten über diese Schnittstelle dauert 30 Sekunden, und die Zeitüberschreitung des Servers beträgt 30 Sekunden, sodass eine Zeitüberschreitung unvermeidlich ist. Alle 1000 Teile werden 1 W Daten gesendet. Eine einzelne Curl-Anfrage dauert 60–78 Sekunden. Eine curl_multi-Anfrage dauert 45,78–52 Sekunden.
3. Die Geschäftslogik muss zu diesem Zeitpunkt noch anhand der UID in den zurückgegebenen Ergebnissen abgefragt werden Warten Sie auf die restlichen Ergebnisse und verarbeiten Sie die Logik.
4. Die verarbeiteten Datenergebnisse werden nach dem Durchlaufen in Excel-Zellen zusammengestellt, was viel Speicher beansprucht.
1. Der Client initiiert die Aktion „Export“, der Dienst sendet einen Abfragevorgang, generiert eine Excel-Datei und speichert sie auf dem Server.
2. Nachdem der Kunde eine Aktion gesendet hat, ist es am besten, sofort zurückzukehren, ohne auf die Rückmeldung des Ergebnisses an den Kunden zu warten, und den Kunden direkt aufzufordern, eine halbe Stunde später erneut herunterzuladen.
3. Laden Sie die generierte Excel-Datei direkt vom Server herunter.
Wie kann der Client eine Anfrage initiieren und sofort zurücksenden und gleichzeitig vom Server verlangen, dass er Geschäftslogik, Prozessabfragen, Feldmontage und andere Prozesse ausführt? Bitte geben Sie mir einen Rat, danke!
Zusätzlicher Punkt:
Ich wollte ursprünglich Cron-Job verwenden, aber es gibt immer mehr Dinge und der Server ist nicht sehr großzügig. Es werden viele Dienste darauf bereitgestellt, und die Effizienz ist höher nicht sehr hoch.
Da es sich bei vielen Dingen, die in der App angezeigt werden, um geplante Aufgaben wie Produktverfeinerung usw. handelt, sind es zu viele, daher möchte ich Cronjob im Moment nicht verwenden. Darüber hinaus werden Spring-Aufgaben im Java-Code zur Ausführung vieler Aufgaben verwendet.
1. Ich glaube, jeder kennt die Funktion des Exportierens von Bestellungen. Die Datenmenge ist groß und das Geschäft komplex. Jetzt muss das Produkt die Daten eines Monats exportieren, etwa 20.000 Stück, und die Abfrageschnittstelle ruft die von Java bereitgestellte API auf.
2. Das Abfragen von 2000 Daten über diese Schnittstelle dauert 30 Sekunden, und die Zeitüberschreitung des Servers beträgt 30 Sekunden, sodass eine Zeitüberschreitung unvermeidlich ist. Alle 1000 Teile werden 1 W Daten gesendet. Eine einzelne Curl-Anfrage dauert 60–78 Sekunden. Eine curl_multi-Anfrage dauert 45,78–52 Sekunden.
3. Die Geschäftslogik muss zu diesem Zeitpunkt noch anhand der UID in den zurückgegebenen Ergebnissen abgefragt werden Warten Sie auf die restlichen Ergebnisse und verarbeiten Sie die Logik.
4. Die verarbeiteten Datenergebnisse werden nach dem Durchlaufen in Excel-Zellen zusammengestellt, was viel Speicher beansprucht.
1. Der Client initiiert die Aktion „Export“, der Dienst sendet einen Abfragevorgang, generiert eine Excel-Datei und speichert sie auf dem Server.
2. Nachdem der Kunde eine Aktion gesendet hat, ist es am besten, sofort zurückzukehren, ohne auf die Rückmeldung des Ergebnisses an den Kunden zu warten, und den Kunden direkt aufzufordern, eine halbe Stunde später erneut herunterzuladen.
3. Laden Sie die generierte Excel-Datei direkt vom Server herunter.
Wie kann der Client eine Anfrage initiieren und sofort zurücksenden und gleichzeitig vom Server verlangen, dass er Geschäftslogik, Prozessabfragen, Feldmontage und andere Prozesse ausführt? Bitte geben Sie mir einen Rat, danke!
Zusätzlicher Punkt:
Ich wollte ursprünglich Cron-Job verwenden, aber es gibt immer mehr Dinge und der Server ist nicht sehr großzügig. Es werden viele Dienste darauf bereitgestellt, und die Effizienz ist höher nicht sehr hoch.
Da es sich bei vielen Dingen, die in der App angezeigt werden, um geplante Aufgaben wie Produktverfeinerung usw. handelt, sind es zu viele, daher möchte ich Cronjob im Moment nicht verwenden. Darüber hinaus werden Spring-Aufgaben im Java-Code zur Ausführung vieler Aufgaben verwendet.
Zwei Arten: Die eine besteht darin, ein Skript zum Ausführen zu verwenden. Eine andere Möglichkeit besteht darin, direkt nach dem Empfang der Front-End-Anfrage zurückzukehren oder eine Zeitüberschreitung zuzulassen. PHP kann die Ausführung des Anzeigeeinstellungsskripts set_time_limit(0); fortsetzen. Für php-fpm kann fastcgi_finish_request() verwendet werden, um die Ausführung nach der Rückkehr fortzusetzen . Apache kann „ignore_user_abort( )“ setzen
Die letztere Methode, php-fpm, blockiert jedoch den Empfang von Anfragen durch PHP, was dazu führen kann, dass normale Benutzer nicht auf die Website zugreifen können, da sie zufällig zugewiesen wird und wenn Nginx mit diesem langfristigen Prozess verbunden ist , es wird blockiert.Es wird empfohlen, zum Ausführen ein PHP-Skript zu verwenden. Sie können die Warteschlange verwenden oder die Shell verwenden, um das PHP-Skript zum Ausführen aufzurufen
Kann über die Warteschlange exportiert werden
, um Ihren Anforderungen gerecht zu werden. Das Bild unten ist mein Export
Oder Sie können etwas Einfacheres wählen und die geplante Aufgabenausführung unter Linux verwenden
Senden Sie eine Exportanfrage an der Rezeption. Sie fügen die Exportanfrage zur Datenbank-Aufgabentabelle hinzu und geben dem Client die Information zurück, dass der Export ausgeführt wird. Anschließend fragt die geplante Linux-Aufgabe die Aufgabentabelle ab, um die neue Aufgabe zu finden exportiert es. Ändern Sie es, nachdem der Export abgeschlossen ist. Dies sollte nicht besonders kompliziert sein
Student, hast du schon von Cronjob gehört?
Sie können verteilte Aufgabenwarteschlangen
wie Gearman, Rabbitmq für die asynchrone Verarbeitung verwenden
Warum nicht die NodeJS-Implementierung verwenden, die von Natur aus asynchron ist?