Was ich gerne früher gewußt hätte ...
Ich habe z.B. Ewigkeiten gebraucht um zu merken das man in PHP4 Variablen mithilfe eines vorangestellten "&" als Referenzen statt als Kopie z.B. an Funktionen weitergeben kann. Inzwischen ist das zwar egal da PHP5 das automatisch macht aber viele werden sicherlich noch nicht upgegraded haben.
Die frage ist nur. Bist du sicher? Ich mein anfangen tut man mit billig bis gratis hosts...
Und die sind nun mal ned Java / C#
Gruss
JAVA/J++/J#/C# etc. kann man dafür verwenden, in einzelfällen ist es sogar besser, aber PHP hat doch viele unschlagbare Vorteile.
Welche das sind, muss jeder für sich selber entscheiden.
Mein absoluter Favorit ist die Variablengültigkeit
Original von Bierchen
Der Vorteil von PHP ist eindeutig das es von vornherein für web "anwendungen" gedacht war.
JAVA/J++/J#/C# etc. kann man dafür verwenden, in einzelfällen ist es sogar besser, aber PHP hat doch viele unschlagbare Vorteile.
Welche das sind, muss jeder für sich selber entscheiden.
Mein absoluter Favorit ist die Variablengültigkeit
Mich würde jetzt mal interessieren, welche der viele unschlagbare Vorteile Du in PHP siehst?
Die Variablengültigkeit erkaufst Du Dir mit internem Casten, welches Rechenzeit benötigt.
Ich denke, das es wichtiger ist, welche Ziele man für seine Anwendung hat.
Danach sollte man die Programmiersprache wählen.
Php hat vorteile?
Nein, hat es nicht, es hat sogar nur nachteile c++ gegenüber, auch in
sachen webprogrammierung, WENN man erstmal etwas vorarbeit
geleistet hat.
Man muss natürlich eine Klasse haben, die einem POSt und GET befehle
auslesen kann, Formulare verwalten kann, und mit datenbanken
komuniziert. Auch Cookies und Sessions sollte man mit einbauen.
Sobald man content txpe HTML gesetzt hat, geht jede ausgabe per
printf ( cout ) direkt auf die html seite.
Da muss man zwar etwas Vorarbeit leisten, bis man das ganze am laufen
hat, aber dann geht es steil vorran.
Ich schreibe ein onlinespiel in c++, und mekre die vorteile auf den Fuß.
Habt ihr euch bei php nicht auch mal einen schönen debugger
gewünscht? Oder die freiheit des funtktionsumfangs wie bei c++?
Vor allem das debuggen ist ein großer vorteil bei c++, gegenüber PHP,
denn langes suchen kann einen viel Zeit kosten. Oder wir haben den Fall,
dass ein weiterer Programmierer hinzukommt, der nimmt sich die
main() und geht von da an nach unten im debugger, und schon läuft er
schritt für schritt live durch das programm ( spiel )
Zum Thema variblengültigkeit........ muss ich was sagen, oder reicht
es, dass es die in so gut wie jeder programmiersprache gibt, man
darf nie vergessen, dass so gut wie alle Programmiersprachen sich
als vorbild c genommen haben ( 1972 entwikelt )
du könntest jetzt sagen, dass Assembler dies nicht hat, aber das zieht
nicht
Fazit:
wer ein spiel, oder eine etwas rechenlastigere seite aufbauen will, der
sollte sich c++ mal anschauen, dann kann man nämlich
sachen wie kmapfsystem, ressourcen, usw progblemlos immer
beim klicken der user ausführen, und die cpu merkt das nichtmal
wer allerdings nur kleine seiten aufbauen will, dem sei PHP und Javascript
näher gelegt, denn diese Sprachen sind anfang viel schneller einzubauen,
das der Apache diese Sprachen ( PHP ) schon beherscht.
wenn man noch nicht Programmieren kann, dann ist das ganze eh
abzuwägen, denn c++ ist als erste programmiersprache ohne Hilfe
sehr schwer, und es geben viele auf. da wäre dann auch PHP
angebraucht, da man dort nicht mit variblentypen usw. kämpfen muss.
mfg
Freshman
Allerdings das mit dem PHP Debuggen ist so nicht korrekt.
Der Zend Debugger liefert mir sogar mehr Infos wie mein C++ Debugger.
Allerdings kostet der halt.
was geht denn noch mehr als assemblercode und ausrufliste???
ps.: ich lasse mich immer gerne eines besseren belehren
edit: du hast mein debugger geschrieben, sorry dachte ein debugger.
was nutzt du denn?
Ja aber was nützt mir der Assambler Code? Damit kann ich ehrlichgesagt überhaupt nix anfangen.
Manch andere vielleicht schon aber ich denk mal der Großteil eher nicht. Hab zwar auch schon Assamblerprogrammierung 2 Jahre gemacht aber ich kann da trotzdem nicht wirklich was im Debugging erkennen.
kann als z.B. Visual studio, da dort seeeeeeehr viel gezeigt wird, alle
variblen, die funktonsaufrufe, parameter, typen, usw....
du kannst auch, wenn du nen Fehler gefunden hast einfach 6 Schritte
zurückgehen, und nochmal genau schauen.
Du hast natürich recht, assembler ist nur sehr sehr selten nötig.
wer es kann ist eine gute frage, nicht viele, aber die, die es können,
können mit dem wissen programme mit etwas aufwand disassemblieren
mit hilfe des studios.
Was ich gerne gewusst hätte:
Es es neben der squrt() auch noch die Funktion bcsqurt() gibt.
Und: Das Webweaver eine absolut geniale PHP-IDE ist, und mich mich lange mit PHPEclipse und Weaverslave herumgeschlagen habe.
nicht, sorry.
Original von Kampfhoernchen
Was ich gerne gewusst hätte:
Es es neben der squrt() auch noch die Funktion bcsqurt() gibt.
Die 'u' müssen da weg.
Die bc-Funktionen bieten "beliebige Genauigkeit" (Stellen hinter dem Komma) - siehe http://de.php.net/manual/de/ref.bc.php
Aber von der Performance her ist das ganze natürlich top!
Original von Freshman
@ Bierchen:
Php hat vorteile?
Nein, hat es nicht, es hat sogar nur nachteile c++ gegenüber, auch in
sachen webprogrammierung, WENN man erstmal etwas vorarbeit
geleistet hat.
Man muss natürlich eine Klasse haben, die einem POSt und GET befehle
auslesen kann, Formulare verwalten kann, und mit datenbanken
komuniziert. Auch Cookies und Sessions sollte man mit einbauen.
Sobald man content txpe HTML gesetzt hat, geht jede ausgabe per
printf ( cout ) direkt auf die html seite.
Da muss man zwar etwas Vorarbeit leisten, bis man das ganze am laufen
hat, aber dann geht es steil vorran.
Ich schreibe ein onlinespiel in c++, und mekre die vorteile auf den Fuß.
Habt ihr euch bei php nicht auch mal einen schönen debugger
gewünscht? Oder die freiheit des funtktionsumfangs wie bei c++?
Vor allem das debuggen ist ein großer vorteil bei c++, gegenüber PHP,
denn langes suchen kann einen viel Zeit kosten. Oder wir haben den Fall,
dass ein weiterer Programmierer hinzukommt, der nimmt sich die
main() und geht von da an nach unten im debugger, und schon läuft er
schritt für schritt live durch das programm ( spiel )
Zum Thema variblengültigkeit........ muss ich was sagen, oder reicht
es, dass es die in so gut wie jeder programmiersprache gibt, man
darf nie vergessen, dass so gut wie alle Programmiersprachen sich
als vorbild c genommen haben ( 1972 entwikelt )
du könntest jetzt sagen, dass Assembler dies nicht hat, aber das zieht
nicht
Fazit:
wer ein spiel, oder eine etwas rechenlastigere seite aufbauen will, der
sollte sich c++ mal anschauen, dann kann man nämlich
sachen wie kmapfsystem, ressourcen, usw progblemlos immer
beim klicken der user ausführen, und die cpu merkt das nichtmal
wer allerdings nur kleine seiten aufbauen will, dem sei PHP und Javascript
näher gelegt, denn diese Sprachen sind anfang viel schneller einzubauen,
das der Apache diese Sprachen ( PHP ) schon beherscht.
wenn man noch nicht Programmieren kann, dann ist das ganze eh
abzuwägen, denn c++ ist als erste programmiersprache ohne Hilfe
sehr schwer, und es geben viele auf. da wäre dann auch PHP
angebraucht, da man dort nicht mit variblentypen usw. kämpfen muss.
mfg
Freshman
Hallo,
Ich finde deine Ausführungen sehr interessant. Allerdings gibt es noch ein paar Dinge, bei denen ich gerne noch genauer nachhaken würde:
- Nimmt dein Programm direkt Anfragen über Port 80 an und agiert quasi wie ein Webserver, oder gibt es da noch einen "Zwischenhändler"?
- Für was für einen Server siehst du so ein Programm vor? Windows, Linux oder was ganz anderes?
- Was machst du mit den Spieldaten? Verwendest du eine Datenbankumgebung wie postgre oder MySQL (, etc...)? Oder hast du was anderes, eigenes?
- Programmierst du (ihr?) nur mit Visual C++?
- Gibt es einen Link zu deinem Spiel? Würde mir das gerne mal ansehen
- Wie umfangreich ist die ganze Vorarbeit, von der zu sprichst?
Würde mich freuen über Beantwortung dieser Fragen
mfg smf68
Für mich hat diese Vorarbeit etwa 1 Woche gekostet. Es wurde ein einfacher HTTP-Server auf Port 80 aufgebaut, der Cookies, Sessions, POST, GET und Keep-Alive unterstützt. Dieses Programm läuft in einem eigenen Thread und kann dementsprechend als Win32-Konsole oder Win32-GUI-Anwendung genutzt werden.
Linux und andere BS unterstützt mein Webserver nicht.
Als Datenbank habe ich MySQL direkt unterstützt (mysql C-API)
Die Portierung auf C# hat etwa 1 Tag gedauert und läuft nun unter .Net und Mono. Als Datenbank nutzte ich das ADO-Interface. Momentan ist das Projekt aber etwas vergraben (Hass auf HTML/CSS/IE)
nicht. Habe mich dann dagegen entscheiden, da es einfach zu zeitaufwendig ist, einen Kompletten webserver aufzubauen.
Stattdessen habe ich mich dafür entschieden, den apache als server zu benutzen, und mein Spiel als cgi-bin laufen zu lassen. Ich weiß auch, dass es schnellere Wege oder elegantere Wege gibt, aber dieser ist sicher.
Der Einbau eines Servers ( soweit Vorhanden ) qürde ca. 3 Tage dauern, wobei man dann den Vorteil hätte, dass ein paar Wichtige Daten in den Cache geladen werden können, aber nötig ist das nicht, da der Zeitvorteil nicht so groß ist.
Das Programm ist auf Windows geschrieben, komplett mit dem VC++ 6.0
Da muss ich sagen, dass ich es so mache, weil das mein Standartcompiler auf der Arbeit ist, und man sich sehr schnell an sowas gewöhnt.
Als Datenbank verwende ich MySql weil sie kostenlos ist. Die Datenbank ist schnell, ich habe nicht sooo viele Anfragen, da ich Forschungen und Gebäude klein gemacht habe. Alles in allem steht die Verbindung.
Du hast noch geschrieben du ( ihr? )...
ICh Programmiere allein, nicht weil ich es unbedingt will, aber man findet halt nicht so schnell leute, die an sowas interessiert sind.
so ist halt das Leben, aber ich komme recht schnell vorran, habe jetzt vor knappp 7 Monaten angefangen ( kann auch mehr sein ) und bin in ca 3 Wochen soweit, dass ich die erste version richig freigeben werde
Einen Link kann ich dir per PM geben ^^
Der einzige Nachteil ist das Compilieren was bei der Programmierung selbst ein bissel Zeit in anspruch nimmt.
Das mit dem Speichermanagment kann man C überlassen, man sollte/muss NICHT reinfummeln. Kannste aber z.B. direkt einen Speicherbereich von verschiedenen Programmen auslesen und musst nicht alles in die Datenbank schreiben...solches ist aber nix für mich, weil man das OS sehr gut kennen muss.
Alleine Variablendefinitionen können schon Speicherplatz und auch Rechenzeit sparen. Bin aber zu faul für sowas. Was den CPU in die Knie zwingt sind letzlich andre Dinge...z.B. Mailattacken, verschwenderischer Programmierstil und schlechte Wartung der Datenbanken...endlos lange Joins und Unions in den SQL-Statements etc. etc...
WebScripte sollte man ja sowieso kleinhalten. Dinge wie Tickers die einige Tausend Linien lang sein können, kann man ja problemlos in C schreiben.
An PHP gefällt mir, dass ich alte Perl Scripte per "Search+Replace" in PHP Scripte umwandeln kann. Und eben dass es viele Leute können, und so kann man einfacher Teilbereiche an Helfer abgeben
Wenn Register-Globals auf on sind, und eine Session-Variable namens 'isle' besteht, und gleichzeitig eine "normale" Variable namens $isle, und man macht unset($isle), auch die Session-Variable gelöscht wird.
Und was ich auch gerne gewusst hätte: Bei 1und1 ist die Funktion ini_set disabled, es wird aber ein völlig anderer (unsinniger) Fehler in der letzten Code-Zeile angezeigt.
C nervt mich mit den ständigen Speicherschutzverletzungen und dass es mit den Strings zumindest am Anfang doch schwierig wird.
Allerdings ist php bissle arg lässig, was Variablendefinitionen etc betrifft. Da könnte man mit Sicherheit noch einiges an Performance rausholen. Außerdem wäre es mit Sicherheit sinnvoll nicht bei jedem Aufruf sämmtliche Module zu laden, und einen eingebauten Opcode-Cache wäre auch nicht übel (soll es ja ab php 6.0 geben)
Hätt ich gewusst, das Webdeveloptment unter Java mit J2EE so elegant sein kann, hätt ich viel früher aufgehört mich mit php zu beschaeftigen.
Hätt ich gewusst, das Softwareentwicklung mit einer gemanagten Programmiersprache so viel einfacher und sauberer ist, dann hätt ich mir nie C / C++ angeguckt.
Mr.Maxx
Du weißt, dass Managed aus dem .Net-Sprachgebrauch kommt? ;-)
Aber ansonsten hast du scheinbar den gleichen Werdegang 'durchgemacht', wie ich. Ewig an C++ festgehalten, mal eine neue Programmiersprache probiert und gleich verliebt...
Wobei ich einen Hass auf Browser habe, egal welcher Art, ob IE, ob Firefox oder Opera....
Original von Drezil
... das der bug, den ich seit 3h versuche zu fixen nen bug in php und nicht im script ist .. also immer schön updaten ... *g*
Die drei Stunden kann ich toppen :roll:
Original von TheUndeadable
Von jmd anderem:
Für mich hat diese Vorarbeit etwa 1 Woche gekostet. Es wurde ein einfacher HTTP-Server auf Port 80 aufgebaut, der Cookies, Sessions, POST, GET und Keep-Alive unterstützt. Dieses Programm läuft in einem eigenen Thread und kann dementsprechend als Win32-Konsole oder Win32-GUI-Anwendung genutzt werden.
Linux und andere BS unterstützt mein Webserver nicht.
Als Datenbank habe ich MySQL direkt unterstützt (mysql C-API)
Die Portierung auf C# hat etwa 1 Tag gedauert und läuft nun unter .Net und Mono. Als Datenbank nutzte ich das ADO-Interface. Momentan ist das Projekt aber etwas vergraben (Hass auf HTML/CSS/IE)
Kannst du mir vielleicht mal einen Teil der Klassen zeigen, ich würde gerne wissen wie sowa auszusehen hat!?
Original von TheHawk
Design Pattern Buch? Gibts das auch als E-Book?
DrakeL meint vermutlich das Buch aus der Head Up First reihe. Im deutschen heißt das, glaube ich, Entwurfsmuster von Kopf bis Fuss. Wenn es das als eBook gibt, höchstens im Safari Book Shelve von O'Reilly und das ist gebührenpflichtig.
Darüber hinaus ist diese Buchreihe nichts, was man als eBook lesen sollte, da es ganz neue Formen der Wissenvermittlung einsetzt. Ist schwer zu beschreiben. man muss es sich einfach mal ansehen.
Ansonsten findest Du massig Entwurfsmuster Quellen im Netz. Gerade was die Gang of Four Pattern betrifft.
Nach ein paar Tagen unterhalte ich mich mit jemanden: "Warum nimmst du nicht einen Layout Manager?". Als ich dann im Internet gesucht habe, sind alte (2003?) Erinnerungen daran hochgekommen
...ich von Amazon neuerdings Bücher mit STRICKMUSTERN angeboten bekommen, seitdem ich nach Entwurfsmustern / Designpattern gesucht habe.
...die Box von Munchkin nicht umsonst so viele leere Fächer hat und jetzt Teil 5 zzgl. der Weihnachtsedition rausgekommen ist.
...man noch so viel Mühe in saubere Makefiles stecken kann, wenn man zum einen verpennt sich aufzuschreiben welche Version der Zusatzbibliotheken man verwendet hat und man weiterhin auch noch die Distribution wechselt.
...Microsoft einem keine Chance läßt bei .NET nachzukommen und die einzigsten welche was dabei verdienen, die Autoren sind, dann hätte ich auch schon ein Buch darüber geschrieben.
...ich so stolz darauf war endlich eine eigene Klasse zum laden von XML-Konfigurationen zu haben und man mit LINQ das ganze in 10 Zeilen mit allen meinen Features machen kann.
Hab ähnliche Bücher gelesen, und bis jetzt hat mir jedes was neues Verraten.
Need Links zu guten FAQs!
Original von Valerion
Das der einzige Fehler im Code ein "`" zu viel war^^
..oder eins zu wenig
.... dass es Sinn macht bevor man sich ein BG programmiert erst ein JavaScript Framework einzuarbeiten.
Ich 'hoffe', dass dies keine Spaltennamen sind...
Zum Topic:
Hätte ich gewusst, dass ich bei meiner momentanen Diplomarbeit unter Linux arbeiten muss, wäre ich dort nie angetreten ;-)
x-post & follow-up to gnews.flames
Original von Nuky
Wenn man Blind allen Regeln folgt, wird man nie auf neue Wege kommen.. und von aussen einfach nur irgendwas kritisieren (was man nicht ganz Verstehen kann, da man die Umgebung und den Sinn nicht kennt) zeigt für mich eigentlich nichts gutes
x-post & follow-up to gnews.flames
Ich flame nicht, sondern begründe es sogar: Gerade hier zeigt sich, das es über eine geeignete Relationswahl viel besser pflegbar ist, beispielweise: Auf einmal gibt es 10 "Ships", was dann? Wenn der Code (ey, völlig egal ob OOP oder nicht) darauf richtig abgestimmt ist, braucht man da entweder gar nichts oder nur wenig zu ändern. Gleichermaßen aber brechen sich die Regeln natürlich mit einigen Konstellationen.. aber i.d.R. ist das vertretbar oder eben ein Sonderfall.
Hart verdrahtete Relationen wie hier sind de facto nur selten gut; wobei es natürlich Ausnahmen geben kann, die sind dann aber auch gut begründet.
@topic (aktuell):
Wenn ich gewusst hätte, wie geil Eclipse/WTP mit Tomcat zusammenspielt, hätte ich mich viel eher dmit beschäftigt. Es spart nicht nur Arbeit, sondern auch Zeit..
Ich kenne Sayphillion von innen und von außen...
nun hab ich ein schönes Spiel und ein mittelmäßiges Lückenhaftes Design...
...php so schön einfach ist, sodass ich glaub ich nichts anderes ernsthaft erlernen werde (aber mal ne frage, performance probleme in php kenn ich nicht (kaum), das einzige war der Kampfscript, aber mit ein wenig mathe braucht der nun auch keine minuten (was in php mit einem limit von 30 Sekungen i wie zu problemem fürht) sondern nur noch Sekunden (wenn überhaupt)
wobei sich nun die fehlersuche als sehr sehr schwer erweist^^
na ja, zum testen des kampfscriptes (sim.zehnsur.de)
hatte vergessen in phpmyadmin meinem konto die berechtigung für "ALTER" zu geben.
Dummerweise kommt es aber dann beim Upgrade zu phpbb 3.0.1 zu einem fehler, welcher jedoch nicht angezeigt wird und mich damit ca 20 std meines Lebens gekostet hat...
www.phpbb.com/bugs/phpbb3/ticket.php?ticket_id=26325
for (var i = 0; i < object.childNodes.length; i++) {
bla();
}
auch Leerzeichen, Zeilenumbrüche und Text
als Kindknoten vom Typ undefined erkennt
und deshalb hässliche Warnings ausgibt.
Und das man das zum Beispiel mit
for (var i = 0; i < object.childNodes.length; i++) {
if (object.childNodes.nodeType == 1) {
bla();
}
}
ganz leicht umgehen kann.
Dann hätt ich mir gerade 2 Stunden Haare raufen und googlen erspart...
Hätte ich gewusst,
...das JSP-Tags so einfach zu schreiben sind
HTML:
wäre ich schon viel früher zur komponentenbasierten Entwicklung übergegangen...
...dass Progressive Enhancement direkt in den Tags durchgeführt werden kann
wäre ich schon viel früher zur komponentenbasierten Entwicklung übergegangen...
...dass man 50% der Entwicklungszeit für moderne Webseiten mit der Frage "Warum funzt das auf DEM EINEN(man weiss welcher) Browser nicht" beschäftigt ....
hätte ich "moderne standardkonforme Browser" beim Klienten vorausgesetzt
...wie sehr mir Mylyn(Eclipse Anbindung an Bugtracker) hilft,
hätte ich es von anfang benutzt
Also wer einen 36-poligen "Centronics"-Stecker braucht: bitte melden. ;-)
Bin bestimmt der einzige Depp der das bisher nicht wusste
... dass das PHP Script nach einem header('Location:...'); weiterläuft
Dass der Markt für professionelle Captcha-Löser schon so weit fortgeschritten ist..
http://www.freelance-projects.info/data-entry/need-captcha-entry-team-by-urigarin/
ca. 0.70-0.80$ / 1k captchas und es gibt Teams, die Kapazitäten bis 400k-1mio / Tag offerieren (die wollen dann aber 2-3$ / 1k captchas haben).
Ich denke das ist momentan eher ein Markt für Spammer, aber sofern Browsergames groß genug werden und ein Markt für Ingame Währung wächst (siehe WoW), wird das sicher auch professionelle Bots gepaart mit dergleichen Services anlocken.
... dass es doch einen CSS-Sprite-Generator gibt!
Original von Klaus
... dass es doch einen CSS-Sprite-Generator gibt!
Genial. Danke!
- If a method can be static, declare it static. Speed improvement is by a factor of 4.
- echo is faster than print.
- Use echo's multiple parameters instead of string concatenation.
- Set the maxvalue for your for-loops before and not in the loop.
- Unset your variables to free memory, especially large arrays.
- Avoid magic like __get, __set, __autoload
- require_once() is expensive
- Use full paths in includes and requires, less time spent on resolving the OS paths.
- If you need to find out the time when the script started executing, $_SERVER[REQUEST_TIME] is preferred to time()
- See if you can use strncasecmp, strpbrk and stripos instead of regex
- str_replace is faster than preg_replace, but strtr is faster than str_replace by a factor of 4
- If the function, such as string replacement function, accepts both arrays and single characters as arguments, and if your argument list is not too long, consider writing a few redundant replacement statements, passing one character at a time, instead of one line of code that accepts arrays as search and replace arguments.
- It's better to use switch statements than multi if, else if, statements.
- Error suppression with @ is very slow.
- Turn on apache's mod_deflate
- Close your database connections when you're done with them
- $row[id] is 7 times faster than $row[id]
- Error messages are expensive
- Do not use functions inside of for loop, such as for ($x=0; $x < count($array); $x) The count() function gets called each time.
- Incrementing a local variable in a method is the fastest. Nearly the same as calling a local variable in a function.
- Incrementing a global variable is 2 times slow than a local var.
- Incrementing an object property (eg. $this->prop++) is 3 times slower than a local variable.
- Incrementing an undefined local variable is 9-10 times slower than a pre-initialized one.
- Just declaring a global variable without using it in a function also slows things down (by about the same amount as incrementing a local var). PHP probably does a check to see if the global exists.
- Method invocation appears to be independent of the number of methods defined in the class because I added 10 more methods to the test class (before and after the test method) with no change in performance.
- Methods in derived classes run faster than ones defined in the base class.
- A function call with one parameter and an empty function body takes about the same time as doing 7-8 $localvar++ operations. A similar method call is of course about 15 $localvar++ operations.
- Surrounding your string by ' instead of " will make things interpret a little faster since php looks for variables inside "..." but not inside '...'. Of course you can only do this when you don't need to have variables in the string.
- When echoing strings it's faster to separate them by comma instead of dot. Note: This only works with echo, which is a function that can take several strings as arguments.
- A PHP script will be served at least 2-10 times slower than a static HTML page by Apache. Try to use more static HTML pages and fewer scripts.
- Your PHP scripts are recompiled every time unless the scripts are cached. Install a PHP caching product to typically increase performance by 25-100% by removing compile times.
- Cache as much as possible. Use memcached - memcached is a high-performance memory object caching system intended to speed up dynamic web applications by alleviating database load. OP code caches are useful so that your script does not have to be compiled on every request
- When working with strings and you need to check that the string is either of a certain length you'd understandably would want to use the strlen() function. This function is pretty quick since it's operation does not perform any calculation but merely return the already known length of a string available in the zval structure (internal C struct used to store variables in PHP). However because strlen() is a function it is still somewhat slow because the function call requires several operations such as lowercase & hashtable lookup followed by the execution of said function. In some instance you can improve the speed of your code by using an isset() trick.
Ex.
if (strlen($foo) < 5) { echo "Foo is too short"; }
vs.
if (!isset($foo{5})) { echo "Foo is too short"; }
Calling isset() happens to be faster then strlen() because unlike strlen(), isset() is a language construct and not a function meaning that it's execution does not require function lookups and lowercase. This means you have virtually no overhead on top of the actual code that determines the string's length. - When incrementing or decrementing the value of the variable $i++ happens to be a tad slower then ++$i. This is something PHP specific and does not apply to other languages, so don't go modifying your C or Java code thinking it'll suddenly become faster, it won't. ++$i happens to be faster in PHP because instead of 4 opcodes used for $i++ you only need 3. Post incrementation actually causes in the creation of a temporary var that is then incremented. While pre-incrementation increases the original value directly. This is one of the optimization that opcode optimized like Zend's PHP optimizer. It is a still a good idea to keep in mind since not all opcode optimizers perform this optimization and there are plenty of ISPs and servers running without an opcode optimizer.
- Not everything has to be OOP, often it is too much overhead, each method and object call consumes a lot of memory.
- Do not implement every data structure as a class, arrays are useful, too
- Don't split methods too much, think, which code you will really re-use
- You can always split the code of a method later, when needed
- Make use of the countless predefined functions
- If you have very time consuming functions in your code, consider writing them as C extensions
- Profile your code. A profiler shows you, which parts of your code consumes how many time. The Xdebug debugger already contains a profiler. Profiling shows you the bottlenecks in overview
- mod_gzip which is available as an Apache module compresses your data on the fly and can reduce the data to transfer up to 80%
- Excellent Article about optimizing php by John Lim
Quelle : http://reinholdweber.com/?p=3
Was soll man denn statt require_once() verwenden?
Original von Blabbo
Was soll man denn statt require_once() verwenden?
Ich denke mal, man meint damit include_once.. und zwar on-demand.
Require_once macht de facto nur Sinn, wenn du es - zb bei OOP - vor dem class-token verwendest.
require_once und include_once sind das gleiche. Man sollte stattdessen die Varianten ohne _once benutzen, da diese ohne zusätzliche Überprüfung, ob die Datei schon eingebunden wurde, natürlich schneller sind.
Im großen und ganzen fordern diese Tipps natürlich einen schönen Spaghetti-Code. Zwar hat der Optimierer von PHP hier versagt, doch wer auf Performance-Jagd ist, sollte sich sowieso von Skriptsprachen abwenden.
17. $row[id] is 7 times faster than $row[id]
Das ist auf jeden Fall mein Favorit.
18. Error messages are expensive
Und deshalb verzichtet der gute Programmierer drauf? Haha!
20. Incrementing a local variable in a method is the fastest. Nearly the same as calling a local variable in a function.
21. Incrementing a global variable is 2 times slow than a local var.
Das ist auch toll. Performance ist nun also der Grund keine globalen Variablen zu benutzen. Wie waere es damit die gar nicht zu benutzen, wenn man sie nicht braucht?
3. Use echo's multiple parameters instead of string concatenation.
29. When echoing strings it's faster to separate them by comma instead of dot. Note: This only works with echo, which is a function that can take several strings as arguments.
Paar Argumente schinden indem man sie mehrfach auflistet?
15. Turn on apache's mod_deflate
42. mod_gzip which is available as an Apache module compresses your data on the fly and can reduce the data to transfer up to 80%
Das mit den doppelten Argumenten hat ja vorher auch funktioniert, wieso nicht fuer Apache 1 und 2 je einen Punkt?
Sind sicher noch mehr Kloepse drin, die oberen haben mir gereicht... einige Dinge sind sicher sinnvoll, aber so etwas unreflektiert hinnehmen ist das schlimmste, was man tun kann. Stimme Klaus da im Grossen und Ganzen zu. Ein paar der Punkte in der Auflistung sind aber schon sinnvoll und gehoeren imho zu gutem Programmierstil.
Original von Klaus
require_once und include_once sind das gleiche. Man sollte stattdessen die Varianten ohne _once benutzen, da diese ohne zusätzliche Überprüfung, ob die Datei schon eingebunden wurde, natürlich schneller sind.
Im großen und ganzen fordern diese Tipps natürlich einen schönen Spaghetti-Code. Zwar hat der Optimierer von PHP hier versagt, doch wer auf Performance-Jagd ist, sollte sich sowieso von Skriptsprachen abwenden.
Fast.. require wird unmittelbar eingefügt, include nur konditional. Deswegen wie bereits erwähnt: require hat seinen Sinn, wenn es in Abschnitten vorkommt, die nicht konditional sind (Schleifen, Funktionen, Methoden, Bedingungen) - include wiederum wird tatsächlich nur dann eingefügt, wenn es zur Ausführung kommt. Dementsprechend kann man auch die Wichtigkeit einschätzen: Dateien, die per require eingebunden werden, sind essentiell wichtig (bswp. die abgeleitete Klasse), das Include wiederum führt nur dazu, dass der eine Codeabschnitt fehlerhaft ist.. und eben nicht die ganze Datei. Ob die ganze Klasse damit kaputt geht, ist davon unabhängig.
http://de.php.net/manual/de/function.include.php
The documentation below also applies to require(). The two constructs are identical in every way except how they handle failure. They both produce a Warning, but require() results in a Fatal Error. [...]
Oder als Quellcode:
php-5.2.8.tar\php-5.2.8\Zend\zend_vm_def.h: Zeile 2849
C++:
switch (Z_LVAL(opline->op2.u.constant)) {
case ZEND_INCLUDE_ONCE:
case ZEND_REQUIRE_ONCE: {
zend_file_handle file_handle;
if (IS_ABSOLUTE_PATH(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename))) {
cwd_state state;
state.cwd_length = 0;
state.cwd = malloc(1);
state.cwd[0] = 0;
failure_retval = (!virtual_file_ex(&state, Z_STRVAL_P(inc_filename), NULL, 1) &&
zend_hash_exists(&EG(included_files), state.cwd, state.cwd_length+1));
free(state.cwd);
}
if (failure_retval) {
/* do nothing */
} else if (SUCCESS == zend_stream_open(Z_STRVAL_P(inc_filename), &file_handle TSRMLS_CC)) {
if (!file_handle.opened_path) {
file_handle.opened_path = estrndup(Z_STRVAL_P(inc_filename), Z_STRLEN_P(inc_filename));
}
if (zend_hash_add_empty_element(&EG(included_files), file_handle.opened_path, strlen(file_handle.opened_path)+1)==SUCCESS) {
new_op_array = zend_compile_file(&file_handle, (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE?ZEND_INCLUDE:ZEND_REQUIRE) TSRMLS_CC);
zend_destroy_file_handle(&file_handle TSRMLS_CC);
} else {
zend_file_handle_dtor(&file_handle);
failure_retval=1;
}
} else {
if (Z_LVAL(opline->op2.u.constant)==ZEND_INCLUDE_ONCE) {
zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, Z_STRVAL_P(inc_filename));
} else {
zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, Z_STRVAL_P(inc_filename));
}
}
}
break;
case ZEND_INCLUDE:
case ZEND_REQUIRE:
new_op_array = compile_filename(Z_LVAL(opline->op2.u.constant), inc_filename TSRMLS_CC);
break;
Dann wüsste ich aber 'mal gerne, wieso der CodeSniffer darauf so einen Wert legt..
edit: Tatsache ist aber, das require nen Fatal liefert, und include ne Warning. Damit ist man ja eigentlich wieder bei essentiell und nicht-essentiell.
Dank der Unterscheidung, die man auch wesentlich eleganter hinbekommen hätte:
else if (type==ZEND_REQUIRE) {
va_end(files);
EG(active_op_array) = orig_op_array;
EG(return_value_ptr_ptr) = orig_retval_ptr_ptr;
return FAILURE;
In einer völlig abwegigen Datei: zend.c
C++:
ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int file_count, ...)
{
va_list files;
int i;
zend_file_handle *file_handle;
zend_op_array *orig_op_array = EG(active_op_array);
zval **orig_retval_ptr_ptr = EG(return_value_ptr_ptr);
zval *local_retval=NULL; va_start(files, file_count);
for (i=0; i file_handle = va_arg(files, zend_file_handle *);
if (!file_handle) {
continue;
}
EG(active_op_array) = zend_compile_file(file_handle, type TSRMLS_CC);
if(file_handle->opened_path) {
int dummy=1;
zend_hash_add(&EG(included_files), file_handle->opened_path, strlen(file_handle->opened_path)+1, (void *)&dummy, sizeof(int), NULL);
}
zend_destroy_file_handle(file_handle TSRMLS_CC);
if (EG(active_op_array)) {
EG(return_value_ptr_ptr) = retval ? retval : &local_retval;
zend_execute(EG(active_op_array) TSRMLS_CC);
if (EG(exception)) {
if (EG(user_exception_handler)) {
zval *orig_user_exception_handler;
zval ***params, *retval2, *old_exception;
params = (zval ***)emalloc(sizeof(zval **));
old_exception = EG(exception);
EG(exception) = NULL;
params[0] = &old_exception;
orig_user_exception_handler = EG(user_exception_handler);
if (call_user_function_ex(CG(function_table), NULL, orig_user_exception_handler, &retval2, 1, params, 1, NULL TSRMLS_CC) == SUCCESS) {
if (retval2 != NULL) {
zval_ptr_dtor(&retval2);
}
} else {
if (!EG(exception)) {
EG(exception) = old_exception;
}
zend_exception_error(EG(exception) TSRMLS_CC);
}
efree(params);
zval_ptr_dtor(&old_exception);
if (EG(exception)) {
zval_ptr_dtor(&EG(exception));
EG(exception) = NULL;
}
} else {
zend_exception_error(EG(exception) TSRMLS_CC);
}
if (retval == NULL && *EG(return_value_ptr_ptr) != NULL) {
zval_ptr_dtor(EG(return_value_ptr_ptr));
local_retval = NULL;
}
} else if (!retval && *EG(return_value_ptr_ptr)) {
zval_ptr_dtor(EG(return_value_ptr_ptr));
local_retval = NULL;
}
destroy_op_array(EG(active_op_array) TSRMLS_CC);
efree(EG(active_op_array));
} else if (type==ZEND_REQUIRE) {
va_end(files);
EG(active_op_array) = orig_op_array;
EG(return_value_ptr_ptr) = orig_retval_ptr_ptr;
return FAILURE;
}
}
va_end(files);
EG(active_op_array) = orig_op_array;
EG(return_value_ptr_ptr) = orig_retval_ptr_ptr; return SUCCESS;
}
Für Nichtprogrammierer:
Die Funktion execute_script überprüft, ob die aufrufende(!) Funktion von 'INCLUDE' stammt. Ist dies der Fall, so wird hart die Funktion beendet.
Ansonsten wird ein Fehler ignoriert.
Eleganz, wie sie nur bei PHP auftritt. Von der Art und Weise der Kommentierung in dieser Funktion abgesehen.
Original von TheUndeadable
C++:
Um mal meine Lieblingssprache in Schutz zu nehmen, dass was Du uns da zeigst ist C
> Um mal meine Lieblingssprache in Schutz zu nehmen, dass was Du uns da zeigst ist C
Yep.
Nur bot mir dieser GN-Editor kein C an...
3. Use echo's multiple parameters instead of string concatenation.
29. When echoing strings it's faster to separate them by comma instead of dot. Note: This only works with echo, which is a function that can take several strings as arguments.
Das ist auch totaler Humbug. Ich geb zu, ich wusste nicht dass ich echo mit mehreren Parametern aufrufen kann. Und man sollte es auch sofort vergessen. Ich habe mir dafür einen kleinen Benchmark geschrieben. Der ist sicherlich aufgrund des eingeschränkten Testszenarios nicht allgemein gültig, aber für mich kam dabei raus, dass diese Variante mit Abstand die langsamste ist. Folgende Szenarien habe ich verglichen. Die Zeitangaben sind arithmetische Mittelwerte (Um Extremwerte bereinigt) mehrfacher Messungen, jeweils in Schleifen zu 1.000 Durchläufen:
Variante a)
echo 'Ich bin ein '.$berliner;
arithmetisches Mittel: 0,0008753
Variante b)
echo "Ich bin ein $berliner";
arithmetisches Mittel: 0,0490600; Etwa 56 mal langsamer als Variante a)
Variante c)
echo 'Ich bin ein', $berliner;
arithmetisches Mittel: 0,1547823; Etwa 176 mal (!!) langsamer als Variante a)
Das ganze lief unter PHP Version 5.2.0, vielleicht hat ja jemand Lust, die Ergebnisse durch einen Benchmark zu bestätigen oder zu widerlegen...
Original von MarcusSchwarz
Das ganze lief unter PHP Version 5.2.0, vielleicht hat ja jemand Lust, die Ergebnisse durch einen Benchmark zu bestätigen oder zu widerlegen...
/confirmed
jedoch mit einschränkungen (php 5.2.4)
----------------------------------------------------------------
zb bei 10000 durchläufen
0.78562 => 0.818375 => 0.893767
----------------------------------------------------------------
ab 100000 spinnen die werte total (überhaupt keine konstanz)
( Also erstmal dieser Editor hier ist richtig scheiße! )
Die Liste ist schon ganz brauchbar,
aber ich versteh immer nicht warum jemand in seinem Blog postet,
ohne das mal Korrektur zu lesen.
Doppelte Einträge, offensichtliche Fehler... was solls.
Ich hab da auch noch was zum Thema.
Rasmus Lerdorfs Simple Guidelines for PHP Programming:
o Try to limit yourself to 5 or less includes per request
o Dont go overboard on OOP. Use where appropriate.
o Same goes for Layers. Abstraction, Indirection, abstract classes.
o Everything has a cost
o Use an opcode cache
o Watch your regular expressions!
o Cache! Cache! Cache!
o If you have plenty of CPU but limited bandwidth, turn on output compression
Okay Punkt 1 kann man in größeren Projekten kaum umsetzen.
Aber da ist schon was dran.
Selbst mit opcode cache können zu viele includes bremsen.
Besonders mit opcode cache, require_once und falschem include_path.
Die Regeln sind zum größtenteil absolut bedeutungslos und viele sollten definitiv nicht beachtet werden:
Geschwindigkeit erreicht man durch die richtige Wahl seiner Algorithmen&Datenstrukturen, nicht dadurch ob man nun print oder echo verwendet.
Manche der Regeln führen sogar zu imho schlechten Code-Design, z.B
- Don't split methods too much, think, which code you will really re-use
- You can always split the code of a method later, when needed
- Error messages are expensive
- ...
Hier zeigt sichs doch deutlich, dass der Autor völlig absurde Ansichten über Codedesign besitzt. Funktionen sollten nicht (nur) der Wiederverwendbarkeithakber verwendet werden, sondern vorallem der besseren Lesbarkeit&Wartbarkeit des Codes. Schreib ich lieber 1 Funktion mit 250 Zeilen und mehr als x Einrückungen oder pack den eigtl hauptkriegsschauplatz in 50 Zeilen in die Funktion und die Nebenkriegschauplätze in 10 Funktionen a 20 Zeilen mit einer guten Namensgebung?
Ich glaube über die Fehlermeldungen müssen wir nicht wirklich reden? Wieviel Performance wollt ihr im Frontend einsparen wollen, dass es die Hilfe bei der Fehlersuche bzw. dem Nutzen für den User wettmacht?
Und das wichtigste: Die Grundregel des Optimierens: Optimiere die 10% des Codes die für 90% der Laufzeit verantwortlich sind und nichts anders :)
Original von Amun Ra
o Try to limit yourself to 5 or less includes per request
Okay Punkt 1 kann man in größeren Projekten kaum umsetzen.
Aber da ist schon was dran.
Das ist richtig, aber man sollte immer prüfen, ob ein include wirklich nötig ist. Hierzu ein Erfahrungswert aus der Anfangszeit von Wurzelimperium: Ein include, welcher der Bequemlichkeit wegen eingebunden wurde (eine Funktionsdatei), war in einem bestimmten Script unnötig. Dieses Script war zugleich mit über 4 Mio Requests das mit Abstand am stärksten frequentierte Script. Ohne Opcode-Cache bedeutete das gut 90 Minuten Laufzeit. Der Server war also 90 Minuten am Tag damit beschäftigt eine Datei zu öffnen, zu lesen und wieder zu schließen, die er gar nicht brauchte.
Vielleicht sollte man daher die Regel anpassen: Prüfe, ob du wirklich einen include benötigst und versuche, die Gesamtzahl der includes so gering wie möglich zu halten.
Nur 5 includes ... schafft ihr das?
Ich glaub ich brauch im moment bei einem Projekt locker 15 pro Aufruf :(
Du schreibst alles in eine Datei und springst dann mit goto zur jeweiligen Stelle. Das ist hammerschnell!
BTW: Wer weiß wie lange diese Liste schon durch das Internet schwirrt. Wahrscheinlich wurden da noch mit PHP3 Benchmarks betrieben.
Original von Blabbo
Nur 5 includes ... schafft ihr das?
Ich glaub ich brauch im moment bei einem Projekt locker 15 pro Aufruf :(
Arg.. kennt ihr das auch? Man hat ein Bild von einer Webseite vor Augen, die man mal gesehen hat.. aber man findet sie einfach nicht wieder.. da mich das jetzt wachgehalten hat, hab ich laaaange gesucht :)
http://phpimpact.wordpress.com/2008/08/04/php-applications-where-is-the-include-coming-from/ Das zum Thema FÜNF Includes :)
die zahl max 5 includes ist genauso ein blödsinn wie die zahl max 20 db querys.
man sollte lieber anständigen wartbaren code schreiben, als obskure performancetricks anzuwenden
Ja sicher ist das ab einer gewissen Komplexität nicht mehr einzuhalten,
aber ich finde die angepasste Regel von MarcusSchwarz ganz treffend:
"Vielleicht sollte man daher die Regel anpassen:
Prüfe, ob du wirklich einen include benötigst und versuche,
die Gesamtzahl der includes so gering wie möglich zu halten."
Hört sich in meinen Ohren vernünftig an...
Aber einen Include machst du doch eh "on demand" (include_once). Oder nicht? Alternativ autoload, dann muss man die Komplexität der autoload-Funktion (bzw. Objektmethode) "gegenrechnen".
Dazu gibt es auch noch einen Benchmark anhand des ZF: http://www.whitewashing.de/blog/articles/73