Hej,
trochę szukałem na ten temat, ale nie bardzo znalazłem zadowalającą mnie odpowiedź.
Mianowicie:
skrypt będzie uruchamiany co 2/3 dni, a może i codziennie, ale to nie ważne.
Skrypt, będzie pobierał z bazy 'długi TEXT'. Ilość rekordów będzie z dnia na dzień rosła.
Następnie treść zostanie przefiltrowana, zostaną wyciągnięte wszystkie linki.
Ostatnim krokiem, każdy link zostanie sprawdzony curlem czy działa itp.
Przy małej ilości wpisów w bazie, nie ma problemu, jednak przy większej już problem się pojawi.
set_limit_time, tutaj nic nie pomoże, nawet gdy będzie resetowany w pętli, przy dłuższym czasie wykonywania pliku i tak serwer się wyłoży.
Chodzi głównie o porcjowanie zapytań, na jakiej zasadzie to zrobić?
header(), czy inne tego typu funkcje, w przypadku CRON'a nie wchodzą w grę.
Ma ktoś jakieś rozwiązanie do tego?
Pyton_000
18.12.2013, 20:12:19
Przy zapisywaniu wyciągaj adresy i pakuj je do osobnej tabeli z zapisanie ID wpisu w którym występuje i przelatuj przez tabelę z linkami oznaczając sobie czy działa czy nie.
to i tak nic nie da.
Druga sprawa, dziś linki mogą działać, jutro nie muszą, więc tym bardziej niestety Twój pomysł tutaj nie pomoże.
Pyton_000
18.12.2013, 20:27:55
Przecież jak w jednej tabeli masz np:
Kod
id | teeeeext
a w drugiej
Kod
id | id_wpisu | link | czy_dziala(bool)
To w czym problem jest sprawdzanie drugiej tabeli pod kontem linków z czy_działa ustawionym na true?
Jak nie działa to jego id zapisujesz sobie tymczasowo do tablicy i robisz mass update linków które nie dziają...
tym, że małą różnice mi zrobi, pobranie i przeliftrowanie czy odrazu pobranie linków, jezeli będzi ich np 20000000 rekordów.
Więc i tak będę musiał porcjować dane i tak.
Pyton_000
18.12.2013, 20:48:30
Pobranie 2mln linków i tak będzie szybsze niż pobranie i przefiltrowanie 300k pól typu TEXT gdzie będzie sporo tekstu
masz rację, jednak pomijam fakt, że w moim wypadku to nie ma sensu rozbijać na dodatkową tabele.
i tak bym musiał dzielić cały skrypt na porcję i własnie dlatego założyłem temat
phpion
19.12.2013, 08:26:03
Jeśli chodzi o porcjowanie to dodałbym do tabeli pole ostatnie_sprawdzenie_dzien. W cronie co (powiedzmy) 10 minut odpalasz skrypt, który pobiera np. 50 rekordów, których ostatnie_sprawdzenie_dzien != date('j'). Sprawdzasz je po swojemu i aktualizujesz ostatnie_sprawdzenie_dzien na date('j'). Wiesz wówczas, że dany rekord został już dziś sprawdzony i każdy rekord będzie sprawdzony 1 raz na dzień.
Właśnie zastanawiałem się nad takim rozwiązaniem.
Jednak jest jakaś mołżiwość, że w przypadku np. przeskanowania wszystkich danych z bazy, żeby dalsze polecenia cron się nie wypełniały?
Albo od 2 strony, żeby 'aktualny' cron, gdy rozpozna, że jeszcze są dane do sprawdzenia, uruchomi następny?
phpion
19.12.2013, 13:29:37
Nie, nie ma takiej możliwości *. Ewentualnie możesz zadanie uruchamiać raz dziennie w nieskonczonej pętli. W niej zawrzesz pobieranie paczek danych, sprawdzanie, aktualizację. W momencie gdy skrypt pobierze 0 rekordów będzie to oznaczało, że zakończył pracę. Wówczas możesz dać exit. Pamiętaj tylko o wyzerowaniu czasu maksymalnego wykonania skryptu by mógł pracować w nieskonczoność (czyli do exit'a).
* W sumie możesz to obejść. W momencie zakończenia pracy zapisuj do pliku aktualny dzień (date('j')). Przy uruchomieniu zadania sprawdzaj najpierw czy wartość z tego pliku jest != date('j'). Jeśli tak - niech pracuje. Jeśli nie - dajesz exit. Zadanie fizycznie i tak będzie uruchamiało skrypt, ale przynajmniej nie będzie niepotrzebnie odpytywało bazy danych.
z tego co czytałem, i sprawdzałem, nawet jak się wyzeruje w pętli time_limit, to skrypt po pewnym czasie strasznie obciąży maszynę, co spowoduje albo wywalenie skryptu albo maszyny/strony.
Co do obsługi pliku bazy, w sumie 1 zapytanie na 10 min, to praktycznie nie jest taki problem.
Teraz mi przyszło do głowy, że można pobawić się w DirectAdmin API.
Teoretycznie podczas wykonywania skryptu usuwać aktualnego crona i w razie potrzeby dodawać następnego( z zastrzeżeniem by 1 cron o danej godiznie ciągle był).
nie wiem jak by to w praktyce wyglądało.
nospor
19.12.2013, 13:58:43
Cytat
Teraz mi przyszło do głowy, że można pobawić się w DirectAdmin API.
Teoretycznie podczas wykonywania skryptu usuwać aktualnego crona i w razie potrzeby dodawać następnego( z zastrzeżeniem by 1 cron o danej godiznie ciągle był).
nie wiem jak by to w praktyce wyglądało.
NIe przesadzasz z lekka?
Cytat
Co do obsługi pliku bazy, w sumie 1 zapytanie na 10 min, to praktycznie nie jest taki problem.
Tak, to nie jest problem i lepiej na tym zdaniu sie zatrzymaj a oszczedzisz sobie zbednej durnej roboty
nie wiem czy przesadzam czy nie.
Jeżeli by to zaoszczędziło np. 600 zapytań dziennie, przy małym nakładzie pracy, to jest już jakaś liczba.
Pyton_000
19.12.2013, 17:05:20
taaa.. zwłaszcza że wykonanie takiego zapytania sprawdzającego zajmie powiedzmy w pesymistycznym układdzie 0.01s to zaoszczędzisz 6s, Brawo
a co ma czas do tego?
Kwestia niepotrzebnych zapytań do bazy, a nie czas który kompletnie nie ma znaczenia.
Ps. Widzę, każdy łatwo się tu niepotrzebnie spina, więc na święta polecam jakąś maść na ból pośladków

WESOŁYCH ŚWIĄT
nospor
20.12.2013, 13:06:06
Jedyna osoba, ktora tutaj ewentualnie sie spina, jestes Ty bo u nikogo innego spinania ja osobiscie nie widze. Powodzenia wiec w nakladaniu tej masci
phpion
20.12.2013, 13:13:26
Ja nie szukałbym problemu w czasie wykonania zapytania, a nawiązywaniu zbędnych połączeń z bazą danych. Może 1 tu czy tam nie robi większej różnicy, ale skoro można stosunkowo niewielkim nakładem pracy to wyeliminować to czemu nie?
nospor
20.12.2013, 13:37:17
phpion ja sie bardziej odnosilem do pomyslu autora, ktory chcial sie bawic api directadmin.... toz to tylko wiecej szkody moze zrobic jak pozytku a odpalanie crona z jednym połączeniem do bazy raz na 10 minut to cale nic.
No i jeszcze te "spinanie" sie.... Od kiedy napisanie, ze dany pomysl nie dokonca ma sens jest spinaniem sie? @mis, to jak tam, masz zapasy tej masci?
@phpion wlaśnie o to mi chodziło, że nie czas a ilość zapytań ma znaczeie. Przy paru komendach do DA Api, można to prosto rozwiązać.
@up, czy więczej szkody czy pożytku, to kwestia sporna. 'Niewielki nakład pracy', o którym wspomniał phpion, to właśnie użycie DA Api więc? No tak, mój pomysł jest be ;P
Co do Twoich wypocin wyżej, wlaśnie to co napisałeś to jest spinanie się o nic. Forum jest do rozmów, a takie jak to, czyli tematyczne po pomocy, ale widzę jak wszędzie 'władza' uderza do głowy i każdy głupio mądry stara się być, szukając bezsensownych spin i/lub pokazując innym 'Co to nie ja'.
Wyluzujcie trochę. Pewnie dostanę ostrzeżenie, ale to nic
Jeszcze raz wesołych świąt. Temat można zamknąć, dzięki za pomoc.
nospor
20.12.2013, 21:15:21
Cytat
Forum jest do rozmów
A inni co mają inne zdanie niz Ty to zaprzeproszeniem co robią? Szczekają?
Napisalem i Pyton ze gra nie jest warta swieczki a juz szczegolnie przy twoim pomysle. To byla rozmowa ale nie zgadzala sie z Twoja wiec wyjezdzasz z jakims durnym spinaniem sie.... ogarnij sie chlopie i zbieraj te masc bo widze przyda ci sie duzo

Cytat
Temat można zamknąc
Alleluja
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.