Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP] skrypt wykonujący się o danej godzinie, ale nie CRON
ktoosiu
post 15.07.2012, 17:35:01
Post #1





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 8.02.2012

Ostrzeżenie: (0%)
-----


Siemka
potrzebuję skryptu, który po wejściu na stronę, ustawieniu kilku parametrów i godziny wykona się o tej godzinie co ustawiłem.
potrzebuję prostego skryptu który się wykona jeśli użytkownik jest na stronie, nie potrzeba mi crona ani nic.
od dwóch dni próbuję coś wykombinować, powstało kilka wersji kodu, ale nie działa:/

kod:
  1. if(!isset($_GET['exist']))
  2. {
  3. echo "<form method=\"get\" action=\"/\">";
  4. <parametry>
  5. echo "<input type=\"text\" name=\"t\" />"; // czas w formacie GG:MM
  6. echo "<input type=\"hidden\" name=\"exist\" value=\"true\"/>";
  7. echo "<input type=\"submit\" name=\"wyślij\" value=\"Wyślij\"/>";
  8. }
  9. else
  10. {
  11. $t = $_GET['t'];
  12.  
  13. for($cz = date("G").":".date("i") ; $cz > $t ; $cz = date("G").":".date("i"))
  14. {
  15. if($cz == $t)
  16. {
  17. echo date("G:i:s")."<br>";
  18. echo $t."<br>";
  19.  
  20. <skrypt który chce wykonać>
  21.  
  22. }
  23. }
  24.  
  25. }


Jak to zrobić? bo nie mam już żadnego pomysłu:/


--------------------
ktoosiu
Go to the top of the page
+Quote Post
!*!
post 15.07.2012, 17:44:51
Post #2





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


A co jest złego w cronie?

1. wchodzisz na stronę
2. zapisujesz dane z formularza np. do pliku
3. za każdym nowym wejściem, odczytujesz zawartość pliku, i porównujesz z aktualną datą.

file_get_contents file_put_contents

Ten post edytował !*! 15.07.2012, 17:46:16


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
csharp
post 15.07.2012, 18:00:20
Post #3





Grupa: Zarejestrowani
Postów: 127
Pomógł: 3
Dołączył: 22.04.2012
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


masz w tej pętli warunek -> wykonuj dopóki $cz > $t, pętla Ci się nie wykona jeśli $cz będzie się równało $t dodaj tam może >=

poza tym date() można sklecić w jedność $today = date("H:i"); po co to rozbijać?


--------------------
Prywatny blog -> cupial.com.pl
Go to the top of the page
+Quote Post
peter13135
post 15.07.2012, 18:53:46
Post #4





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


Takie porównywanie stringów nie zadziała.


--------------------
:)
Go to the top of the page
+Quote Post
sobol6803
post 15.07.2012, 19:07:20
Post #5





Grupa: Zarejestrowani
Postów: 115
Pomógł: 13
Dołączył: 19.06.2011
Skąd: Ruda Śląska

Ostrzeżenie: (0%)
-----


Ja bym zapisywał linka, który ma się wykonać do pliku txt/ini z datą i dodał do indexu, że jeśli nie jest pusty, to ma pobrać url z tego pliku i uruchomić go curlem, jeśli czas (w indexie) >= czas (w pliku) [najlepiej microtime]. Po tej akcji usuwa link i datę z pliku, sprawdza dalej plik, czy nie jest pusty, jak nie jest, to czyta datę,porównuje, itd.


--------------------
  1. mysql_query("DROP DATABASE $_GET['dbname']");
Go to the top of the page
+Quote Post
ktoosiu
post 15.07.2012, 19:07:32
Post #6





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 8.02.2012

Ostrzeżenie: (0%)
-----


@!*! nie widzę nic złego w cronie, ale skrypt potrzebuję wykonywać o różnych porach zależnie od sytuacji, i chcę żeby się wykonał np. dokładnie o 15:33, i nie potrzebuję do tego strona - wchodzę np. o 15:32, ustawiam parametry i godzinę i chwilę czekam
@peter13135 Dlaczego nie zadziała? i co w tym przypadku użyć? strcmp()?
@sobol6803 w ustawieniach serwera mam maks. czas wykonywania 120s więc wydaje mi się że najlepszym rozwiązaniem jest po prostu <120s przed czasem uruchomić skrypt, i dopóki nie nastanie dana godzina będzie mieliło pętlę for, i wykona działanie

