Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Model kolejkowania zadań w cron
Forum PHP.pl > Forum > PHP
amii
Piszę system webowy w którym użytkownicy będą się rejestrować i dodawać pewne zadania takie jak np:
- dodawanie artykułów do blogów typu WordPress (ich lista znajduje się w bazie)
- sprawdzanie zaindeksowania artykułów
- pingowanie artykułów
System będzie również wykonywał zadania niezależne typu:
- sprawdzanie poprawności funkcjonowania blogów zdefiniowanych w bazie
- wyszukiwanie i rejestracja w nowych blogach

Plik cron.php będzie odpalany co 1 minutę. Wygląda on tak:
Minus tego systemu jest taki, że wykonuje dużo operacji na bazie. Jeśli użytkownik zdefiniuje dodawanie artykułu do 3000 blogów do bazy dodawane jest 3000 rekordów, przy liczbie użytkowników > 100 mogą się w bazie tworzyć astronomiczne liczby rekordów (które są na bieżąco usuwane).
Czy to nie będzie zbyt obciążało bazy ?

  1. include_once('functions.php');
  2. define('LICZNIK', 5); //ile zadań pobranych z bazy obslugujemy w ciagu minuty
  3. $tablica = array();
  4.  
  5. $czas = date('H:i:s');
  6. $czas1 = explode(':', $czas);
  7.  
  8. connect_to_db();
  9.  
  10.  
  11. if ($czas1[0] >= 1 && $czas1 <= 22) { //wykonujemy funkcje uzytkownikow
  12.  
  13. $sql = "SELECT TOP "LICZNIK" * FROM task"; //pobieramy pierwsze 5 zadan (tyle zadan wykonujemy co 1 minute)
  14. $result = mysql_query($sql) or die('Blad w zapytaniu: '.$sql.' o tresci: '. mysql_error());
  15.  
  16. while($row = mysql_fetch_array($result)) {
  17.  
  18. switch($row['functions']) {
  19.  
  20. case 'postuj': //jesli dodajemy do bloga
  21.  
  22. $sql = "SELECT
  23. b.id as identyfikator,
  24. b.licznik as licznik,
  25. b.licznik_ping as licznik_ping,
  26. b.last_blog as last_blog,
  27. c.tytul as tytul,
  28. c.artykul as artykul,
  29. c.tagi as tagi,
  30. c.publikuj as publikuj
  31. FROM users
  32. LEFT JOIN settings_art c ON c.user_id=b.id
  33. WHERE c.publikuj='active'"; //pobieramy aktywny artykul
  34.  
  35. $result = mysql_query($sql) or die('Blad w zapytaniu '.$sql.' o tresci'. mysql_error());
  36.  
  37. $result_func = call_user_func('postuj', $row['licznik'], $row['tytul'], $row['artykul'], $row['tagi'], $row['identyfikator']);
  38.  
  39. if ($result_func) { //jesli zadanie skompletowane to je usuwamy
  40. $sql = "DELETE * FROM task WHERE id=$row['id']";
  41. $result = mysql_query($sql) or die('Blad w zapytaniu '.$sql.' o tresci'. mysql_error());
  42. }
  43. break;
  44.  
  45. case 'ping': //inne funkcje które mogą definiować użytkownicy
  46. break;
  47.  
  48. case 'index':
  49. break;
  50.  
  51. default:
  52. break;
  53. }
  54. }
  55.  
  56.  
  57. }
  58.  
  59. else { //dwie godziny na dobe poswiecamy na funkcje systemowe czyli sprawdzanie i weryfikacje blogow, adresow proxy itp.
  60. }


Struktura tabeli sql kazdy użytkownik może tworzyć dowolną ilość artykułów
  1. CREATE TABLE `task` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `user_id` int(11) NOT NULL DEFAULT '0',
  4. `functions` varchar(80) NOT NULL DEFAULT '',
  5. PRIMARY KEY (`id`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
  7.  
  8.  
  9.  
  10. CREATE TABLE `users` (
  11. `id` int(11) NOT NULL AUTO_INCREMENT,
  12. `login` varchar(80) NOT NULL DEFAULT '',
  13. `pass` varchar(80) NOT NULL DEFAULT '',
  14. `email` varchar(120) NOT NULL DEFAULT '',
  15. `data` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  16. `licznik` int(11) NOT NULL DEFAULT '0',
  17. `licznik_ping` int(11) NOT NULL DEFAULT '0',
  18. `last_blog` varchar(80) NOT NULL DEFAULT ''
  19. PRIMARY KEY (`id`)
  20. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=0 ;
  21.  
  22.  
  23.  
  24. CREATE TABLE `settings_art` (
  25. `id` int(11) NOT NULL AUTO_INCREMENT,
  26. `user_id` int(11) NOT NULL DEFAULT '0',
  27. `tytul` varchar(30) NOT NULL DEFAULT '',
  28. `artykul` text NOT NULL,
  29. `tagi` varchar(100) NOT NULL DEFAULT '',
  30. `publikuj` varchar(10) NOT NULL DEFAULT '',
  31. PRIMARY KEY (`id`)
  32. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;
pmir13
Jak dokładnie będzie to obciążać system to musisz sprawdzić, ciężko jest zgadywać. Zapewne nie od razu będzie 100 użytkowników i 3000 blogów, na bieżąco monitoruj czas wykonywania skryptu, w razie potrzeby reaguj. Najwięcej czasu pewnie będą zabierać inserty, upewnij się że wykonujesz je grupowo, tzn w jednym zapytaniu dużo różnych rekordów. Możesz też zainteresować się zapytaniem typu LOAD DATA INFILE, wcześniej przygotowując listę rekordów do dodania w pliku tekstowym (SELECT INTO OUTFILE). Sama struktura bazy wygląda dobrze, w skrypcie masz drobne błędy - w linii 13 cudzysłów kończy string, w linii 31 brakuje b, w definicji tabel w linii 18 brakuje przecinka.
amii
Po dodaniu artykułu do bloga chce od razu wstawić link z artykułem do bazy. Odbywa się to w ten przedstawiony poniżej sposób (mam wrażenie, ze jest zupełnie nieoptymalny w dodatku nie zawsze działa poprawnie).
Czy da się to jakoś lepiej rozwiązać ? Czyli jak dodać do bazy link do właśnie umieszczonego artykułu na blogu WordPress ?

  1. $www = urlencode($tytul); //pobieramy tytuł właśnie dodanego artykułu z bazy do wyszukania w wyszukiwarce WP
  2. $pobierz = $row['url'].'?s='.$www; //konstruujemy odpowiedniego linka z zapytaniem do wyszukiwarki WP szukamy tytułu naszego artykułu
  3. $pobierz = file_get_contents($pobierz); //pobieramy zwróconą stronę jako ciąg znaków
  4. preg_match($pattern, $pobierz, $matches); //filtrujemy wyniki niestety filtrowanie nie zawsze działa bo WP zwraca wyniki w różnych formatach
  5.  
  6. if (isset($matches[0]) && !empty($matches[0])) { //sprawdzamy czy znalazł
  7. preg_match($pat, $matches[0], $wynik);
  8. $ilosc = $wynik[1]
  9. $zapytanie = "INSERT INTO dodane(id, uid, url, tick) VALUES(NULL, $identyfikator, '$ilosc', 0)"; //wrzucamy do bazy
  10. $zapytaj = mysql_query($zapytanie) or die('Bład w zapytaniu : ' .$zapytanie. 'o tresci: ' . mysql_error());
  11. }
  12. }
sajrus
może zamiast preg_match użyj parse_url chociaż nie wiem czy to pomoże
pmir13
Nie za dużo wiemy o tym co chcesz osiągnąć. Kto te artykuły dodaje? Jacyś ludzie jako użytkownicy ręcznie bez użycia twojego skryptu? Użytkownicy przy pomocy twojego skryptu? Sam skrypt biorąc użytkownika z jakiegoś pliku lub innego źródła?
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.