PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : create_code() funktioniert nicht zuverlässig



VMS1
16.10.2009, 12:22
Hi zusammen.

Ich hab ma wieder ein Problem, wo ich nicht weiter komme. Diesmal geht es um die ganz normalen Standard-Interfaces vom Autosurf.

Das Problem ist, das der Cron ganz normal läuft und auch Kampagnen usw. einliest. Die Rückgabe vom Sponsor wird auch alles ganz normal zerlegt in Reload, Verdienst, Name usw... Klappt alles wunderbar.
Ich würd hier allerdings nicht schreiben, wenn es kein dickes ABER geben würde^^ Und das ist, das alle Kampagnen dieselbe TAN haben. Oder sagen wir mal fast alle. Bei ca. 30 eingelesenen Kampagnen teilen sich jeweils 10 eine TAN.

Die TAN ansich wird allerdings in der Schleife, wo die Rückgabe vom Sponsor zerlegt wird, für jede Kampagne erst zurückgesetzt :
&int_tan = '';
und erst dann neu erstellt :
&int_tan = create_code(14);

Also eigentlich kann das doch gar nicht sein, oder?

Wenn ich jetzt statt :
&int_tan = '';
das hier verwende :
unset(&int_tan);

bringt das rein gar nix. Und da hört bei mir das Verstehen absolut auf. Die Variable &int_tan ist leer. Da kann eigentlich überhaupt nix drin sein. Wie kommt da die TAN, also der kreierte Code aus den vorangegangen Kampagnen rein? Zumal alles andere ja stimmt.

Aber der Spass geht natürlich noch weiter. In anderen Interfaces wird die TAN ja als md5 generiert. Ungefähr so :
&kamp_code = 'sponsor_werbeart_'.&kamp_id.'';
&tan_code = md5(&kamp_code);
Natürlich wird vorher auch hier zurückgesetzt :
&tan_code = '';

Aber das funktioniert einwandfrei. jede Kampagne hat ihre eigene TAN.

Das heißt im Umkehrschluss, das das Leeren der Variablen funktioniert. Aber create_code liefert dieselbe TAN zurück, wie davor.

Der einzig mögliche Schluß für mich ist also, das es an der Funktion create_code() liegen muß. Aber warum? Und was? Is vielleicht der Server zu langsam, das er nicht schnell genug auf die fuctionns.lib.php zugreifen kann? Aber warum schafft er es dann alles in die DB (db_connect) einzutragen?
Ich verstehs halt echt nicht.

Ich vermute mal, das es vielleicht durch irgendeine Einstellung, oder was auch immer, das Ergebniss, von rand() gecached wird, aber wissen tu ich es definitiv nicht. Und schon gar nicht wo, und an welcher Stelle.

Hat vielleicht schonmal jemand etwas Ähnliches erlebt? Oder hat jemand eine leise Ahnung, wie so etwas zustande kommen kann?

Gruß
Marco


*Edit: Habe gerade mal spasseshalber die TAN in dem Interface per md5 generiert und die alte TAN gar nicht erst zurückgesetzt, sondern direkt mit der neuen überschrieben. Funktioniert einwandfrei. Es liegt also definitiv nicht daran, das es nicht zurückgesetzt wird, sondern in irgendeiner mir unbekannten Weise an create_code(), bzw. rand().

*Edit²: Noch ein Experiment. Ich hab das wieder zuückgebaut auf create_code() und dahinter einfach mal 1 Sekunde sleep() nach jedem Aufruf gesetzt. Siehe da, nun klappt es auch. Das Ganze ist natürlich keine Lösung, da auf dem Server (ist nicht meiner, versuche das Problem für jemand anderen zu lösen), ignore_user_abort nich hinhaut und die max. Ausführungszeit bei mehr Kampagnen überschritten würde. Also müßte

Aradiv
16.10.2009, 14:20
Das problem an der create_code funktion ist wenn sie zu schnell abläuft erzeugt sie immer die selben reihe an Zufallszahlen
ein. Ein schönes Beispiel dazu findest du hier (http://www.evocomp.de/beispiele/php/random.html).

Ich habe die create_code funktion neu geschrieben ersetze die mal und schau mal ob das Problem so behoben ist.


function create_code($code_laenge) {
$code="";
while(strlen($code)<$code_laenge){
$code.=md5 (uniqid ("xkncwbsvyfbuxughd"));
}
$code = substr($code, rand(0,(strlen($code)-$code_laenge)), $code_laenge);
return $code;
}

mfg
Aradiv

jpwfour
16.10.2009, 16:04
Mich verwirrt, dass du in deinen Codes in Beitrag #1 oft ein & anstelle des $ verwendest.

Denke aber mal, dass da im Cron schon $ stehen, anonsten würde da kaum was funktionieren :wink: (oder was soll PHP mit den ganzen Referenzen anfangen?)

Benutzt doch bspw. zusätzlich zu create code noch md5 und darin dann die Kampagnen ID und den sponsornamen/werbeart.

somit sollte gewähleistet sein, dass es zu keinen Überschneidungen kommt (da ja generell jede KID bei jedem sponsor je werbeart nur einmal vorkommt)

VMS1
16.10.2009, 17:03
Das & verwende ich normalerweise anstelle des Dollarzeichens, wenn ich der Meinung bin, das die PHP oder CODE-Tags in einem Forum unangebracht sind^^