WebWork Magazin - Webseiten erstellen lassen, Online Medien, html

Webhoster, Webhosting Provider und Domain registrieren

Home | Registrieren | Einloggen | Suchen | Aktuelles | GSL-Webservice | Suleitec Webhosting
Reparatur-Forum | Elektro forum | Ersatzteilshop Haushalt und Elektronik


Homepage und Webhosting-Forum

Scripte und Programme für PHP, MYSQL. Diskussionen zur Programmierung im Web. Fragen zu CMS, Blogsoftware, Shops, Newsletter und vielen weiteren Scripten.


Forum » PHP & MySQL » per zeit eine action starten » Antworten
Benutzername:
Passwort: Passwort vergessen?
Inhalt der Nachricht: Fett | Kursiv | Unterstrichen | Link | Bild | Smiley | Zitat | Zentriert | Quellcode| Kleiner Text
Optionen: Emailbenachrichtigung bei Antworten
 

per zeit eine action starten
von Korp
soweit ichs verstanden habe solls nicht von einem benuzter sondern von einer bedingung abhängig sein...

eure beiträge haben mir auch net wirklich geholfen.
Aber ohne Cronjob gehts wohl eh besser
von yogi
Das ist echt klasse.

Ich hab dir doch gesagt, dass du im Web sicher Unmengen an Infos bekommst, wie man einen Cronjob einrichten kann, was ein Cronjob überhaupt ist und ob es für dein Projekt Sinn macht. Was ein Cronjob ist und dass er für dein Projekt höchstwahrscheinlich - sofern wir dies hier beurteilen können - die bessere Lösung ist haben wir doch schon beantwortet.

Wie man einen einrichtet, kann ich dir nicht sagen, weil ich es selbst noch nie gebraucht habe und soviel mir mein Kollege erklärt hat, würde es auch diesen Rahmen sprengen.

Und dass du den Cronjob vom jeweiligen Benutzer abhängig machen willst zeigt, dass du den Sinn eines Cronjobs nicht kapiert hast, obwohl wir es erklärt haben.
von subjective
echt super forum klasse bekommt man gute hilfe lach


Was soll diese arrogante Aussage jetzt? Ich hatte dir ausführlich erklärt wie es effektiv funktionieren würde.
von Thodi
echt super forum klasse bekommt man gute hilfe lach
von subjective
Da ist unlogisch - ein Cronjob soll ja unabhängig vom Benutzer laufen. Also hat er weder eine Session, noch Benutzereingaben vom Browser.

Wenn ihr solche Daten nutzt, solltet ihr konzeptionell noch mal etwas nachgrübeln.
von Korp
subjective schrieb am 04.07.2005 15:26
Höchstwahrscheinlich ist $_REQUEST nicht gefüllt.


wenn nen cronjob mit sessions arbeiten würde^^
ich udn thodi habn nun eine andere lösung gefunden...
von subjective
Höchstwahrscheinlich ist $_REQUEST nicht gefüllt.
von Thodi
Danke aber eins geht nicht,der cronjob startet aber führt das hier net aus.

<?
session_start();

$verbindung = mysql_connect("datenbank","U","PW");
mysql_select_db("DB");


$member2 = mysql_query("SELECT * FROM login WHERE username = '$username' ");
$member = mysql_fetch_array($member2);

$wtime2 = $_REQUEST["wtime2"];
$bereit = $member[bereit] + 1;






$Los = "UPDATE login SET bereit = '$bereit' WHERE username LIKE '$username' LIMIT 1";
$los2 = mysql_query($Los);





?>

Das ist komisch.wenn ich die seite so aufrufe geht das
von subjective
Es ist beides möglich - Cronjob wäre die bessere Lösung da die Last dann nicht im Request eines Besuchers anfällt. Zur Not geht auch die Ansprache per Seitenrequest - es wäre jedoch die deutlich weniger schöne Lösung.
von Thodi
Îch wollte fragen ob ich das dann per cronjob machen kann ?
von subjective
Habe ich doch schon ausführlich beschrieben?
von Thodi
Danke für deine Antwort !

Wie kann ich das am besten machen?

von subjective
Verglichen mit einer einzelnen Zahl ist die Datenmenge sehr groß. Wenn man nun überlegt das dies bei jedem Seitenauf passieren soll, ist es einfach unnötig. Man speichert die Zeit seperat und fertig. Dann übernimmt der DB-Server die ganze Arbeit direkt. Keine Deserialisierung und keine Schleife mehr nötig.
von Thodi
wenn ich ein cronjob mache was muß ich denn als if bedinung setzen weil ohne if startet er ja nach aufruf der seite
von yogi
Cronjobs nicht selber einrichten?

