Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Prośba o radę - koncepcję
Forum PHP.pl > Forum > PHP
mosky
Witam,

Prowadzę serwis turystyczny i mam kilkudziesięciu klientów którzy dają mi na mojej stronie ogłoszenia, reklamy itp.
Odbywa się to zasadzie abonamentu - czyli np. włączam komuś reklamę na rok lub pół roku lub kwartał a on raz na okres opłaca mi abonament za tę usługę.

Piszę teraz na własne potrzeby system, który pilnowałby mi terminów, wystawiał fakturki proforma, powiadamiał mailem kogo trzeba o fakcie fakturowania itd.

Całości koniec końców pilnuje jeden plik uruchamiany cronem raz dziennie.
W pliku tym wykonuję kilka zadań i mam wrażenie, że nie jest on optymalnie przemyślany od strony wydajności ponieważ z logu, który sobie tworzę podczas jego wykonania widzę, iż nie wszystkie zadania wykonywane są płynnie.

Krytycznym momentem jest jak sądzę moment gdzie:
- pobieram z bazy wszystkie abonamenty
- rekordy jeden po drugim sprawdzam z pomocą:

  1. <?php
  2.  
  3.  
  4. $pytanie="SELECT * FROM ".$prefix."_abonamenty";
  5. $sql=mysql_query($pytanie);
  6.  
  7. while ($abo=mysql_fetch_object($sql))
  8. {
  9.  
  10.  
  11. }
  12.  
  13.  
  14. ?>


- jeśli w danym rekordzie występuje konieczność fakturowania - sprawdzam to po datach: dzisiejszej i przechowywanej w tabeli abonamentów (końca abonamentu)

wykonuję kolejne kroki:
1) wygenerowanie faktury i dodanie jej do bazy
2) wygenerowanie faktury do pfd (robię to za pomocą klasy którą znalazłem w sieci a działa ona na zasadzie takiej iż na podstawie htmla generuje pdfa - czyli najpierw funkcją generuję sobie kompletny html faktury z pełnymi danymi a następnie zapodaję to do tej klasy czego wynikiem jest plik pdf)
3) plik pdf zapisuję na dysku w katalogu tymczasowym
4) uaktualniam dany abonament o informację iż został on zafakturowany
5) za pomocą pear mail (pear-mime) tworzę maila którego wysyłam do klienta i do mnie (bcc) - do maila dodaję załącznik pdf (wygenerowany wcześniej)
6) kasuję z dysku pdf który już nie jest potrzebny

Punkty 1-6 wykonuję w pętli while() i z tego co widzę w logu skrypt przycina się podczas fakturowania więcej niż 2 abonamentów. Przycina się na wysyłaniu maila. Generowanie pdf zajmuje około 2 sekund

I teraz pytanie - jak od strony koncepcyjnej podejść to tego tematu tak by mój ISP nie wywalił mnie z serwera jak zapodam do zafakturowania jednocześnie powiedzmy 30 abonamentów (obciążenie serwera) a dwa by skrypt wykonywał się płynnie.
ActivePlayer
jesli chodzi o wysyłanie maili... robisz tabele 'do_wyslania'... i cronem powiedzmy co 10 min sprawdzasz czy cos w niej jest, jesli jest wysyłasz 1 wiadomosc, i usuwasz rekord

jesli chodzi o
'4) uaktualniam dany abonament o informację iż został on zafakturowany'

sprawdz czy na pewno masz indeksy na odpowiednich polach.

wiecej tak na szybko nie przychodzi mi do glowy
mosky
Cytat(ActivePlayer @ 2006-05-04 09:04:09)
robisz tabele 'do_wyslania'... i cronem powiedzmy co 10 min sprawdzasz czy cos w niej jest, jesli jest wysyłasz 1 wiadomosc, i usuwasz rekord

(...)


sprawdz czy na pewno masz indeksy na odpowiednich polach.

(...)

Witaj,

Dziękuję za odpowiedź.

Co do wysyłania:
Jeśli dobrze zrozumiałem w jednym cyklu crona wysłać 1 mail?
Czyli teoretycznie ustawiając 10 minut dla crona mógłbym wysłać 6 maili na godzinę. Oczywiście można zwiększyć częstotliwość w przypadku większej ilości wysyłek.

Ale czy tak częste uruchamianie crona nie obciąża w jakiś sposób serwera?

Co do indeksów: w zasadzie błędu tu być nie moze ponieważ w tabeli abonamentu mam pole faktura które ma wartość 1 (termin do fakturowania ale faktura już wystawiona) lub 0 (termin do fakturowania lub nie ale nie fakturowany)

Zatem w zależności od potrzeby zmieniam sobie zawartość tego pola pytaniem

  1. <?php
  2. pytanie_a="UPDATE ".$prefix."_abonamenty SET faktura = '1' WHERE id = '".$abo->id."'";
  3. $sql_a=mysql_query($pytanie_a);
  4. ?>
rafalxfiles
Ja tam na twoim miejscu szukał bym rekordów spełniających kryteria.. czyli WHERE data >= coś tam
Tak to baza wyszuka tylko te rekordy które Ci są potrzebne a nie takie ręczne sprawdzanie.. nie potrzebnie przeszukujesz baze.. i nie wykorzystujesz praktycznie możliwości które daje Ci MySQL wogóle jeżeli szukasz po dacie to dodaj do niej indeks w bazie. i powinno być szybciej.. dużo szybciej.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.