Just nu i M3-nätverket
Gå till innehåll

Asynkron hantering i PHP


erikdal
 Share

Go to solution Solved by erikdal,

Rekommendera Poster

Hej

Har ett speciellt problem med en egenkodad e-postfunktion i ett administrativ system för en förening med flera hundra medlemmar.
För att skicka meddelanden till medlemmarna måste utskicket programmässigt delas upp i omgångar på grund av e-postleverantörens krav på ett viss maxantal mottagare per halvtimmesperiod.

 

Nuvarande lösning är att funktionen delar upp sändningen i lämpliga omgångar och avsändaren skickar iväg den första omgången men funktionen ligger kvar aktiv och väntar på att tiden ska gå innan nästa omgång kan sändas. Detta låser ju upp programmet under tiden tills allt är skickat.

 

En bättre lösning vore ju att kunna bygga upp en lista som skulle kunna skickas till en asynkron bakgrundsfunktion som hanterar omgångarna och tidsaspekten.
Efter att bakgrundsfunktionen startats ska förgrundsfunktionen släppas fri och bakgrundsfunktionen ska kunna kunna rapportera status när den avslutats.

 

Systemet är kodat i PHP och jag har inte hittat någon metod att åstadkomma önskvärt beteende.

Tacksam för idéer ...

Länk till kommentar
Dela på andra webbplatser

Jag hade nog löst det med schemaläggning i operativsystemet än att försöka hålla reda på sånt själv.

 

Ponera att du har ett schemalagt jobb som körs varje halvtimme, det tar upp en adress-lista och en e-postmall, skickar ett e-brev baserat på mallen till det n-första i listan. Sen kan det ta bort dessa n-stycken adresser. När listan är tom, så finns det inget att skicka och jobbet avslutas utan att göra något.

 

På så vis, när du ska skicka e-brev, så behöver du bara uppdatera mall och lista, så sköts det av sig självt. Dock tappar du feedback på status när allt skickats iväg men det kan man lösa genom att låta jobbet logga och loggen kan du läsa när du och hur du vill.

  • Gilla 1
Länk till kommentar
Dela på andra webbplatser

Jag har gjort motsvarande lösning i andra scriptspråk. Enklast var att ta reda på begränsning för antal skickade mejl per timme och sedan lägga in en vänta-timer i loopen som skickar mejl. Om jag får skicka max 500 mejl per timme (=3600 sekunder/ 500 mejl) så väntar jag 8 sekunder mellan varje mejl, typ:

 

for ($i=0; $i <= $antal_mejl; $i++) {
   Kod för att skicka mejl här
    }
    sleep(8); // fördröjer nästa vända i loopen med 8 sekunder
}

 

Nu är det 20 år sen jag kodade PHP, men nåt i den stilen borde funka. Om det finns en begränsning för antal skickade mejl per dygn så går ju även det att hantera i loopen genom att man väntar 86400 sekunder när $i når dygnsbegränsningen och sedan väntar 8 sekunder igen efter det.

Redigerad av MuMu
Länk till kommentar
Dela på andra webbplatser

  • Solution

Hej

Tack för tipsen.

 

Nja, sleep()-metoden  fungerar inte då PHP-skripten har en max exekveringstid.

 

Efter att ha kontaktat webbhotellet fick jag även därifrån tips om att använda ett schemalagt jobb, så det är ett spår jag ska jobba vidare med.

Datorapa.jpg

Länk till kommentar
Dela på andra webbplatser

 Share



×
×
  • Skapa nytt...