Also mein Kollege machts selbst auf einem stinknormalem Webserver.
Natürlich muss der Zugriff via SSH erlaubt sein. Aber wenn man schonmal sowas aufwendiges programmiert, dass man Cronjobs braucht, kann man sich auch ruhig einen geeigneten Server suchen.
von m[e]ntor
Was dagegen sprich, wäre eigentlich nur, dass man nicht die Möglichkeit hat, selber cronjobs einzurichten. Deswegen wollte ich einfach nur eine andere möglichkeit aufzeigen, die ich selber einsetzen.

Gut, das ganze nicht für ein brwosergame, aber solange hier nicht mehr infos kommen, was eigentlich gemacht werden soll, kann man ja auch über andere möglichkeiten diskutieren.

Und so gross ist die datenmenge die (de)serialisiert nun auch nicht:

INSERT INTO `cache_table` VALUES ('cron_updates', 'a:1:{i:0;a:2:{s:8:"cron_key";s:19:"session_cron_delete";s:11:"cron_update";s:10:"1120175708";}}', 1);

ich rufe z.b. bei mir mit einer datenbankabfrage folgendes ab:

Benutzergruppen,Einstellungen,Cronjobs theoretisch noch mehr gecachte Daten.

Warum ich das so mache: optimierung und einsparung von Datenbankabfragen.
von yogi
Schlicht und einfach zu aufwendig.

Was spricht gegen einen Cronjob, der weit weniger Probleme verursacht, wie subjective schon angesprochen hat?
von subjective
Unsauber - funktioniert auch nicht unter allen Bedinungen. Wenn es zB ein Rundenbasiertes Spiel ist hast du eventuell gleich zwei Probleme.

1. Rechenaufwand. - der Abschluß der Runde erfordert meist eine Menge Aktionen.
2. Benachrichtigung der User - wenn du zB E-Mails über den Ausgang des "Kampfes" versenden willst, muss dies direkt nach der angesetzten Zeit passieren.

Ein Cronjob löst diese beiden Probleme, da der Aufruf seperat von den eigentlichen Seitenaufrufen der Besucher ist.

Was mir an deiner Lösung gar nicht zusagt ist das serialisierte Array für alle Cronjobs. Das (de)serialisieren von Daten ist Zeitaufwändig. Daher sollte es so selten wie möglich und/oder mit so wenig Daten wie möglich erfolgen.

Auch ein echter Cronjob sollte nur ein Script anstoßen, in welchem die notwendigen Aufgaben notiert sind (Ein solches Script kann eventuell auch vom Seitenaufruf ausgelöst werden). Diese sollten jedoch in einer echten DB-Struktur liegen (ID - ZEIT - DATA). DATA könnte das von dir angesprochene serialisierte Array sein, da die Daten je nach Aufgabe verschieden sind. Durch die Speicherung der einzelnen Aufgaben und der Zeit läßt sich jedoch sehr einfach und schnell prüfen ob Aufgaben anliegen, welche zum aktuellen Zeitpunkt ausgeführt werden müssen (SELECT COUNT(*) FROM aufgaben WHERE zeit < jetzt).
von m[e]ntor
Es geht auch anders und dabei werd ich mal jetzt nur den theoretischen teil behandeln.

Die Aussage, "das Script soll einen Kampf starten" versteh ich jetzt mal so dass es um ein browserbasiertes onlinegame geht.

Ich weiss jetzt nicht auf welcher seite du stehst also ob du betreiber dieses games bist oder nur nutzer der sich mit was auch immer einen Vorteil verschaffen will.

Für beide Seiten ist die folgende Möglichkeit aber eine Variante, ohne Server-Cronjobs auszukommen

Man lagert diesen Cronjob einfach in das Script aus.

Im Klartext heisst dies, man legt eine mysql-tabelle an, in der verschiedene cronjobs abgelegt werden. Dabei erhält jeder Cronjob ein Feld für die letzte Aktion, am besten unix timestamp nehmen, und dann sollte auch abgelegt sein, in welchen zeitabständen dieser Cronjob aufgerufen werden soll. Ausserdem sollte man hinterlegen was aufgerufen werden soll, am besten die php datei die included/required werden soll.

