PHP Funktion nicht doppelt ausführen...
Faris
- php
Hallo,
ich überlege wie ich die Performance meines PHP scriptes erhöhen kann. Hierbei ist mir beim loggen der Scriptzeiten aufgefallen, das ich offenbar Funktionen zwei mal ausführe:
if (get_fuss($laenge,$breite) != false) {$result[] = get_fuss($laenge,$breite);}
gibt es hierfür eine bessere Lösung? Das würde meine Scritplaufzeiten sicher deutlich verbessern.
Danke
Faris
Hello,
ich überlege wie ich die Performance meines PHP scriptes erhöhen kann. Hierbei ist mir beim loggen der Scriptzeiten aufgefallen, das ich offenbar Funktionen zwei mal ausführe:
if (get_fuss($laenge,$breite) != false) {$result[] = get_fuss($laenge,$breite);}
gibt es hierfür eine bessere Lösung? Das würde meine Scritplaufzeiten sicher deutlich verbessern.
Ja. Erst die Wertzuweisung auf eine Variable durchführen und dann die Variable auswerten.
Deine Variante könnte in Multiuserumgebungen sogar noch eine gefährliche Falle enthalten. Wenn Deine Funktion get_fuss() nämlich auf geteilte Ressourcen zugreifen sollte, schaffst Du Dir ein Nebenläufigkeitsproblem.
if (($fuss = get_fuss($laenge,$breite)) !== false)
{
$result[] = $fuss;
}
else
{
$result[] = DEFAULT;
}
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Moin allerseits,
Deine Variante könnte in Multiuserumgebungen sogar noch eine gefährliche Falle enthalten. Wenn Deine Funktion get_fuss() nämlich auf geteilte Ressourcen zugreifen sollte, schaffst Du Dir ein Nebenläufigkeitsproblem.
if (($fuss = get_fuss($laenge,$breite)) !== false)
{
$result[] = $fuss;
}
else
{
$result[] = DEFAULT;
}
What is a "Nebenläufigkeitsproblem" und was meinst du damit bzw. worin liegt es jetzt hier?
Grüße, JN
Hi johny7!
What is a "Nebenläufigkeitsproblem" und was meinst du damit bzw. worin liegt es jetzt hier?
if(exists($beer))
{
drink($beer);
}
Benutzer 1 Benutzer 2
0: [Skriptaufruf]
1: exists($beer)
-> true
[Skriptaufruf]
2: exists($beer)
-> true
3: drink($beer) // *schlürf*
4: drink($beer) // kein *schlürf*, da Bier schon weg ;-(
Problem verstanden? =)
Falls dich das Thema interessiert:
http://de.wikipedia.org/wiki/Threadsicherheit
http://de.wikipedia.org/wiki/Semaphor_(Informatik)
http://de.wikipedia.org/wiki/Mutex
MfG H☼psel
Hello Hopsel,
hi johny7,
What is a "Nebenläufigkeitsproblem" und was meinst du damit bzw. worin liegt es jetzt hier?
if(exists($beer))
{
drink($beer);
}
>
> Benutzer 1 Benutzer 2
>
> 0: [Skriptaufruf]
> 1: `exists($beer)`{:.language-php} -> `true`{:.language-php} [Skriptaufruf]
> 2: `exists($beer)`{:.language-php} -> `true`{:.language-php}
> 3: `drink($beer) // *schlürf*`{:.language-php}
> 4: `drink($beer) // kein *schlürf*, da Bier schon weg ;-(`{:.language-php}
nett erklärt :-)
>
> Problem verstanden? =)
>
> Falls dich das Thema interessiert:
> <http://de.wikipedia.org/wiki/Threadsicherheit>
> <http://de.wikipedia.org/wiki/Semaphor_%28Informatik%29>
> <http://de.wikipedia.org/wiki/Mutex>
Das Problem tritt in Multiuserumgebungen prinzipiell immer auf, wenn eine Funktion, die auf äußere Daten zugreift, zweimal aufgerufen wird und in der Zeitlücke zwischen den Aufrufen bei anderen Prozessen nicht verhindert, dass diese die Daten ändern können.
Oder auch anders ausgedrückt:
- wenn zwischen Abfrage und Aktion eine Zeitlücke besteht.
- wenn eine Zuweisung von einem Funktionsaufruf abhängig gemacht wird
und diese Zusweisung dann erst durch erneuten Funktionsaufruf durchgeführt wird
Das wäre hier der Fall, wenn die Funktion auf gemeinsame Daten zugreift.
Das nennt man dann auch TOCTOU-Problem
<http://en.wikipedia.org/wiki/Time-of-check-to-time-of-use>
(neuerdings mit zwei 'T' in der Mitte) \*g\*
<http://www.owasp.org/index.php/File_Access_Race_Condition:_TOCTOU>
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
☻\_
/▌
/ \ Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
Hi
if (get_fuss($laenge,$breite) != false) {$result[] = get_fuss($laenge,$breite);}
Du könntest den Rückgabewert der Funktion einer Variable zuweisen und dann, wenn du später diesen Wert brauchst, auf die Variable zugreifen, statt die Funktion jedes Mal wieder auszuführen.
mfg
Rato
Moin!
if (get_fuss($laenge,$breite) != false) {$result[] = get_fuss($laenge,$breite);}
gibt es hierfür eine bessere Lösung? Das würde meine Scritplaufzeiten sicher deutlich verbessern.
Dann rechne es einmal aus, speichere den Wert zwischen und benutze diesen für den Vergleich:
$varFuss = get_fuss($laenge,$breite);
if (! false === $varFuss) { $result[] = $varFuss; }
Ich vermute mal, dass get_fuss() keine übermäßig großen Datenmengen zurück liefert.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix