Um den Code in Zukunft besser verwalten und verstehen zu können, ist es wichtig, einige geeignete Entwurfsmuster zu verwenden. Ich hoffe, dass ich Ihnen zunächst das Singleton-Muster mitteile PHPer können mir helfen, darauf hinzuweisen.
Die Überlebenszeit von Objekten in PHP reicht vom Anfang des Skripts bis zum Ende des Skripts, daher wird der Singleton-Modus von PHP nur mehrmals auf einer Seite verwendet (die viele andere Seiten umfassen kann, nicht eine einzelne Seite in einem enger Sinn) Dieses Objekt wird nur wirksam, und das neue Objekt wird nicht wiederholt, wenn es mehrmals verwendet wird (wenn mehrere Personen an einem Projekt arbeiten, ist es unvermeidlich, dass ein Objekt in einer Anforderung mehrmals instanziiert wird) und unnötige Zeit Es werden keine Ressourcen verbraucht (der Effekt der Datensteuerungsverbindung ist offensichtlich), und ein weiterer Punkt besteht darin, dass das gesamte Skript das gleiche Objekt ist. Wie ist dieser Modus zu beachten? seine Implementierung:
1. Das erste, was Sie tun müssen, ist, die __construct()-Methode als private Methode zu definieren, sodass Sie keine neue Instanz durch new erhalten können. Der Singleton-Modus kann nicht extern instanziiert werden, er kann jedoch intern instanziiert werden.
2. Schützen Sie außerdem die Methode __clone(), um das Klonen von außerhalb der Klasse zu verhindern
2. Definieren Sie dann eine private Variable, die zum Speichern der Instanz verwendet wird, und eine öffentliche Funktion getInstance(), um die private Variable abzurufen.
<?<span>php </span><span>/*</span><span>* * 设计模式——单例模式 * @author 燕睿涛(luluyrt@163.com) </span><span>*/</span> <span>class</span><span> Singlemodel{ </span><span>/*</span><span>* * 保存Singlemodel实例的变量 * @var Singlemodel $_instance </span><span>*/</span> <span>private</span> <span>static</span> <span>$_instance</span> = <span>null</span><span>; </span><span>/*</span><span>* * 屏蔽掉通过new来实例化该对象 </span><span>*/</span> <span>private</span> <span>function</span><span> __construct(){ </span><span>//</span><span>空函数就行</span> <span> } <span> /*</span><span>*</span></span>
<span><span> * 屏蔽掉通过clone来克隆该对象</span></span>
<span><span>*/</span> </span>
<span> <span>private</span> <span>function</span><span> __clone(){ </span></span>
<span><span>//</span><span>空函数就行</span> </span>
<span> <span>}</span> </span><span>/*</span><span>* * 通过该方法获取实例,防止多次实例化 </span><span>*/</span> <span>public</span> <span>static</span> <span>function</span><span> getInstance(){ </span><span>if</span>(!(self::<span>$_instance</span><span> instanceof self)){ self</span>::<span>$_instance</span> = <span>new</span><span> self(); } </span><span>return</span> self::<span>$_instance</span><span>; } }</span>
Es ist leeres Gerede und diese Theorien überzeugen nicht. Schauen wir uns den spezifischen Wirkungsunterschied anhand von Beispielen an
<?<span>php </span><span>/*</span><span>* * 设计模式——单例模式——测试 * @author 燕睿涛(luluyrt@163.com) </span><span>*/</span> <span>class</span><span> Singlemodel{ </span><span>/*</span><span>* * 保存Singlemodel实例的变量 * @var Singlemodel $_instance </span><span>*/</span> <span>private</span> <span>static</span> <span>$_instance</span> = <span>null</span><span>; </span><span>private</span> <span>$_link</span> = <span>null</span><span>; </span><span>/*</span><span>* * 屏蔽掉通过new来实例化该对象(也可以去掉) * 这里来测试数据库连接 </span><span>*/</span> <span>private</span> <span>function</span><span> __construct(){ </span><span>$this</span>->_link = <span>mysqli_connect</span>("localhost","root","","mysql"<span>); } </span><span>/*</span><span>* * 通过该方法获取实例,防止多次实例化 </span><span>*/</span> <span>public</span> <span>static</span> <span>function</span><span> getInstance(){ </span><span>if</span>(!(self::<span>$_instance</span><span> instanceof self)){ self</span>::<span>$_instance</span> = <span>new</span><span> self(); } </span><span>return</span> self::<span>$_instance</span><span>; } </span><span>/*</span><span>* * 测试1,通过使用单例模式 </span><span>*/</span> <span>public</span> <span>static</span> <span>function</span><span> testOne(){ </span><span>return</span> self::<span>getInstance(); } </span><span>/*</span><span>* * 测试1,通过使用单例模式 </span><span>*/</span> <span>public</span> <span>static</span> <span>function</span><span> testTwo(){ </span><span>return</span> <span>new</span><span> self(); } } </span><span>$obj</span> = <span>array</span><span>(); </span><span>$begin</span> = <span>microtime</span>(<span>true</span><span>); </span><span>for</span>(<span>$i</span>=0;<span>$i</span><100;<span>$i</span>++<span>){ </span><span>/*</span><span> * 这里进行两次测试,testOne应用了单例模式,testTwo没有应用单例模式, * 我们分别看看他们占用的资源和耗费的时间 </span><span>*/</span> <span>//</span><span>$obj[$i] = Singlemodel::testOne();</span> <span>$obj</span>[<span>$i</span>] = Singlemodel::<span>testTwo(); } </span><span>echo</span> "程序运行期间最大内存占用:".memory_get_peak_usage()."bytes\r"<span>; </span><span>echo</span> "程序运行耗时:".<span>floatval</span>(<span>microtime</span>(<span>true</span>) - <span>$begin</span>)."s\r";
Kommentieren Sie zuerst die Zeile $obj[$i] = Singlemodel::testTwo(); aus. Mit dem Singleton-Modus können wir Folgendes erhalten Ergebnis
Dann kommentieren Sie $obj[$i] = Singlemodel::testOne(); aus, im Nicht-Singleton-Modus erhalten wir die folgenden Ergebnisse
zu sehen ist
100次测试 | 单例模式 | 普通模式 | 普通/单例(倍) |
内存(bytes) | 143816 | 847376 | 5.89 |
时间(s) | 0.0112519 | 0.2541389 | 22.59 |
5次测试 | |||
bytes | 140432 | 168984 | 1.20 |
s | 0.0112612 | 0.0173110 | 1.54 |
Sie können sehen, dass bei einer Anzahl von 100 von einem Skript ausgeführten Links die Leistung des Singleton-Modus in Bezug auf die Speichernutzung fast sechsmal besser und in Bezug auf die Zeit fast 23-mal schneller ist Wenn die Anzahl der Verbindungen weiter zunimmt, wird das Vielfache größer, da der vom Singleton-Modus verbrauchte Speicher und die Zeit im Wesentlichen unverändert geblieben sind und der Nicht-Singleton-Modus weiterhin zunehmen wird Im Modus „mysqli_connect(): (08004/1040): Trop de connexions in“ wird ein Fehler gemeldet, wenn die Anzahl der Verbindungen zu hoch ist. Zu Testzwecken können wir dies überprüfen Die Einstellung der maximalen Anzahl von MySQL-Verbindungen durch den folgenden Befehl muss beachtet werden, um nicht zu wissen, warum der Fehler gemeldet wird.
show variables <span>like</span> <span>'</span><span>max_connections</span><span>'</span>;
Wenn Sie es an diesem Punkt selbst testen, werden Sie feststellen, dass der Unterschied relativ gering ist, wenn die Anzahl der Verbindungen relativ gering ist (genau wie bei 5 Verbindungen in einer Anfrage oben). Viele Instanziierungen in einer Anfrage sind auch relativ gering. Bedeutet dies, dass dies natürlich nicht der Fall ist? Erstens kann dies mehrere Instanziierungen vermeiden und zweitens den Ressourcenverbrauch reduzieren Diese Lücke von 10 ms ist auch in Systemen mit hoher Parallelität nützlich. Wir haben viele Vorteile daraus.
Das ist alles für das Singleton-Muster. Wenn etwas nicht stimmt, hinterlassen Sie bitte eine Nachricht oder eine E-Mail. Vielen Dank!
Schick mir~
Das Obige stellt das PHP-Entwurfsmuster (1) vor, einschließlich Aspekten des Inhalts. Ich hoffe, es wird für Freunde hilfreich sein, die sich für PHP-Tutorials interessieren.