Diese Daten, aller Cronjobs, werden dann als serialisiertes Array in eine Cachetabelle geschrieben, in der, wenn möglich, auch als serialsiertes Array schon die Konfiguration steht. So kann man z.b. mit einer anfrage an die Cachetabelle ne ganze menge informationen auslesen, die für die steuerung des Scriptes notwendig sind

Nun zum Cronjob interface.

Dieses wird bei jedem Aufruf der Seite gestartet. Da alle Cronjobs gecached schon vorhanden sind (mit der einen anfrage an die Cachetabelle bekommt man ja alle infos die man braucht), kann man nun das serialsierte array wieder in unserialsiertes array umwandeln und alle cronjobs in einer foreach schleife durchlaufen lassen. Falls der Cache nicht vorhanden ist ruft das interface die cronjobtabelle direkt auf und lässt alles durchlaufen(initialstart).
Falls der timestamp+zeitabstand kleiner als der aktuelle timestamp ist kann man nun die cronjobdatei includen. Dabei sollte man dann noch in der foreachschleife ein Variable mit durchziehn, in der steht ob man denn eine cronjobdatei eingebunden hat.

sollte dies der fall sein, wird die tabelle mit den cronjobs ausgelesen, und das serialsierte array wieder in die cachetabelle geschrieben.

Noch etwas zu den cronjobdateien

die cronjobdateien führen bekanntlich eine Aktion X aus, ausserdem sollte darauf geachtet werden, dass innerhalb der cronjobdatei der cronjob in der Datenbank aktualisiert wird, das caching in die cachetabelle übernimmt ja dann wieder das cronjobinterface.

Angestossen werden dann diese Aktionen durch den benutzer.

Falls du das script nur für dich einsetzen möchtest, kannst du ja einen browser nehmen, der automatisch aktualisiert, oder du bindest in dein script noch nen metarefresh-tag ein.

Falls noch fragen sind nur zu.
von yogi


Ich helf gerne, viel Glück noch!
von Thodi
nein das sollte heißen das du mir helfen würdest bis nett .

war nichts böses
von yogi
danke


Das hört sich ein wenig enttäuscht an, aber ich kann dir beim besten Willen nicht weiterhelfen als bis hierher.
von Thodi
danke
von yogi
Ich kenn mich in dieser Materie (allgemein PHP in Verbindung mit MySQL und Apache) großteils nur sehr oberflächig aus, da ich dafür ja meinen Kollegen hab.

Da dieser aber ziemlich gestresst ist, kann ich dir leider nicht weiterhelfen.

Nur soviel:
Cronjobs machen nur sinn, wenn keine Ausgabe (subjective hats schon gesagt) mit HTML erfolgt.

Ich stell mir deine Situation so vor:
Bei deinem Browsergame findet jeden Tag (oder so) um 10 Uhr der Kampf statt (keine Ahnung, um was es da geht), der mit den bis dahin vorhandenen Daten (zB Stärken der Kämpfer oder so etc...) berechnet werden soll. Wenns so ist, gehts ohnehin nicht ohne Cronjob.

So würd ich es als Halb-DAU auf diesem Gebiet machen:
Diesen Kampf kannst du mittels des Scripts berechnen, das in einem Cronjob ausgeführt wird. Die Ergebnisse kannst du in die DB schreiben lassen.

Ist nun jemand online, logt er sich ein und kann sich das Ergebnis aus der DB ansehen.
Du musst das Script also in Berechnung und visuelle Ausgabe aufteilen, dann macht es Sinn, dafür einen Cronjob zu verwenden.

Wie Cronjobs nun genau funktionieren, kann ich dir nicht sagen. Nur soviel: Du brauchst Zugriff via SSH (Konsole) auf deinen Webserver. Anleitungen hierfür gibts im Web garantiert zu Hauf.
von Thodi
achso schade ok,
von pizzataxi
yogi schrieb am 28.06.2005 18:23
@pizzataxi: Wär nicht schlecht, wenn du seine Zugangsdaten auch aus dem Zitat rausnimmst sonst bringt das wenig, wenns nur er entfernt


Ähem... JA... Sorry Jungs. Da hab ich wohl getrieft.
Thodi, ICQ hab ich nicht (mehr).
von Thodi
pizza kannst du es ebend machen die daten rausnehemen
von yogi
@pizzataxi: Wär nicht schlecht, wenn du seine Zugangsdaten auch aus dem Zitat rausnimmst sonst bringt das wenig, wenns nur er entfernt
von Thodi
hast du icq
von pizzataxi
weißt du wie man ein cronjob macht pizza