Ten post edytował ktoosiu 15.07.2012, 19:17:50


--------------------
ktoosiu
Go to the top of the page
+Quote Post
peter13135
post 15.07.2012, 19:20:00
Post #7





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


z tego co się orientuje to jeśli porównujez dwa stringi, np. :
$string > $string2 to interpreter php rzutuje oba stringi do typu liczbowego i potem stara się je porównać.
I tak string typu "9dfdws24f22" zostanie zrzutowany na liczbę 9.

Jaki wynik porównania będzie gdy porównasz takie stringi :
"9:29" < "9:31" ?

a no będzie false, bo liczbe 9 sparsuje elegancko, ale potem parser "pomyśli sobie" ten dwukropek to nie jest liczba, dalej nie "parsuję" bo nie wiem co to jest. A jak wiadomo 9 < 9 == false.

Być może jest trochę błędów w moim tłumaczeniu, bo po prostu porównywanie stringów jest po prostu bez sensu (jak jeden string może być od drugiego większy ? ) i specjalnie się nad tym nie zagłębiałem.
Porównywać możesz daty w formacie uniksowego znacznika czasu, albo np. za pomocą obiektu datetime.

Poza tym, ta pętla może nie wypalić, bo skrypt ma standardowo 30 sekund czasu wykonywania - potem się przerywa. Oczywiście możesz to zmienić w php.ini


--------------------
:)
Go to the top of the page
+Quote Post
ktoosiu
post 15.07.2012, 20:38:09
Post #8





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 8.02.2012

Ostrzeżenie: (0%)
-----


Wykombinowałem coś takiego
  1. $t = $_GET['t']; //czas w formacie GGMM
  2. $t = (int) $t;
  3. $cz = date("G:i");
  4. $cz = str_replace(":", "", $cz);
  5. $cz = (int) $cz;
  6.  
  7. for($i = 1 ; $t == $cz ; $cz = date("G:i"))
  8. {
  9. $cz = str_replace(":", "", $cz);
  10. $cz = (int) $cz;
  11. <kod>
  12. }

ale tak jakby omijało całe for. co robię źle?


--------------------
ktoosiu
Go to the top of the page
+Quote Post
mls
post 15.07.2012, 21:04:08
Post #9





Grupa: Zarejestrowani
Postów: 677
Pomógł: 89
Dołączył: 31.08.2003
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(ktoosiu @ 15.07.2012, 21:38:09 ) *
Wykombinowałem coś takiego (...) ale tak jakby omijało całe for. co robię źle?


No bo omija, przecież to oczywiste i widać od razu dlaczego.
Upierasz się przy najgłupszym możliwym rozwiązaniu, by NIE używać do tego crona. Skoro ktoś ma czekać minutę czy dwie na stronie, po co w ogóle coś takiego robić? Nie może wejść na stronę po tych dwóch minutach i "od ręki" wykonać owego "zaplanowanego" zadania?


--------------------
Go to the top of the page
+Quote Post
GoOx
post 16.07.2012, 06:47:36
Post #10





Grupa: Zarejestrowani
Postów: 329
Pomógł: 6
Dołączył: 23.11.2011
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Nie da się wykonać czegoś o danej godzienie chyba że jakiś użytkownik na niej będzie co do minuty, ja kiedyś coś takiego miałem to kod wykonywał się u pierwszej osoby która najbliżej tej godziny weszła na stronę.

Wystarczy porównać 9.30 == 9.30 {
to co ma wykonać

}


A jeśłi nikogo nie będdzie o 9.30 to kod wykona się u osoby pierwszej która wejdzie na stronę po 9.30.

Ten post edytował GoOx 16.07.2012, 06:48:14
Go to the top of the page
+Quote Post
ktoosiu
post 16.07.2012, 11:44:53
Post #11





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 8.02.2012

Ostrzeżenie: (0%)
-----


Cytat(mls @ 15.07.2012, 22:04:08 ) *
No bo omija, przecież to oczywiste i widać od razu dlaczego.
Upierasz się przy najgłupszym możliwym rozwiązaniu, by NIE używać do tego crona. Skoro ktoś ma czekać minutę czy dwie na stronie, po co w ogóle coś takiego robić? Nie może wejść na stronę po tych dwóch minutach i "od ręki" wykonać owego "zaplanowanego" zadania?


