Esecuzione di più azioni su ogni riga di tabella da molti database

0

Sto lavorando a un progetto che gestisce i libri paga dei dipendenti utilizzando php (nessun framework). Questa applicazione è composta da client (con i propri database). Ogni il database è composto dai dipendenti del cliente e dai suoi libri paga. Le caratteristiche rilevanti sono:

  • Un amministratore può elaborare una busta paga due volte al mese per tutti i dipendenti di un determinato cliente. Quando si fa clic su un pulsante "processo", verrà creato un file pdf per ciascun dipendente e memorizzato in una directory.
  • E l'amministratore può selezionare i dipendenti in una tabella di dipendenti per un determinato cliente, quindi inviare a ogni dipendente selezionato un'email contenente il loro file pdf quando si fa clic su un pulsante. Il file pdf è diverso per ogni dipendente.
  • E l'amministratore può selezionare i clienti in una tabella di clienti, quindi per ogni cliente, inviare a tutti i dipendenti un'email contenente il loro file pdf quando si fa clic su un pulsante. Il file pdf è diverso per ogni dipendente.

La mia soluzione iniziale per la creazione di pdf e l'invio di e-mail è quella di scorrere l'elenco dei dipendenti recuperati da ciascun database client ed eseguire un'azione quando si fa clic su un pulsante. Tuttavia, quando seleziono 40 dipendenti per creare file PDF per loro usando fpdf, l'applicazione impiega 4 secondi per rifinire. Questo è inaccettabile perché ogni cliente può contenere al massimo 5000 dipendenti. Lo stesso vale per l'invio di e-mail con phpmailer, ci sono voluti 25 secondi per inviare tre e-mail.

Quindi, ho iniziato a cercare una soluzione multithread in cui ogni azione potesse essere eseguita allo stesso tempo. Tuttavia, pthreads v3 funziona solo in CLI, stiamo usando php 7. Non so sull'utilizzo di più processi, ma ho letto che potrebbe essere complecato.

Esiste una soluzione praticabile e veloce per ottenere ciò che voglio in PHP? Devo usare una lingua diversa?

    
posta morbidCode 19.05.2017 - 17:38
fonte

1 risposta

1

È necessario che avvenga in tempo reale o starai bene con una soluzione "batch"?

Una soluzione batch comporterebbe alcuni passaggi aggiuntivi. Dovrai monitorare i tuoi lotti, magari nelle nuove tabelle batch e batch_job . L'amministratore può creare un nuovo batch per generare PDF e ogni esecuzione del generatore di PDF sarà un singolo batch. Dovresti avere qualche altro processo che viene eseguito in background e controlla le tabelle batch per vedere cosa deve essere eseguito. Ci dovrebbe anche essere qualcosa da qualche parte nell'interfaccia in modo che un utente possa vedere quali batch sono stati creati, in esecuzione, completati o falliti.

Fondamentalmente, il flusso di lavoro andrebbe in questo modo:

  1. L'utente amministratore seleziona 5000 lavoratori per generare PDF per.
  2. L'amministratore crea un batch con 5000 lavori "Genera PDF" (ogni lavoro dovrebbe avere una descrizione che descrive il lavoratore di cui ha bisogno per generare un PDF).
  3. Il processo in background sul server rileva che c'è un nuovo batch e inizia ad eseguire i lavori.
  4. L'utente amministratore può monitorare i progressi nell'interfaccia utente web.
  5. Job executor aggiorna le tabelle batch con lo stato in cui sono completate / fallite.

I vantaggi di questa soluzione sono che il processo batch può essere eseguito in background. La generazione di PDF può essere eseguita in parallelo, in serie o in qualsiasi altro modo tu scelga.

Svantaggi: l'implementazione di questo sarà probabilmente più di un'ora o due di codifica;) Se si prevede di avere altri processi aziendali che operano su un numero molto ampio di cose, potrebbe valere la pena considerare seriamente questo.

Se il tuo hardware può effettivamente supportare la generazione di 5000 PDF in meno di un minuto, e vuoi davvero che questo sia in tempo reale, potresti implementare una versione più corta della soluzione di cui sopra (beh, non è in tempo reale ma più del mio altro suggerimento):

  1. L'amministratore seleziona 5000 cose per creare PDF.
  2. L'app Web passa tutte le informazioni su quelle 5000 in un singolo processo che viene eseguito in modo asincrono in background (non è sicuro come farlo in PHP, avrebbe bisogno di ulteriori ricerche).
  3. Quella procedura sfuma, lasciando all'utente libero di fare altre cose.
risposta data 19.05.2017 - 19:15
fonte

Leggi altre domande sui tag