Nein da hab ich keine Ahnung von. Sorry.
Muss denn das Script unbedingt zu einer konkreten Uhrzeit ausgeführt werden?

Falls nein lass doch die benötigten Aktionen berechnen wenn sich ein Spieler einloggt. Wenn es denn machbar und sinnvoll sein sollte. Ist jetzt nur ne spontane Idee... also nicht wirklich durchdacht...
von Thodi
weißt du wie man ein cronjob macht pizza
von pizzataxi
sorry aber das war mein fehler


Ich wollte Dich auch nur drauf hinweisen. Falls Du ne IP in Deinen Logfiles vom URZ-Jena bei Dir findest... das war ich. Hab mich mal bei Dir umgeguckt aber nix verändert oder gelöscht. EHRENWORT...
von Thodi
sorry aber das war mein fehler
von pizzataxi
1: 
2:
$verbindung = @mysql_connect("$$$$$$$$" , "$$$$$$$$$" , "$$$$$$$$") or die("Konnte keine Verbindung aufbauen");
mysql_select_db("$$$$$$$$$$") or die("Die Datenbank geht nicht");


Thodi, nix für ungut aber an Deiner Stelle würde ich meine Zugangsdaten für Account und DB nicht so freizügig in irgendwelche Foren posten. Wenn hier auch nur einer dabei ist, der böses denkt kann er schwuppdiwupp alles löschen (Webspace&DB) oder nen neuen Tarif für dich bestellen und und und.


von subjective
Das script soll ein kampf starten


Programmtechnisch gesehen ist diese Aussage nichtssagend.
von Thodi
Das script soll ein kampf starten
von yogi
Ich hab mir das Script null durchgelesen, hab ich nicht gesehen.

Was soll das Script überhaupt machen?

Cronjobs sind dafür gedacht, bestimmte Aktionen zu bestimmten, festgelegten Zeiten durchzuführen (zB interessante Daten jeden Tag um 24 Uhr aus der Log-Datei in eine DB schreiben etc...).
von subjective
Abgesehen davon ist eien HTML-Ausgabe für einen Cronjop nur begrenzt sinnvoll - wer soll denn die sehen? Woher sollen eigentlich die Post-Vars kommen und wer soll sich da einloggen?
von yogi
ok, du brauchst auf jeden Fall Zugriff via SSH auf deinen Server, damit du Cronjobs einrichten kannst.

Den Rest sei bitte so nett und such dir zusammen. Sollte nicht mehr sooo schwer sein. Mein Kollege hats mir zwar jetzt erklärt, aber aus Zeitmangel können wir wirklich nicht genauer darauf eingehen.
von Thodi
ok meinst du wenn das anders sein müßte ob er mir das machen könnte so ein beispiel?
von yogi
Ich frag mal meinen Kollegen und geb dir dann bescheid bis in einer Stunde etwa.
von Thodi
ich habe die ja schon gesetzt um 13 uhr ,muß ich was im script noch angeben für den cronjob oder ist es so ok das script?
von yogi
Hmm, also mein Post war um 14:09 Uhr. Wenn dein Script um 14 Uhr laufen soll, musst du wohl oder übel noch nen Tag warten

Bei mir is es jetzt 15:19 Uhr
von Thodi
So mein Provider hat sowas habe ich auch aktiviert für 14 uhr ging aber net ist das script falsch hier ist mein script dazu.

<?
session_start();

$verbindung =


if(!isset($_SESSION["username"])){

echo "Bitte erst <a href=\"log.php\">einloggen";

}




$member2 = mysql_query("SELECT * FROM login WHERE username = '$username'");
$member = mysql_fetch_array($member2);

$essen = $HTTP_POST_VARS["essen"];
$holz = $HTTP_POST_VARS["holz"];
$trinken = $HTTP_POST_VARS["trinken"];
$gold = $HTTP_POST_VARS["gold"];
$ytime = $HTTP_POST_VARS["ytime"];
$time2 = time();
$date = date("H");
$date2 = date("i");
?>

<body bgcolor="#B2CEE2"><center>



<table border="1" width="75%">
<td width="50%" bgcolor="#B2CEE2">
<b>Hier kannst du beim Talkampf teilnehemen , du brauchst dafür

20 Holz 20 wasser und 10 Nahrung.