Nie mogę wejść na stronę i wykonać od ręki, bo potrzebuję to wykonać z dokładnością co do sekundy (np. dokładnie o 18:00:00), a crona nie chcę używać, bo zadanie które potrzebuję wykonać nie jest cykliczne - raz może być we wtorek o 18, innym razem w czwartek o 15, i musiałbym za każdym razem tworzyć nowe zadanie cron

@GoOx wiem o tym i napisałem wcześniej, widocznie zbyt niejasno więc napiszę jeszcze raz: zadanie ma się wykonywać jak JA wejdę na stronę minutę przed zadanym czasem i ustawie parametry, cały czas będąc na stronie, i nie mogę sobie poradzić z kodem

Ten post edytował ktoosiu 16.07.2012, 13:33:54


--------------------
ktoosiu
Go to the top of the page
+Quote Post
GoOx
post 16.07.2012, 12:57:43
Post #12





Grupa: Zarejestrowani
Postów: 329
Pomógł: 6
Dołączył: 23.11.2011
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Odpowiedź jest prosta użyj takiego kodu:

  1. $t = $_GET['t']; // ale get to nie jest moim zdaniem dobre rozwiązanie.
  2.  
  3. $czas_teraz = time("H:i"); // po co robiłeś to explode? jeśli $t jest w formacie godziny:minuty to tutaj mamy tak samo.
  4.  
  5. if($czas_teraz == $t) {
  6. // to co ma być wykonane
  7. }


Dobrze Ciebie zrozumiałem?

Ten post edytował GoOx 16.07.2012, 12:58:48
Go to the top of the page
+Quote Post
mls
post 16.07.2012, 13:23:45
Post #13





Grupa: Zarejestrowani
Postów: 677
Pomógł: 89
Dołączył: 31.08.2003
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Cytat(ktoosiu @ 16.07.2012, 12:44:53 ) *
(...) a crona nie chcę używać, bo zadanie które potrzebuję wykonać nie jest cykliczne - raz może być we wtorek o 18, innym razem w czwartek o 15, i musiałbym za każdym razem tworzyć nowe zadanie cron


Nic bardziej mylnego. Wystarczy jedno zadanie cron - odpalanie skryptu co minutę. Skryptu, który zawiera w sobie pętlę trwającą 60 sekund...


--------------------
Go to the top of the page
+Quote Post
d3ut3r
post 16.07.2012, 14:07:25
Post #14





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

Ostrzeżenie: (0%)
-----


Jeżeli nie przeszkadza Ci wejście na stronę np minutę przed czasem , i nie chcesz użyć CRON możesz zrobić kod w JavaScript który będzie odliczał do godziny xx:yy:00 i gdy odliczanie się skończy wyśle żądanie ajaxem.


--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post
ktoosiu
post 16.07.2012, 14:11:23
Post #15





Grupa: Zarejestrowani
Postów: 12
Pomógł: 0
Dołączył: 8.02.2012

Ostrzeżenie: (0%)
-----


@d3ut3r słabo znam js+ajax
@GoOx tak właśnie robię, tyle że do tego jeszcze trzeba pętli, a ja nie mogę sobie poradzić ze sformułowaniem kodu tej pętli


--------------------
ktoosiu
Go to the top of the page
+Quote Post
!*!
post 16.07.2012, 14:14:47
Post #16





Grupa: Zarejestrowani
Postów: 4 298
Pomógł: 447
Dołączył: 16.11.2006

Ostrzeżenie: (0%)
-----


A ja zapytam bo mnie ciekawość zżera... Po co robisz to w ten sposób i konkretnie co? To jest jakiś system wiadomości, gra, zmiana tapety?


--------------------
Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta).
Go to the top of the page
+Quote Post
Shido
post 16.07.2012, 14:16:11
Post #17





Grupa: Zarejestrowani
Postów: 121
Pomógł: 22
Dołączył: 22.06.2012

Ostrzeżenie: (0%)
-----


Bez ustalenia OKRESU czasu ( np. od 12:00 do 12:05 ) ni da rady. W innym wypadku ktoś musiałby wejść co do sekundy ( bądź nawet setnej sekundy )

Ten post edytował Shido 16.07.2012, 14:25:45


--------------------
Sorka za błędy ort. jak coś dajcie znać na PW to popoprawiam.
Go to the top of the page
+Quote Post
d3ut3r
post 16.07.2012, 14:19:48
Post #18





Grupa: Zarejestrowani
Postów: 709
Pomógł: 176
Dołączył: 24.10.2010

Ostrzeżenie: (0%)
-----


tak na szybko:
  1.  
  2. $start=strtotime('15:18:00');
  3.  
  4. while(time()<$start){
  5. //zZzZz
  6. }
  7.  
  8. echo "teraz";


Tylko, że takie długie ładownie może spowodować wyświetlenie monitu w przeglądarce "Strona nie odpowiada...."

@UP

zgadza się, autor sam powiedział, że może wchodzić minutę przed czasem, takie rozwiązanie wówczas zadziała. Jeżeli już miałbym unikać cron to zrobiłbym to ajaxem skoro i tak na stronę muszę wejść, takie sztuczne opóźnianie skryptu, może wkurzyć .... co do tego można zrobić dodatkową granicę:

  1. $start=strtotime('15:18:00');
  2. $dontStartAfter=strtotime('15:18:01');
  3.  
  4. if (time()<$dontStartAfter){
  5. while(time()<$start){
  6. //zZzZz
  7. }
  8. echo "teraz";
  9. }
  10.  


i powinno działać

Ten post edytował d3ut3r 16.07.2012, 14:30:18


--------------------
http://d3ut3r.wordpress.com/ | mysql_* jest przestarzałe UŻYWAJ PDO!
Go to the top of the page
+Quote Post
Aqu
post 16.07.2012, 14:25:00
Post #19





Grupa: Zarejestrowani
Postów: 279
Pomógł: 58
Dołączył: 14.07.2012

Ostrzeżenie: (0%)
-----


No to może tak: zrób tabelę w mysql z dwoma polami: data|wykonano. Data - data w unixtime, wykonano - 0. Przy każdym wejściu na stronę skrypt niech pobiera zadanie które ma wykonano=0 i data<=time(), po wykonaniu skrypt zmienia wykonano na 1. To ma taką wadę, że jak zdanie ma się wykonać np. o 15:00:00 to musisz wejść na stronę o 14:59 i odświeżać cały czas stronę. ;p Albo dać w html refresh żeby się sama odświeżała co sekundę.
Go to the top of the page
+Quote Post
sobol6803
post 16.07.2012, 15:22:48
Post #20





Grupa: Zarejestrowani
Postów: 115
Pomógł: 13
Dołączył: 19.06.2011
Skąd: Ruda Śląska

Ostrzeżenie: (0%)
-----


Cytat(Aqu @ 16.07.2012, 15:25:00 ) *
No to może tak: zrób tabelę w mysql z dwoma polami: data|wykonano. Data - data w unixtime, wykonano - 0. Przy każdym wejściu na stronę skrypt niech pobiera zadanie które ma wykonano=0 i data<=time(), po wykonaniu skrypt zmienia wykonano na 1. To ma taką wadę, że jak zdanie ma się wykonać np. o 15:00:00 to musisz wejść na stronę o 14:59 i odświeżać cały czas stronę. ;p Albo dać w html refresh żeby się sama odświeżała co sekundę.


Inaczej.

Zapisujesz do tabeli "cron":

Kod
id |      date        |                   link                  |  done  |
1  |  16-07-12 15:23  | http://strona.pl/strona.php?wykonaj=tak |    1   |
2  |  16-07-12 18:41  | http://strona.pl/strona.php?do=kill     |    0   |


I w indexie czytasz, czy w bazie są jakieś wpisy:

  1. SELECT * FROM cron WHERE done=0


Jeśli mysql_num_rows >0 (czy tam $PDO->rowCount() > 0) to pobierasz link i datę z bazy, rozbijasz sobie na zmienne "$day", "$month", "$year", "$hour", "$minute"). Później generujesz czas jaki jest w chwili wykonywania skryptu i tak samo go rozdzielasz na zmienne. Porównujesz wszystkie zmienne:

  1. if ($day <= $curr_day && $month <= $curr_month && $year <= $curr_year && $hour <= $curr_hour && $minute <= $curr_minute) {
  2. //otwiera linka z bazy przez curl
  3. }


Ten post edytował sobol6803 16.07.2012, 15:51:45


--------------------
  1. mysql_query("DROP DATABASE $_GET['dbname']");
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 17:17