sehr komisches cronjob problem
uwi
- php
0 dedlfix
hallo,
ich bastel z.Z. an einem kleinen online spiel.
alle funktionen laufen soweit ganz gut.
nur eine funktion wird vom cronjob anders ausgeführt als wenn ich sie von hand aufrufe.
und das geht in meinen kopf nicht rein.
hier mal der scriptteil:
for($i=0; $i<=(count($haben_n)-1); $i++)
{
if($bedarf > 0)
{
$haben = explode('||' , $haben_n[$i]);
/// Nahrungs-Multiplikatoren ////
if(trim($haben[1])=="20") $multi=1;
if(trim($haben[1])=="21") $multi=2;
if(trim($haben[1])=="22") $multi=3;
if(trim($haben[1])=="23") $multi=4;
if(($bedarf*1) <= ($haben[0]*$multi))
{
$abzug = ($bedarf* (1/$multi);
$was_bleibt = ($haben[0]-$abzug);
$verbrauch = verbrauch_abziehen_n( $user_id, $haben[1], $was_bleibt );
$bedarf = 0;
}
else
{
$bedarf = $bedarf - ($haben[0]*$multi);
$was_bleibt = 0;
$verbrauch = verbrauch_abziehen_n( $user_id, $haben[1],$was_bleibt );
}
}
}
so also was hier passiert, ist das ich 4 verschiedene arten von nahrungsmitteln in dem spiel habe die unterschiedlich viele personen satt machen.
daher die multiplokatoren 1,2,3,4.
und dann wird natürlich das verbrauchte essen von essensvorrad des users abgezogen.
das klappt auch alles 1A wenn ich das script über den browser oder über die konsole aufrufe, ABER wenn der cronjob es alle 15 minuten ausführt nicht ganz.
also als erstes wird das lebensmittel verbraucht von dem am meisten satt werden:
also wenn der bedarf = 40 ist brauche ich 10 von nahrung 4 weil eins davon 4 satt macht. <- klappt auch wenn ich es über browser oder konsole aufrufe, aber beim cronjob zieht das script statt 10 trotzdem 40 ab ...
und ich habe nicht die geringste ahnung warum.
wenn da jemand ne idee hätte wäre supper den das ist das einzige was mir noch zur betaphase fehlt.
uwi
echo $begrueszung;
nur eine funktion wird vom cronjob anders ausgeführt als wenn ich sie von hand aufrufe.
Wie ruft der cronjob das Script auf? Ruft er mit wget (o.ä.) das Script über den Webserver auf, oder wird es über die CLI-Version von PHP aufgerufen. Da gelten u.U. unterschiedliche Konfigurationsdateien. Vielleicht sind da einige Werte unterschiedlich gesetzt.
Rufst du das, was der cronjob macht, genauso auf? Ein Aufruf über den Webbrowser ist s.o. nicht in jedem Fall das selbe.
An welcher Stelle treten denn die Fehler auf? Hast du mal alle Zwischenergebnisse untersucht, ob diese deinen Erwartungen entsprechen?
Gibt es gar keine Fehler/Warnungen/Notizen? Hast du mal mit error_reporting = E_ALL getestet?
Schickt dir (oder dem root, oder wem auch immer) der cronjob Post über Ausgaben und Meldungen?
Man kann die PHP-Meldungen in ein Log-File schreiben lassen, siehe Kapitel zu Error Reporting im Manual.
Nun noch ein paar Kommentare zum abgebildeten Teil:
Deine Quelltextformatierung lässt zu wünschen übrig. Man erkennt nicht, welche {}-Klammern zusammengehören, wie die Blöcke geschachtelt sind.
for($i=0; $i<=(count($haben_n)-1); $i++)
^ ^^
Die markierten Zeichen (= und -1) können weggelassen werden. $i darf nur maximal eins weniger als count() werden und das entspricht $i < count...
{
if($bedarf > 0)
{
$haben = explode('||' , $haben_n[$i]);
Enthält $haben_n[$i] _immer_ ein '||'? Oder gibt es vielleicht Situationen die du nicht bedacht hast? Hat $haben in jedem Fall überhaupt die zwei Elemente, die du später anzusprechen versuchst?
/// Nahrungs-Multiplikatoren ////
if(trim($haben[1])=="20") $multi=1;
if(trim($haben[1])=="21") $multi=2;
if(trim($haben[1])=="22") $multi=3;
if(trim($haben[1])=="23") $multi=4;
Welchen Wert hat denn $multi, wenn keine der Bedingungen zutreffen? Am Anfang gar keinen und bei jedem Schleifendurchlauf den, den ein erfolgreiches if in einem vorherigen Durchlauf gesetzt hat. Ist das so gewollt?
if(($bedarf*1) <= ($haben[0]*$multi))
^^
Welchen Sinn hat denn das *1 ?
{
$abzug = ($bedarf* (1/$multi);
Wenn $multi nicht initialisiert ist, wird dir hier PHP eine Division durch 0 vorwerfen.
Im restlichen Quelltext habe ich keine Fehler gesehen. Prüfe wie oben erwähnt die Zwischenergebnisse, dann sollte dir sich der Fehler offenbaren.
echo "$verabschiedung $name";