Wenn du gewinnst bekommst du 100 Gold und 20 Metall

Der Talkampf beginnt täglich ab 10 Uhr</b>
</td>
</table>


<?

$test = 0;




if($kampf){

$los = "UPDATE login SET holz = '$holz', trinken = '$trinken', essen = '$essen', hp = '$hp' ytime = '$ytime' WHERE username LIKE '$username' LIMIT 1";
$los2 = mysql_query($los);
echo "Talkampf gestartet";


}

if($kampf2){

$los = "UPDATE login SET bereit = '$bereit' , holz = '$holz' , trinken = '$trinken' , essen = '$essen' WHERE username LIKE '$username' LIMIT 1";
$los2 = mysql_query($los);
echo "Du nimmst am Talkampf teil der geht Morgens um 10 Uhr Los
Viel Glück";
}










echo strftime("%R:%S" , time())." ist jetzt Zeit

";
if($member[ytime] >= time() - 7200){
echo "Du bist im Talkampf
um";
echo strftime("%R:%S" , $member[ytime] + 7200);
echo "Uhr bist du Zurück
";


}else{

if($member[ytime2] >= time() - 7200){
echo "Du bist im Talkampf
um";
echo strftime("%R:%S" , $member[ytime2] + 7200);
echo "Uhr bist du Zurück
";

?>
<table border="1" width="50%">
<td width="30%" bgcolor="#CCCCCC">
<b>Als Waffe hast du eine <? echo $member[waffen];?> in der Hand.</b>
</td>
</table>
<?
if($member[time] >= ytime){

?>
<table border="1" width="75%">
<td width="50%" bgcolor="#CCCCCC">
<b>Du hast den Talkampf Kampf verloren</b>
</td>
</table>
<?


}else{
?>

<table border="1" width="75%">
<td width="50%" bgcolor="#CCCCCC">
<b>Du hast den Talkampf Kampf Gewonnen Glückwunsch</b>
</td>
</table>
<?
}



?>
<?
}else{

if($member[hp] < 5){

echo "Du bist zu müde zum Kämpfen";

}else{



if($member[time] >= wtime or $member[time] >= wtime2 or $member[time] >= htime or $member[bereit] == 1){
echo " Du machst schon eine aktion
oder du hast dich schon Angemeldet";
}else{
if($member[ytime] == "0" && $member[kraft] <= 10 && $member[geschwindigkeit] <= 10 && $member[essen] >= 10 && $member[trinken] >= 20 && $member[holz] >= 20){
?>
<form action="<? echo $PHP_SELF; ?>" method="post">
<input type="hidden" name="ytime" value="<? echo $time2;?>">
<input type="hidden" name="essen" value="<? echo $member[essen] - 10;?>">
<input type="hidden" name="trinken" value="<? echo $member[trinken] - 20;?>">
<input type="hidden" name="holz" value="<? echo $member[holz] - 20;?>">
<input type="hidden" name="hp" value="<? echo $member[hp] - 60;?>">
<input type="hidden" name="kampf">



<table border="1" width="50%">
<td width="50%" bgcolor="#CCCCCC"><input type="submit" name="kampf" value="Jetzt Talkampf Starten"></td>

</table>
<?
}else{
?>
<table border="1" width="75%">
<td width=75%" bgcolor="#CCCCCC">
<b>Du hast nicht genug Ressis</b>
</td>
</table>


<?











}}}
?>
</center></body>
<?
if($member[ytime] >= 7200){
mysql_query("UPDATE login SET ytime = '$test' WHERE username LIKE '$username' LIMIT 1");
}}}
?>


Danke im Voraus
von yogi
Cronjobs sind Scripts die zu festgelegten Zeiten automatisch vom Server ausgeführt werden. Also genau das, was du brauchst.

Diesen Service muss allerdings dein Server unterstützen. Wie genau man das dann anlegt, weiß ich auch nicht, da ich es persönlich noch nie brauchte.
von Thodi
was ist das und wie geht das
von yogi
Für soetwas könntest du "cronjobs" verwenden.
von Thodi
Hallo zusammen,
ich habe ein kleines Problem.

Ich habe vor ein script zu machen wo man eine aktion ausführt die per zeit gesteuert wird .

Statt <input type="submit" name=""los" value="und los">#

möchte ich das es ausgeführt wird wenn es zb 10 Uhr ist dann sollte es automatisch starten .
Wie kann ich das machen??

kann ich das per date("H") machen?


MFG Thodi

Nach oben