Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [CRON][PHP] Długi czas wykonywania skryptu
Forum PHP.pl > Forum > PHP
mis
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
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.
mis
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
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ą...
mis
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
Pobranie 2mln linków i tak będzie szybsze niż pobranie i przefiltrowanie 300k pól typu TEXT gdzie będzie sporo tekstu
mis
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 smile.gif
phpion
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ń.
mis
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
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.
mis
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
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
mis
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
taaa.. zwłaszcza że wykonanie takiego zapytania sprawdzającego zajmie powiedzmy w pesymistycznym układdzie 0.01s to zaoszczędzisz 6s, Brawo smile.gif
mis
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 smile.gif

WESOŁYCH ŚWIĄT smile.gif
nospor
Jedyna osoba, ktora tutaj ewentualnie sie spina, jestes Ty bo u nikogo innego spinania ja osobiscie nie widze. Powodzenia wiec w nakladaniu tej masci smile.gif
phpion
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
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? tongue.gif
mis
@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 smile.gif
Jeszcze raz wesołych świąt. Temat można zamknąć, dzięki za pomoc.
nospor
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 biggrin.gif

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