Temat: [php] pokazywanie wyników skryptu na żywo
Piotr Likus:
Taki proces lepiej napisać "transakcyjnie". Tzn skolejkować sobie listę adresów do odwiedzenia w bazie i sukcesywnie je odznaczać - dzięki temu bez problemu można restartować komputer.
Skrypt o którym mowa jest spiderem chodzącym po serwisie, który czyta wygenerowane przez tę stronę pliki html i wyciąga z nich dane. Jak już wcześniej wspomniałem, niestety nie ma możliwości dostępu w inny, bardziej elegancki sposób do DB. Dlatego też wszelkie próby transakcji na samej bazie odpadają.
Pomysł Piotra dotyczący transakcji jest sam w sobie świetny, jeśli będzie się go dało zaimplementować w php. Wtedy skrypt będzie wiedział, że na wypadek utraty połączenia z netem nie przechodzić wszystkich przejść w pętli od nowa. Pytanie tylko czy jest to możliwe.
Przykładowe rozwiązanie:
Powiedzmy, że skrypt ma 2 pętle: producent i model. Podczas przejścia przez pętlę 'model' skrypt odczytuje dane i zapisuje insertem do DB. W chwili przejścia skryptu przez 'producenta' X, 'model' Y i wczytaniu pierwszych cen 10 pozycji modelu Y, połączenie z netem zostaje utracone. Najbezpieczniej by było wznowić skrypt od 'prod' X, 'modelu' Y ale nie od 11 pozycji tylko od samego początku, bo np. dane już się zmieniły i skrypt startując od 10 pozycji może pominąć albo co gorsza nadpisać pewne pozycje. W tym wypadku z naszej DB należałoby usunąć te poprzednie 10 rekordów i wystartować od początku 'modelu' Y.
Tylko, że samo kasowanie rekordów samo w sobie budzi już pewne obawy. Druga rzecz to tunning całego skryptu. Na razie przed zapisem przerwszego rekordu aż do końca skryptu tabela z pobranymi danymi jest blokowana (LOCK). Znalazłem w sieci głosy, że po pierwsze lepiej będzie zapisywać dane najpierw do csv a dopiero później importować csv do DB, a po drugie najlepiej zastosować w chwili obecnej silnik InnoDB, ponieważ jest on już szybszy od MyISAM. Co o tym tuningu sądzicie??