Hier im Forum bekommt ihr bei euren fragen schnelle hilfe.Hier geht es rund um das Web SeitenProgrammieren.Alles rund ums Javascript,Html,Php,Css und Sql.Auf fast allen Fragen haben wir eine Antwort.
Der Soforthilfe-chat verspricht das ,was sein Name sagt. Hier sind Leute Online die sofort ihre hilfe anbieten.Seht in der OnlineListe nach und wenn einer Online ist werdet ihr auch antwort bekommen. Admine ,Moderatoren und Helfer sind unsere Spezialisten in Sachen Web Programierung

Sie sind hier : basti1012.de/ kreuz-und-quer / index.php

Random Themen, Tutorials und co

24.09.2019 21:36:29

Die ganze Wahrheit über Client-Caches

Caches nennt man im Entwicklungsumfeld jene Systeme, die eine Zwischenspeicherung von Daten zwecks schnellerem Abruf anlegen. Viele Entwickler glauben allerdings, dass Caches etwas Böses sind, da sie dem Webmaster die Kontrolle über die Site entziehen und stattdessen ältere Inhalte ausliefern. Das ist auch wahr, allerdings nur, wenn man dem Cache nicht sagt, wer die Zügel in der Hand und was er zu tun hat. Dieser Beitrag soll zeigen, was wirklich hinter Caches auf der Client-Seite (Proxy- und Browser-Cache) steckt.

Erstmal möchte ich aufzeigen, wie ein Cache überhaupt arbeitet. Alle Caches folgen bestimmten Regeln:

  • Wenn die Response-Header dem Cache sagen, dass er die Seite nicht cachen soll, wird er es auch nicht tun
  • Seiten hinter einer htaccess-Autentifizierung oder einer SSL-Verschlüsselung werden grundsätzlich nicht gecacht
  • Wenn keine Validierung im Antwort-Header vorliegt(ein ETag oder Last-Modified-Header), und zusätzlich keine Information über die Aktualität gegeben wurde, wird die Seite als nicht cache-fähig angesehen
  • Eine gecachte Version wird als aktuell angesehen, wenn
    • sie eine Ablaufzeit (Expiration date) oder eine andere alterskontrollierende Angabe hat und diese Angabe noch nicht abgelaufen ist oder
    • Wenn der Browser bereits eine Version in dieser Session gespeichert hat und in den Browser-Einstellungen festgelegt ist, dass pro Session die Datei nur ein mal geladen werden soll oder
    • wenn vom Proxy-Server die Seite vor kurzem angefragt wurde und das letzte Änderungsdatum der Datei relativ weit zurück liegt.

    In diesen Fällen wird die angeforderte Datei direkt aus dem Cache geladen, ohne den Server zu kontaktieren.

  • Wenn die Datei im Cache schon relativ alt ist, wird beim Server angefragt, ob es sich dabei noch um die aktuelle Datei handelt.

Aktualität und Validierung sind also die Grundpfeiler eines jeden Caches. Eine aktuelle Version einer Datei kann sofort, ohne viel Aufwand geladen werden, während eine gültige Version dazu führt, dass nicht die gesamt Datei erneut geladen werden muss, wenn sich nichts geändert hat.

Wenn wir wissen, wie er arbeitet, müssen wir nur noch wissen, wie wir als Webmaster die Kontrolle über diese Arbeit erlangen.
Zuerst sind da die Meta-Tags zu erwähnen. Viele Entwickler packen dann einfach einen Mata-Tag in ihre Seite und denken ihre Seite sei nun „uncacheable“, aber das ist nicht der Fall. Meta-Tags sind in dieser Beziehung (wie mittlerweile in vielen anderen auch) uneffektiv. Der Grund dafür ist, dass nur einige Browser-Caches den HTML-Code wirklich lesen, ein Proxy-Cache schaut sich lediglich den Response-Header an, der Quelltext ist ihm egal.

Wir sehen also, dass wir mit den HTTP-Headern arbeiten müssen, um sowohl Proxy- als auch Browser-Caches effektiv zu erreichen. Diese Header werden normalerweise automatisch vom Webserver generiert, können aber bis zu einem bestimmten Grad auch von der Anwendung selbst bearbeitet werden.

Bevor ich auf die unterschiedlichen Header-Parameter zur Cache-Steuerung eingehe, möchte ich hier kurz noch erwähnen, wie mit PHP der Header bearbeitet wird: Vor allen Ausgaben kann man mit der Funktion header() die gewünschte Eigenschaft setzen. Als Beispiel:

header("Last-Modified: Fri, 25 May 2007 02:28:12 GMT ");

Oft sieht man in Anwendungen den Pragma HTTP-Header, um Caching zu verhindern. Pragma: no-cache wird in den HTTP-Header-Spezifikationen allerdings nicht als Antwort-Header vorgesehen. Lediglich als Request-Header ist er dort aufgeführt. Es kann sein, dass ihn manche Caches beachten, aber die meisten werden es nicht tun.

Um die Zeit einzustellen, wann die Seite nicht mehr aktuell ist und neu geladen werden muss, ist Expires die richtige Einstellung. Ich kann die Nutzung allerdings nicht unbedingt empfehlen, da ein exakter, absoluter Zeitpunkt, wann eine Datei abläuft oft schwierig festzulegen ist, als zusätzliche Angabe zu den weiter unten stehenden ist er aber allemal geeignet, zumal er bereits in HTTP 1.0 enthalten ist.

