ktoosiu
15.07.2012, 17:35:01
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:
if(!isset($_GET['exist'])) {
echo "<form method=\"get\" action=\"/\">"; <parametry>
echo "<input type=\"text\" name=\"t\" />"; // czas w formacie GG:MM echo "<input type=\"hidden\" name=\"exist\" value=\"true\"/>"; echo "<input type=\"submit\" name=\"wyślij\" value=\"Wyślij\"/>"; }
else
{
$t = $_GET['t'];
{
if($cz == $t)
{
<skrypt który chce wykonać>
}
}
}
Jak to zrobić? bo nie mam już żadnego pomysłu:/
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
csharp
15.07.2012, 18:00:20
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ć?
peter13135
15.07.2012, 18:53:46
Takie porównywanie stringów nie zadziała.
sobol6803
15.07.2012, 19:07:20
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.
ktoosiu
15.07.2012, 19:07:32
@!*! 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
peter13135
15.07.2012, 19:20:00
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
ktoosiu
15.07.2012, 20:38:09
Wykombinowałem coś takiego
$t = $_GET['t']; //czas w formacie GGMM
$t = (int) $t;
$cz = (int) $cz;
for($i = 1
; $t == $cz ; $cz = date("G:i")) {
$cz = (int) $cz;
<kod>
}
ale tak jakby omijało całe for. co robię źle?
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?
GoOx
16.07.2012, 06:47:36
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.
ktoosiu
16.07.2012, 11:44:53
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
GoOx
16.07.2012, 12:57:43
Odpowiedź jest prosta użyj takiego kodu:
$t = $_GET['t']; // ale get to nie jest moim zdaniem dobre rozwiązanie.
$czas_teraz = time("H:i"); // po co robiłeś to explode? jeśli $t jest w formacie godziny:minuty to tutaj mamy tak samo.
if($czas_teraz == $t) {
// to co ma być wykonane
}
Dobrze Ciebie zrozumiałem?
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...
d3ut3r
16.07.2012, 14:07:25
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.
ktoosiu
16.07.2012, 14:11:23
@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
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?
Shido
16.07.2012, 14:16:11
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 )
d3ut3r
16.07.2012, 14:19:48
tak na szybko:
//zZzZz
}
Tylko, że takie długie ładownie może spowodować wyświetlenie monitu w przeglądarce "Strona nie odpowiada...."
@UPzgadza 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ę:
if (time()<$dontStartAfter){ //zZzZz
}
}
i powinno działać
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ę.
sobol6803
16.07.2012, 15:22:48
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:
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:
if ($day <= $curr_day && $month <= $curr_month && $year <= $curr_year && $hour <= $curr_hour && $minute <= $curr_minute) {
//otwiera linka z bazy przez curl
}
ktoosiu
16.07.2012, 15:28:22
skorzystałem z pomysłu @d3ut3r
ostatecznie wygląda to tak:
if(!isset($_POST['exist'])) {
echo "<form method=\"POST\" action=\"/skrypt.php\">"; <inne parametry>
echo "<input type=\"text\" name=\"t\" value=\"\"/>"; //czas w formacie GG:ii:ss echo "<input type=\"hidden\" name=\"exist\" value=\"true\"/>"; echo "<input type=\"submit\" name=\"wyślij\" value=\"Wyślij\"/>"; }
else
{
$t = $_POST['t'];
$w = (int) $w;
$w += 1; // linijki 12-16 - Automatycznie tworzy czas (+1s) do $dontStartAfter
$te .= $w;
if (time()<$dontStartAfter) {
{
//zZzZz
}
<mój kod>
}
}
?>
dzięki za pomoc, temat do zamknięcia
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.