header("Last-Modified: " . gmdate("D, d M Y H:i:s",time() . " GMT");

Komfortabler sind aber relative Angaben wie die in Cache-Control:

  • max-age=[seconds] — definiert die maximale Anzahl von Sekunden ab „jetzt“ (Zeitpunkt der Auslieferung), die die Datei als aktuell angesehen wird. Ähnlich wie Expires, aber eben mit relativer Zeitangabe.
  • s-maxage=[seconds] — ähnlich wie max-age, bezieht sich aber nur auf geteilte (shared) caches (z.B. Proxy)
  • public — kennzeichnet Seiten als cache-fähig, wenn sie sich hinter einem geschützten Bereich befinden. Normalerweise sind Seiten, auf die nur mittels HTTP-Autentifizierung zugegriffen werden kann, „uncacheable“.
  • no-cache — zwingt den Cache bei jeder Anfrage zuerst zwecks Validierung auf dem Server nachzufragen, bevor die gecachte Version ausgeliefert wird. Nützlich ist das beispielsweise, wenn public gesetzt ist, und trotzdem geprüft werden soll, ob die Autentifizierung noch gültig ist.
  • no-store — sagt dem Cache, dass er auf keinen Fall eine Kopie der Datei speichert
  • must-revalidate — sagt dem Cache, dass er jegliche Aktualitätsinformation, die mit dem Header mitkommt, beachtet werden muss. HTTP erlaubt es unter bestimmten Bedingungen auch ältere Dateien auszuliefern; wenn dieser Parameter gesetzt ist, muss immer mit dem Server validiert werden, ob es sich um die aktuelle Version im Cache handelt.
  • proxy-revalidate — ähnlich wie must-revalidate, aber nur für Proxys

Wenn man also zum Beispiel angeben möchte, dass eine Seite eine Stunde lang gecacht und dieser Zeitpunkt stets beachtet werden, schreibt man also:

header("Cache-Control: max-age=3600, must-revalidate");

Zusätzlich zu den oben gemachten Angaben gibt es seit HTTP 1.1 auch das ETag. Dieses wird automatisch vom Server generiert und ändert sich jedes Mal, wenn die lokale Version abgelaufen ist. Mithilfe dieses Tags kann man in der Anwendung prüfen, ob eine lokale Version der Datei bereit vorliegt, die aktuell ist. Wenn sie nämlich aktuell ist, ist die Variable $_SERVER[‚HTTP_IF_MODIFIED_SINCE‘] gesetzt. Eine geeignete Anwendung sieht dann so aus:

if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {   header("HTTP/1.0 304 Not Modified");   exit; }

Bei statischen Dateien werden diese Header automatisch genutzt, ohne dass man auf dem Server irgendetwas tun muss.

Im Internet findet man viele weitere Informationen, wie man seine Seiten cache-aware programmieren kann, wenn man das möchte (also dass nicht die gecachte Version genutzt wird). Ich hoffe aber, dass ich geholfen habe, die Angst vor Caches zu verlieren und sie als mächtiges Performance-Instrument anzusehen.

php

24.09.2019 21:36:44

Performance einzelner Code-Blöcke ermitteln

Wenn eine große PHP-Anwendung vorliegt und man messen möchte, welche Abschnitte des Scriptes die meiste Zeit in Anspruch nehmen, kann man dies durch einen PHP Profiler recht komfortabel ermitteln. Oft schachteln Programmierer mehrere Schleifen ineinander, weil sie denken, dass das für diese Aufgabe der beste Weg sei. Solchen Gefährten muss ab und zu mal aufgezeigt werden, wieviel Performance dadurch wirklich verlorengeht. Außerdem ist ein Profiler ein tolles Werkzeug, um zu ermitteln, ob eine kleine Änderung, die sie im PHP Performance Blog gelesen haben, wirklich so eine große Auswirkung hat ????

Voraussetzung ist nur die Profiler-Klasse und folgender Quellcode.

require("lib/class_Profiler.php"); $timer = new Profiler;   // Starten des Profiling $timer->start();   // Hier sind Ihre Funktionen ...   // Stop des Profiling $timer->stop(); // Darstellen der Informationen $timer->showtime();

So könnte man die Gesamtausführungszeit des Scriptes ermitteln.
Um aber einzelne Codeabschnitte zu vergleichen bzw die Abschnitte zu finden, die am meisten Zeit verschlingen, kann man zusätzlich noch Messpunkte setzen, um die Zeit an diesem Punkt aufzunehmen.

require("lib/class_Profiler.php"); $timer = new Profiler; $timer->start();   $array = array(); for($i = 0; $i < 1000; $i++) {         $array[] = $i; }   // Neue Messmarke $timer->addMarker("Ende des Array-Fuellens");   $comma_separated = implode(",", $array);   // Neue Messmarke $timer->addMarker("Aufsplitten des Arrays in einen string");   // Stop des Profiling $timer->stop(); // Darstellen der Informationen $timer->debug();   // Ausgabe der Gesamtzeit der Skriptausführung echo "<p>"; echo("<b>" . basename($_SERVER['PHP_SELF']) ."</b> hat insgesamt "); $timer->showtime(); echo(" Sekunden zur Ausführung gebraucht."); echo "</p>";

Damit wird für jeden Messpunkt die Dauer angezeigt und man kann komfortabel feststellen, an welcher Stelle das Script schlecht arbeitet. Das Ergebnis sieht dann ungefähr sop aus:

Messpunkt Zeit (Timestamp) Unterschied
Start 1176833501.20063000
Ende des Array-Fuellens 1176833501.20533600 0.004706 Sek.
Aufsplitten des Arrays in einen string 1176833501.20951500 0.004179 Sek.
Stop 1176833501.20953500 0.000020 Sek.

class_Profiler_example.php hat insgesamt 0.008905 Sekunden zur Ausführung gebraucht.

Für die Analyse eines unperformanten Scripts ein sehr wichtiges Tool.

php

24.09.2019 04:06:03

Composer, Satis, Satisfy: Fremdbibliotheken von Composer, Packagist und Github entkoppeln

+%09%09%3Cp%3EIn+der+heutigen+Webentwicklung+m%26%23252%3Bssen+wir+das+Rad+nicht+st%26%23228%3Bndig+neu+erfinden.+Es+gibt+eine+Vielzahl+von+Bibliotheken+%26%238211%3B+sowohl+server-+als+auch+clientseitig+%26%238211%3B+die+einem+das+Entwicklerleben+vereinfachen.+Damit+wir+aber+nicht+bei+s%26%23228%3Bmtlichen+Fremdbibliotheken+regelm%26%23228%3B%26%23223%3Big+nachpr%26%23252%3Bfen+m%26%23252%3Bssen%2C+ob+es+eine+neue+Version+gibt%2C+gibt+es+Paketverwaltungen.+Im+PHP-Bereich+ist+%3Ca+href%3D%22https%3A%2F%2Fgetcomposer.org%2F%22%3EComposer%3C%2Fa%3E+der+Quasi-Standard+f%26%23252%3Br+diese+Aufgabe.%3Cbr+%2F%3E+Dieser+Beitrag+beschreibt%2C+wie+wir+mit+Composer+komfortabel+%28%3D+inkl.+%3Ca+href%3D%22https%3A%2F%2Fgetcomposer.org%2Fdoc%2Farticles%2Fversions.md%22%3EVersion+Constraints%3C%2Fa%3E%29+auch+Bibliotheken+einbinden+k%26%23246%3Bnnen%2C+die%3A%3C%2Fp%3E+%3Cul%3E+%3Cli%3Enicht+auf+Packagist+zu+finden+sind+%28z.B.+private+Bibliotheken%29+und+%2F+oder%3C%2Fli%3E+%3Cli%3Ekeine+composer.json+haben+oder+in+fr%26%23252%3Bheren+Versionen+nicht+hatten%3C%2Fli%3E+%3C%2Ful%3E+%3Cp%3E%3Cspan+id%3D%22more-1416%22%3E%3C%2Fspan%3E%3C%2Fp%3E+%3Cp%3EDie+meisten+PHP-Bibliotheken+sind+bei+%3Ca+href%3D%22https%3A%2F%2Fpackagist.org%2F%22%3EPackagist%3C%2Fa%3E+%28dem+Standard-Repository+von+Composer%29+gelistet+und+k%26%23246%3Bnnen+dadurch+ohne+weitere+Einstellungen+in+der+composer.json+%3Ca+href%3D%22https%3A%2F%2Fgetcomposer.org%2Fdoc%2F01-basic-usage.md%23the-require-key%22%3Eunter+%26%238222%3Brequire%26%238220%3B+angegeben+werden%3C%2Fa%3E.%3C%2Fp%3E+%3Cp%3EBei+Bibliotheken%2C+die+nicht+bei+Packagist+gelistet+sind%2C+m%26%23252%3Bssen+wir+Composer+mitteilen%2C+wo+es+die+Pakete+finden+kann%3A+Wir+m%26%23252%3Bssen+die+Repositorys+selbst+definieren.%3Cbr+%2F%3E+F%26%23252%3Br+die+Einbindung+%26%23252%3Bber+Github+haben+wir+dann+z.B.+viele+Bl%26%23246%3Bcke+wie+z.B.+folgenden%3A%3C%2Fp%3E++%3Cdiv+class%3D%22wp_syntax%22+style%3D%22position%3Arelative%3B%22%3E%3Ctable%3E%3Ctr%3E%3Ctd+class%3D%22code%22%3E%3Cpre+class%3D%22javascript%22+style%3D%22font-family%3Amonospace%3B%22%3E%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Brepositories%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%2391%3B%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Btype%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bpackage%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bpackage%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bname%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bsciactive%2Fpnotify%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bversion%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3B2.0.0%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bsource%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Burl%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bhttps%3A%2F%2Fgithub.com%2Fsciactive%2Fpnotify%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Btype%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bgit%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Breference%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bv2.0.0%26quot%3B%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E+++++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%2393%3B%3C%2Fspan%3E%3C%2Fpre%3E%3C%2Ftd%3E%3C%2Ftr%3E%3C%2Ftable%3E%3Cp+class%3D%22theCode%22+style%3D%22display%3Anone%3B%22%3E%26quot%3Brepositories%26quot%3B%3A+%5B++++++%7B++++++++%26quot%3Btype%26quot%3B%3A+%26quot%3Bpackage%26quot%3B%2C++++++++%26quot%3Bpackage%26quot%3B%3A+%7B++++++++++%26quot%3Bname%26quot%3B%3A+%26quot%3Bsciactive%2Fpnotify%26quot%3B%2C++++++++++%26quot%3Bversion%26quot%3B%3A+%26quot%3B2.0.0%26quot%3B%2C++++++++++%26quot%3Bsource%26quot%3B%3A+%7B++++++++++++%26quot%3Burl%26quot%3B%3A+%26quot%3Bhttps%3A%2F%2Fgithub.com%2Fsciactive%2Fpnotify%26quot%3B%2C++++++++++++%26quot%3Btype%26quot%3B%3A+%26quot%3Bgit%26quot%3B%2C++++++++++++%26quot%3Breference%26quot%3B%3A+%26quot%3Bv2.0.0%26quot%3B++++++++++%7D++++++++%7D++++++%7D++%5D%3C%2Fp%3E%3C%2Fdiv%3E++%3Cp%3EDie+hier+angegebene+Versionsnummer+2.0.0+basiert+auf+den+%3Ca+href%3D%22https%3A%2F%2Fgithub.com%2Fsciactive%2Fpnotify%2Ftags%22%3EGit-Tags%3C%2Fa%3E+der+Bibliothek.%3C%2Fp%3E+%3Cp%3EDas+Problem+ist%2C+dass+wir+die+Version+fest+definiert+haben.+Composer+w%26%23252%3Brde+uns+immer+nur+genau+diese+Version+liefern.+Wir+m%26%23252%3Bssten+uns+demzufolge+selbst+darum+k%26%23252%3Bmmern%2C+zu+gucken%2C+ob+es+eine+neue+Version+der+Bibliothek+gibt+und+dann+das+Composer-Repository+ggf.+anpassen.+Viel+sch%26%23246%3Bner+w%26%23228%3Bre+es+ja+aber%2C+wenn+man+Bugfix-Releases+%28und+manchmal+auch+Minor-Releases%29+automatisch+beim+%3Ca+href%3D%22https%3A%2F%2Fgetcomposer.org%2Fdoc%2F03-cli.md%23update%22%3EComposer+Update%3C%2Fa%3E+bek%26%23228%3Bme.%3Cbr+%2F%3E+Leider+kann+man+bei+der+Definition+der+Composer-Repositorys+aber+die+Version+nicht+durch+ein+Sternchen+setzen%2C+sondern+dort+wird+immer+ein+existierendes+Tag+%28oder+ein+Branch+oder+Commit%29+erwartet.%3C%2Fp%3E+%3Cp%3EUnd+hier+kommt+%3Ca+href%3D%22https%3A%2F%2Fgithub.com%2Fcomposer%2Fsatis%22%3ESatis%3C%2Fa%3E+ins+Spiel.+Satis+stellt+ein+Composer-Repository+zur+Verf%26%23252%3Bgung%2C+%26%23228%3Bhnlich+wie+Packagist%2C+mit+dem+Unterschied%2C+dass+es+auf+unseren+Servern+l%26%23228%3Buft+und+wir+selbst+bestimmen+k%26%23246%3Bnnen%2C+welche+Bibliotheken+darin+enthalten+sein+sollen+%28und+welche+Versionen%29.%3Cbr+%2F%3E+Satis+hat+dadurch+einige+Vorteile%3A%3C%2Fp%3E+%3Cul%3E+%3Cli%3EEinbindung+von+nicht+%26%23246%3Bffentlichen+Repositorys%3C%2Fli%3E+%3Cli%3EEinbindung+von+Bibliotheken%2C+die+nicht+bei+Packagist+gelistet+sind%3C%2Fli%3E+%3Cli%3ENutzung+von+Bibliotheken%2C+die+keine+Composer.json+haben+%28mit+%3Ca+href%3D%22https%3A%2F%2Fgithub.com%2FFitchLearning%2Fsatisfy%22%3ESatisfy%3C%2Fa%3E%2C+dazu+weiter+unten+mehr%29%3C%2Fli%3E+%3Cli%3EUnabh%26%23228%3Bngigkeit+von+Github+und+Packagist+w%26%23228%3Bhrend+des+Builds+%28falls+diese+Seiten+mal+offline+sind+oder+man+selbst+kein+Internet+hat%29%3C%2Fli%3E+%3C%2Ful%3E+%3Cp%3EUm+Satis+einzurichten+m%26%23252%3Bssen+wir+zuerst+Satis+als+eigenes+Composer-Projekt+herunterladen%3A%3Cbr+%2F%3E+%3Cpre%3Ephp+composer.phar+create-project+composer%2Fsatis+--stability%3Ddev%3C%2Fpre%3E%3C%2Fp%3E+%3Cp%3EAnschlie%26%23223%3Bend+erstellen+wir+eine+grundlegende+Konfiguration+%28satis.json%29+innerhalb+des+gerade+erstellten+Projektes%3A%3C%2Fp%3E++%3Cdiv+class%3D%22wp_syntax%22+style%3D%22position%3Arelative%3B%22%3E%3Ctable%3E%3Ctr%3E%3Ctd+class%3D%22code%22%3E%3Cpre+class%3D%22javascript%22+style%3D%22font-family%3Amonospace%3B%22%3E%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bname%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3BOur+Satis+repository%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bhomepage%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bhttp%3A%2F%2Flocalhost%2Fsatis%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Brequire-all%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23003366%3B+font-weight%3A+bold%3B%22%3Etrue%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E%3C%2Fpre%3E%3C%2Ftd%3E%3C%2Ftr%3E%3C%2Ftable%3E%3Cp+class%3D%22theCode%22+style%3D%22display%3Anone%3B%22%3E%7B++++++%26quot%3Bname%26quot%3B%3A+%26quot%3BOur+Satis+repository%26quot%3B%2C++++++%26quot%3Bhomepage%26quot%3B%3A+%26quot%3Bhttp%3A%2F%2Flocalhost%2Fsatis%26quot%3B%2C++++++%26quot%3Brequire-all%26quot%3B%3A+true++%7D%3C%2Fp%3E%3C%2Fdiv%3E++%3Cp%3EDies+definiert%2C+lediglich%2C+wie+unser+Repository+hei%26%23223%3Bt+%28%3Ccode%3Ename%3C%2Fcode%3E%29+und+wie+man+es+%26%23252%3Bber+den+Browser+aufrufen+kann+%28%3Ccode%3Ehomepage%3C%2Fcode%3E%29.%3Cbr+%2F%3E+require-all+bedeutet%2C+dass+Satis+s%26%23228%3Bmtliche+Versionen+der+Bibliotheken+laden+soll+%26%238211%3B+dies+ist+die+Standardeinstellung%2C+denn+schlie%26%23223%3Blich+soll+ja+in+der+composer.json+des+eigentlichen+Projektes+sp%26%23228%3Bter+die+genaue+Version+festgelegt+werden+k%26%23246%3Bnnen.%3C%2Fp%3E+%3Cp%3ENun+m%26%23252%3Bssen+wir+Satis+noch+mitteilen%2C+welche+Bibliotheken+wir+ben%26%23246%3Btigen.+F%26%23252%3Br+Repositorys%2C+die+eine+composer.json+haben%2C+kann+dies+direkt+in+der+satis.json+definiert+werden.%3C%2Fp%3E++%3Cdiv+class%3D%22wp_syntax%22+style%3D%22position%3Arelative%3B%22%3E%3Ctable%3E%3Ctr%3E%3Ctd+class%3D%22code%22%3E%3Cpre+class%3D%22javascript%22+style%3D%22font-family%3Amonospace%3B%22%3E%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Brepositories%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%2391%3B%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E++++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Btype%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bcomposer%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E++++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Burl%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bhttps%3A%2F%2FURL-of-private-Gitlab-Repository%26quot%3B%3C%2Fspan%3E++++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%2393%3B%3C%2Fspan%3E%3C%2Fpre%3E%3C%2Ftd%3E%3C%2Ftr%3E%3C%2Ftable%3E%3Cp+class%3D%22theCode%22+style%3D%22display%3Anone%3B%22%3E%26quot%3Brepositories%26quot%3B%3A+%5B++++++%7B+++++++++++%26quot%3Btype%26quot%3B%3A+%26quot%3Bcomposer%26quot%3B%2C+++++++++++%26quot%3Burl%26quot%3B%3A+%26quot%3Bhttps%3A%2F%2FURL-of-private-Gitlab-Repository%26quot%3B+++++++%7D++%5D%3C%2Fp%3E%3C%2Fdiv%3E++%3Cp%3EProjekte%2C+die+keine+composer.json+haben+%28wie+viele+JS-Bibliotheken%2C+weil+Client-Entwickler+wiederum+einen+%3Ca+href%3D%22http%3A%2F%2Fbower.io%2F%22%3Eeigenen+Paketmanager%3C%2Fa%3E+haben%29+k%26%23246%3Bnnen+mittels+%3Ca+href%3D%22https%3A%2F%2Fgithub.com%2FFitchLearning%2Fsatisfy%22%3ESatisfy%3C%2Fa%3E+hinzugef%26%23252%3Bgt+werden.+Satisfy+analysiert+dazu+alle+Git-Tags+der+definierten+Bibliotheken+und+erstellt+daf%26%23252%3Br+einzelne+Eintr%26%23228%3Bge+in+der+Satis-Konfigurationsdatei.%3C%2Fp%3E+%3Cp%3EDamit+Satisfy+wei%26%23223%3B%2C+welche+Git-Repositories+es+einlesen+soll%2C+ben%26%23246%3Btigen+wir+eine+packagelist.json%3A%3C%2Fp%3E++%3Cdiv+class%3D%22wp_syntax%22+style%3D%22position%3Arelative%3B%22%3E%3Ctable%3E%3Ctr%3E%3Ctd+class%3D%22code%22%3E%3Cpre+class%3D%22javascript%22+style%3D%22font-family%3Amonospace%3B%22%3E%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bsciactive%2Fpnotify%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Burl%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bhttps%3A%2F%2Fgithub.com%2Fsciactive%2Fpnotify%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bminversion%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3B2.0%26quot%3B%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++...+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E%3C%2Fpre%3E%3C%2Ftd%3E%3C%2Ftr%3E%3C%2Ftable%3E%3Cp+class%3D%22theCode%22+style%3D%22display%3Anone%3B%22%3E%7B++++++%26quot%3Bsciactive%2Fpnotify%26quot%3B%3A+%7B++++++++++%26quot%3Burl%26quot%3B%3A+%26quot%3Bhttps%3A%2F%2Fgithub.com%2Fsciactive%2Fpnotify%26quot%3B%2C++++++++++%26quot%3Bminversion%26quot%3B%3A+%26quot%3B2.0%26quot%3B++++++%7D%2C++++++...++%7D%3C%2Fp%3E%3C%2Fdiv%3E++%3Cp%3EAus+der+urspr%26%23252%3Bnglichen+satis.json+und+aus+der+packagelist.json+kann+Satisfy+nun+eine+erweiterte+Satis-Konfiguration+erstellen%3A%3Cbr+%2F%3E+%3Cpre%3Esatisfy+--repofile+satis.json+--packagefile+packagelist.json+--output+satis.expanded.json%3C%2Fpre%3E%3Cbr+%2F%3E+Die+entstehende+satis.expanded.json+enth%26%23228%3Blt+s%26%23228%3Bmtliche+Git-Tags+aller+angegebenen+Git-Repositorys+als+einzelne+Satis-Repositorys%3A%3C%2Fp%3E++%3Cdiv+class%3D%22wp_syntax%22+style%3D%22position%3Arelative%3B%22%3E%3Ctable%3E%3Ctr%3E%3Ctd+class%3D%22code%22%3E%3Cpre+class%3D%22javascript%22+style%3D%22font-family%3Amonospace%3B%22%3E%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Brepositories%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%2391%3B%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Btype%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bpackage%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bpackage%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bname%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bsciactive%2Fpnotify%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bversion%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3B2.0.0%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bsource%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Burl%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bhttps%3A%2F%2Fgithub.com%2Fsciactive%2Fpnotify%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Btype%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bgit%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Breference%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bv2.0.0%26quot%3B%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E+++++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Btype%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bpackage%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bpackage%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bname%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bsciactive%2Fpnotify%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bversion%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3B2.0.1%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bsource%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Burl%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bhttps%3A%2F%2Fgithub.com%2Fsciactive%2Fpnotify%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Btype%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bgit%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Breference%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bv2.0.1%26quot%3B%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E+++++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E+...+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%2393%3B%3C%2Fspan%3E%3C%2Fpre%3E%3C%2Ftd%3E%3C%2Ftr%3E%3C%2Ftable%3E%3Cp+class%3D%22theCode%22+style%3D%22display%3Anone%3B%22%3E%26quot%3Brepositories%26quot%3B%3A+%5B++++++%7B++++++++%26quot%3Btype%26quot%3B%3A+%26quot%3Bpackage%26quot%3B%2C++++++++%26quot%3Bpackage%26quot%3B%3A+%7B++++++++++%26quot%3Bname%26quot%3B%3A+%26quot%3Bsciactive%2Fpnotify%26quot%3B%2C++++++++++%26quot%3Bversion%26quot%3B%3A+%26quot%3B2.0.0%26quot%3B%2C++++++++++%26quot%3Bsource%26quot%3B%3A+%7B++++++++++++%26quot%3Burl%26quot%3B%3A+%26quot%3Bhttps%3A%2F%2Fgithub.com%2Fsciactive%2Fpnotify%26quot%3B%2C++++++++++++%26quot%3Btype%26quot%3B%3A+%26quot%3Bgit%26quot%3B%2C++++++++++++%26quot%3Breference%26quot%3B%3A+%26quot%3Bv2.0.0%26quot%3B++++++++++%7D++++++++%7D++++++%7D%2C++++++%7B++++++++%26quot%3Btype%26quot%3B%3A+%26quot%3Bpackage%26quot%3B%2C++++++++%26quot%3Bpackage%26quot%3B%3A+%7B++++++++++%26quot%3Bname%26quot%3B%3A+%26quot%3Bsciactive%2Fpnotify%26quot%3B%2C++++++++++%26quot%3Bversion%26quot%3B%3A+%26quot%3B2.0.1%26quot%3B%2C++++++++++%26quot%3Bsource%26quot%3B%3A+%7B++++++++++++%26quot%3Burl%26quot%3B%3A+%26quot%3Bhttps%3A%2F%2Fgithub.com%2Fsciactive%2Fpnotify%26quot%3B%2C++++++++++++%26quot%3Btype%26quot%3B%3A+%26quot%3Bgit%26quot%3B%2C++++++++++++%26quot%3Breference%26quot%3B%3A+%26quot%3Bv2.0.1%26quot%3B++++++++++%7D++++++++%7D++++++%7D++...++%5D%3C%2Fp%3E%3C%2Fdiv%3E++%3Cp%3ENun+m%26%23252%3Bssen+wir+Satis+nur+noch+anweisen%2C+die+satis.expanded.json+einzulesen%3A%3Cbr+%2F%3E+%3Cpre%3Ephp+satis+build+satis.expanded.json+%26lt%3Bper+HTTP+erreichbares+Verzeichnis%26gt%3B%3C%2Fpre%3E%3C%2Fp%3E+%3Cp%3EAngenommen%2C+wir+nutzen+Apache+und+haben+einen+Link+namens+%26%238222%3Bsatis%26%238220%3B+auf+das+per+HTTP+erreichbare+Verzeichnis+erstellt%2C+k%26%23246%3Bnnen+wir+im+Browser+http%3A%2F%2Flocalhost%2Fsatis+aufrufen+und+sehen+eine+%26%23220%3Bbersicht+%26%23252%3Bber+s%26%23228%3Bmtliche+Bibliotheken+und+deren+Versionen%2C+die+nun+zur+Verf%26%23252%3Bgung+stehen+%28so+%26%23228%3Bhnlich+wie+auf+Packagist%29.+Nat%26%23252%3Brlich+macht+es+mehr+Sinn+Satis+auf+einen+zentralen+Server+zu+packen%2C+damit+alle+darauf+zugreifen+k%26%23246%3Bnnen%2C+aber+f%26%23252%3Br+Testzwecke+reicht+auch+erstmal+eine+lokale+Installation.%3C%2Fp%3E+%3Cp%3ENun+k%26%23246%3Bnnen+wir+die+composer.json+unseres+Projektes+%26%23246%3Bffnen+und+auf+unser+Satis-Repository+verweisen%3A%3C%2Fp%3E++%3Cdiv+class%3D%22wp_syntax%22+style%3D%22position%3Arelative%3B%22%3E%3Ctable%3E%3Ctr%3E%3Ctd+class%3D%22code%22%3E%3Cpre+class%3D%22javascript%22+style%3D%22font-family%3Amonospace%3B%22%3E%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Brepositories%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%2391%3B%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Btype%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bcomposer%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Burl%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bhttp%3A%2F%2Flocalhost%2Fsatis%26quot%3B%3C%2Fspan%3E+++++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bpackagist%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23003366%3B+font-weight%3A+bold%3B%22%3Efalse%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%2393%3B%3C%2Fspan%3E%3C%2Fpre%3E%3C%2Ftd%3E%3C%2Ftr%3E%3C%2Ftable%3E%3Cp+class%3D%22theCode%22+style%3D%22display%3Anone%3B%22%3E%26quot%3Brepositories%26quot%3B%3A%5B++++++%7B++++++++%26quot%3Btype%26quot%3B%3A+%26quot%3Bcomposer%26quot%3B%2C++++++++%26quot%3Burl%26quot%3B%3A+%26quot%3Bhttp%3A%2F%2Flocalhost%2Fsatis%26quot%3B++++++++%7D++++++%7D%2C++++++%7B++++++++++%26quot%3Bpackagist%26quot%3B%3A+false++++++%7D++%5D%3C%2Fp%3E%3C%2Fdiv%3E++%3Cp%3EDas+%3Ccode%3E%26quot%3Bpackagist%26quot%3B%3A+false%3C%2Fcode%3E+bewirkt%2C+dass+Composer+bei+fehlenden+Paketen+nicht+auf+Packagist+nachsieht.+Dadurch+hat+man+die+komplette+Kontrolle+%26%23252%3Bber+alle+eingebundenen+Fremdbibliotheken%2C+wenn+Satis+sinnvollerweise+das+einzige+Composer-Repository+ist.%3C%2Fp%3E+%3Cp%3ENun+k%26%23246%3Bnnen+wir+auf+s%26%23228%3Bmtliche+Bibliotheken+und+Versionen%2C+die+unter+http%3A%2F%2Flocalhost%2Fsatis+aufgelistet+sind%2C+im+require-Block+zugreifen%3A%3C%2Fp%3E++%3Cdiv+class%3D%22wp_syntax%22+style%3D%22position%3Arelative%3B%22%3E%3Ctable%3E%3Ctr%3E%3Ctd+class%3D%22code%22%3E%3Cpre+class%3D%22javascript%22+style%3D%22font-family%3Amonospace%3B%22%3E%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Brequire%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bsciactive%2Fpnotify%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3B2.%2A%26quot%3B%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E%3C%2Fpre%3E%3C%2Ftd%3E%3C%2Ftr%3E%3C%2Ftable%3E%3Cp+class%3D%22theCode%22+style%3D%22display%3Anone%3B%22%3E%26quot%3Brequire%26quot%3B%3A+%7B++++++%26quot%3Bsciactive%2Fpnotify%26quot%3B%3A+%26quot%3B2.%2A%26quot%3B++%7D%3C%2Fp%3E%3C%2Fdiv%3E++%3Cp%3EMan+beachte+das+Sternchen+bei+der+Versionsangabe.+Obwohl+die+JS-Bibliothek+PNotify+keine+composer.json+hat+und+auch+nicht+bei+Packagist+gelistet+ist%2C+k%26%23246%3Bnnen+wir+die+%3Ca+href%3D%22https%3A%2F%2Fgetcomposer.org%2Fdoc%2Farticles%2Fversions.md%22%3EVersion+Constraints%3C%2Fa%3E+von+Composer+nutzen.+Es+funktioniert+nat%26%23252%3Brlich+genauso+f%26%23252%3Br+Bibliotheken%2C+die+eine+composer.json+haben+und+trotzdem+nicht+bei+Packagist+sind.%3C%2Fp%3E+%3Cp%3EEinen+weiteren+Vorteil+hat+die+Nutzung+von+Satis+noch%3A+Es+k%26%23246%3Bnnte+vorkommen%2C+dass+man+gerade+eine+neue+Version+bauen+m%26%23246%3Bchte%2C+aber+Github+oder+Packagist+gerade+nicht+erreichbar+sind.+In+diesem+Fall+k%26%23246%3Bnnen+wir+keine+neue+Version+erstellen%2C+was+unter+Umst%26%23228%3Bnden+teuer+sein+kann.%3Cbr+%2F%3E+Satis+kann+als+Proxy+f%26%23252%3Br+Github+und+Packagist+fungieren%2C+indem+es+per+Cronjob+regelm%26%23228%3B%26%23223%3Big+die+Github-Repositorys+%26%23252%3Bberpr%26%23252%3Bft+und+neue+Versionen+herunterl%26%23228%3Bdt.+Wird+sp%26%23228%3Bter+eine+bestimmte+Version+per+Composer+angefordert%2C+kann+auf+die+zwischengespeicherte+Version+zur%26%23252%3Bckgegriffen+werden+und+man+ist+somit+unabh%26%23228%3Bngig+von+Github+oder+Packagist.%3C%2Fp%3E+%3Cp%3EF%26%23252%3Br+die+Archivierung+von+Versionen+ist+folgende+Erg%26%23228%3Bnzung+in+der+satis.json+n%26%23246%3Btig%3A%3C%2Fp%3E++%3Cdiv+class%3D%22wp_syntax%22+style%3D%22position%3Arelative%3B%22%3E%3Ctable%3E%3Ctr%3E%3Ctd+class%3D%22code%22%3E%3Cpre+class%3D%22javascript%22+style%3D%22font-family%3Amonospace%3B%22%3E%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bname%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3BOur+Satis+repository%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bhomepage%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bhttp%3A%2F%2Flocalhost%2Fsatis%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Brequire-all%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23003366%3B+font-weight%3A+bold%3B%22%3Etrue%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Brequire-dependencies%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23003366%3B+font-weight%3A+bold%3B%22%3Etrue%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Brequire-dev-dependencies%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23003366%3B+font-weight%3A+bold%3B%22%3Etrue%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Barchive%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23123%3B%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bdirectory%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bdist%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bformat%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Btar%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%2C%3C%2Fspan%3E+++++++++%3Cspan+style%3D%22color%3A+%233366CC%3B%22%3E%26quot%3Bskip-dev%26quot%3B%3C%2Fspan%3E%3Cspan+style%3D%22color%3A+%23339933%3B%22%3E%3A%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23003366%3B+font-weight%3A+bold%3B%22%3Etrue%3C%2Fspan%3E+++++%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E+%3Cspan+style%3D%22color%3A+%23009900%3B%22%3E%26%23125%3B%3C%2Fspan%3E%3C%2Fpre%3E%3C%2Ftd%3E%3C%2Ftr%3E%3C%2Ftable%3E%3Cp+class%3D%22theCode%22+style%3D%22display%3Anone%3B%22%3E%7B++++++%26quot%3Bname%26quot%3B%3A+%26quot%3BOur+Satis+repository%26quot%3B%2C++++++%26quot%3Bhomepage%26quot%3B%3A+%26quot%3Bhttp%3A%2F%2Flocalhost%2Fsatis%26quot%3B%2C++++++%26quot%3Brequire-all%26quot%3B%3A+true%2C++++++%26quot%3Brequire-dependencies%26quot%3B%3A+true%2C++++++%26quot%3Brequire-dev-dependencies%26quot%3B%3A+true%2C++++++%26quot%3Barchive%26quot%3B%3A+%7B++++++++++%26quot%3Bdirectory%26quot%3B%3A+%26quot%3Bdist%26quot%3B%2C++++++++++%26quot%3Bformat%26quot%3B%3A+%26quot%3Btar%26quot%3B%2C++++++++++%26quot%3Bskip-dev%26quot%3B%3A+true++++++%7D++%7D%3C%2Fp%3E%3C%2Fdiv%3E++%3Cp%3E%3Ccode%3Erequire-dependencies%3C%2Fcode%3E+und+%3Ccode%3Erequire-dev-dependencies%3C%2Fcode%3E+sorgen+daf%26%23252%3Br%2C+dass+auch+s%26%23228%3Bmtliche+Bibliotheken+archiviert+werden%2C+von+denen+unsere+ben%26%23246%3Btigten+Bibliotheken+abh%26%23228%3Bngig+sind.%3Cbr+%2F%3E+%3Ccode%3Edirectory%3C%2Fcode%3E+ist+das+Verzeichnis%2C+in+dem+Satis+die+heruntergeladenen+Versionen+speichert%3Cbr+%2F%3E+%3Ccode%3Eskip-dev%3C%2Fcode%3E+legt+fest%2C+ob+auch+Branches+heruntergeladen+werden+%28%3Ccode%3Etrue%3C%2Fcode%3E%29+sollen+oder+nur+Tags+%28%3Ccode%3Efalse%3C%2Fcode%3E%29.+%3C%2Fp%3E+%3Cp%3EIst+das+eingestellt%2C+archiviert+Satis+die+Bibliotheken+beim+n%26%23228%3Bchsten%3Cbr+%2F%3E+%3Cpre%3Ephp+satis+build+satis.expanded.json+%26lt%3Bper+HTTP+erreichbares+Verzeichnis%26gt%3B%3C%2Fpre%3E%3C%2Fp%3E+%3Cp%3EPS%3A+Ich+habe+in+diesem+Fall+stets+Github+erw%26%23228%3Bhnt.+Satisfy+kann+nat%26%23252%3Brlich+auch+auf+andere+Dienste+zugreifen%2C+solange+Git+zugrunde+liegt%2C+z.B.+%3Ca+href%3D%22https%3A%2F%2Fbitbucket.org%2F%22%3EBitBucket%3C%2Fa%3E%2C+%3Ca+href%3D%22https%3A%2F%2Fabout.gitlab.com%2F%22%3EGitlab%3C%2Fa%3E+usw.%3C%2Fp%3E+%3Cdiv+class%3D%27yarpp-related+yarpp-related-none%27%3E+%3C%2Fdiv%3E+%09%09%09
php

24.09.2019 06:37:49

MySQL-Datenbank Tuning

Viele Anwendungen nutzen mittlerweile eine Datenbank. Meist ist sie vorinstalliert und man kümmert sich nicht weiter um die Einstellungen. Doch gerade in den DB-Einstellungen liegen oft massive Performance-Einbußen begründet. Dieser Beitrag soll einige hilfreiche Tipps geben, wie man die Einstellungen einer MySQL-Tabelle optimiert.

Erfahrungsgemäß steigt MySQL bei einem Besucheransturm auf eine dynamische Seite als erstes aus. Das liegt daran das ein Großteil
der Installationen die Standard-Konfiguration nicht verändert was u.a. schon die Einschränkung bringt, dass MySQL nur 100 gleichzeitige Verbindungen erlaubt. Und beim 101. macht die Datenbank dann eben dicht.
Die folgenden Tipps sollten einen erheblichen Performance-Schub bringen.

Alle Konfigurationsparameter sind entweder in der /etc/my.cnf in der Sektion [mysqld] einzutragen, z.B.:
[mysqld] set-variable = max_connections=2500 oder als Parameter übergeben z.B.:
safe_mysqld --max_connections=2500 &

Das oben erwähnte Einstellen der max. gleichzetigen Verbindungen ist ein sehr wichtiger Punkt. Oft bemerkt man gar nicht, dass dieses Setting aktiviert ist, wenn man lokal im stillen Kämmerlein eine neue Anwendung mit ein paar Leuten testet. Doch stellt man die Anwendung dann online und es kommen die ersten Besucher, streikt die Datenbank irgendwann – und keiner weiß wieso, weil doch beim Testen alles so schön funktioniert hat.
Wenn man eine stark frequentierte Webseite hat, die bei jedem Aufruf Selects durchführt oder persistente Verbindungen zur
Datenbank verwendet,ist MySQL in der Standard-Konfiguration mit 100 gleichzeitigen Verbindungen schnell am Ende.

MySQL ist in der Lage auch auf schwachen Rechnern viele Verbindungen zu verarbeiten.
Die Variable max_connections sollte mit dem Wert „1000“ bis „2500“ auf einen akzeptablen Wert gebracht werden oder jedoch dem, was Ihre Websiten an gleichzeitigen Benutzern erwarten. Wer sich sicher ist, dass die DB keine Begrenzung braucht, kann auch „0“ einstellen, dann gibt es kein Limit an gleichzeitigen Verbindungen.

Die Parameter key_buffer_size und table_cache sind die wohl wichtigsten performance-bezogenen Variablen. Diese geben an wieviel Speicher MySQL zur Verfügung steht, um Tabellen und Abfrage-Schlüssel zu speichern.
Auf Systemen mit 2 GB-Ram oder mehr und vielen Datenbanken sind folgende Einstellungen zu empfehlen:
key_buffer=128M table_cache=512 sort_buffer=15M

Für Systeme mit moderater RAM-Ausstattung (256 MB – 2 GB) oder wenig Datenbanken sind diese Settings empfehlenswert:
key_buffer=64M table_cache=256 (fuer >= 256MB RAM) oder table_cache=128 (fuer 256MB Ram)
Für diese Systeme reicht auch ein kleiner sort_buffer mit 4 – 8M.

Für Systeme mit 128MB RAM oder weniger sollte man den table_cache nicht einstellen, sondern die Standard-Werte der small.cnf verwenden, jedoch den key_buffer auf 16 oder 32M stellen.

datenbank