<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>KGTECH的博客|千克分享</title>
  <icon>https://www.gravatar.com/avatar/baad5dd5fda60c681db293e7bfae9888</icon>
  <subtitle>温故而知新</subtitle>
  <link href="https://kgtech.top/atom.xml" rel="self"/>
  
  <link href="https://kgtech.top/"/>
  <updated>2021-09-03T01:37:48.530Z</updated>
  <id>https://kgtech.top/</id>
  
  <author>
    <name>kevin</name>
    <email>kevind@kgtech.top</email>
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>MySQL中delete|truncate|drop的区别</title>
    <link href="https://kgtech.top/2021/09/03/delete-truncate-drop%E7%9A%84%E5%8C%BA%E5%88%AB/"/>
    <id>https://kgtech.top/2021/09/03/delete-truncate-drop%E7%9A%84%E5%8C%BA%E5%88%AB/</id>
    <published>2021-09-03T00:57:32.000Z</published>
    <updated>2021-09-03T01:37:48.530Z</updated>
    
    <content type="html"><![CDATA[<h2 id="delete"><a href="#delete" class="headerlink" title="delete"></a>delete</h2><ol><li>删除整张表</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">delete from table_name </span><br></pre></td></tr></table></figure><ol start="2"><li>也可以删除部分数据</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">delete from table_name where xxx;</span><br></pre></td></tr></table></figure><ol start="3"><li>说明</li></ol><ul><li>delete是属于DML语句，每次执行delete操作的时候，都会记录在redo和undo表空间里面，以便进行rollback，而且需要手动commit才能生效。</li><li>删除表中数据，但不删除表结构，也不释放空间。</li></ul><hr><h2 id="truncate"><a href="#truncate" class="headerlink" title="truncate"></a>truncate</h2><ol><li>只能操作整张表</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">truncate table table_name;</span><br></pre></td></tr></table></figure><ol start="2"><li>说明</li></ol><ul><li>truncate是通过释放存储表数据所用的数据页来删除数据，并且重新设置高水线和所有的索引。</li><li>truncate不会记录日志，所以执行速度很快，同时也不能通过rollback来撤销操作。对于有外键约束引用的表，不能使用truncate，会报错。</li><li>truncate是DDL语句，所以操作会立即生效，删除内容、释放空间，但是不删除表结构。</li></ul><hr><h2 id="drop"><a href="#drop" class="headerlink" title="drop"></a>drop</h2><ol><li>操作整张表</li></ol><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">drop table table_name;</span><br></pre></td></tr></table></figure><ol start="2"><li>说明</li></ol><ul><li>删除之后，依赖于该表的存储过程/函数将保留,但是变为invalid状态。</li><li>drop也属于DDL语言，立即执行，执行速度最快。</li><li>删除内容和定义，释放空间。</li></ul><hr><h2 id="区别"><a href="#区别" class="headerlink" title="区别"></a>区别</h2><ol><li>当表被TRUNCATE 后，这个表和索引所占用的空间会恢复到初始大小；DELETE操作不会减少表或索引所占用的空间；DROP语句将表所占用的空间全释放掉。</li><li>执行速度： <code>drop &gt; truncate &gt; delete</code></li><li>delete from删空表后，会保留一个空的页，truncate在表中不会留有任何页。</li><li>truncate语句实际是删除原来的表然后重新建立一个新表。</li><li>如果有identity产生的自增id列，delete from后仍然从上次的数开始增加，即种子不变；使用truncate删除之后，种子会恢复到初始值。</li></ol><hr><h4 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h4><ol><li><a href="https://www.jb51.net/article/175572.htm">MySQL删除表操作实现（delete、truncate、drop的区别）</a></li><li><a href="https://www.cnblogs.com/michealjy/p/11596963.html">mysql之drop、truncate和delete的区别</a></li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;delete&quot;&gt;&lt;a href=&quot;#delete&quot; class=&quot;headerlink&quot; title=&quot;delete&quot;&gt;&lt;/a&gt;delete&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;删除整张表&lt;/li&gt;
&lt;/ol&gt;
&lt;figure class=&quot;highlight plain&quot;</summary>
      
    
    
    
    
    <category term="learn" scheme="https://kgtech.top/tags/learn/"/>
    
  </entry>
  
  <entry>
    <title>PSR学习笔记</title>
    <link href="https://kgtech.top/2020/07/03/PSR%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <id>https://kgtech.top/2020/07/03/PSR%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/</id>
    <published>2020-07-03T08:48:40.000Z</published>
    <updated>2020-07-24T03:16:04.772Z</updated>
    
    <content type="html"><![CDATA[<h1 id="PSR笔记"><a href="#PSR笔记" class="headerlink" title="PSR笔记"></a>PSR笔记</h1><blockquote><p>PSR 是 PHP Standard Recommendations （PHP 推荐标准）的简写，由 <a href="https://github.com/php-fig">PHP FIG</a> 组织制定的 PHP 规范，是 PHP 开发的实践标准。</p></blockquote><h2 id="1-PSR-0-弃用"><a href="#1-PSR-0-弃用" class="headerlink" title="1. PSR-0(弃用)"></a>1. PSR-0(弃用)</h2><h2 id="2-PSR-1-编码风格"><a href="#2-PSR-1-编码风格" class="headerlink" title="2. PSR-1(编码风格)"></a>2. PSR-1(编码风格)</h2><ol><li>使用PSR-4规范自动加载规范，命名空间</li><li>类名使用大坨峰</li><li>类中的常量使用全大写，下划线</li><li>方法名使用小驼峰</li></ol><h2 id="3-PSR-2-编码风格"><a href="#3-PSR-2-编码风格" class="headerlink" title="3. PSR-2(编码风格)"></a>3. PSR-2(编码风格)</h2><ol><li>每个namespace和use块后空一行</li><li>花括号自成一行</li><li>控制结构的”{}” ,写在同一行</li><li>true，false，null必须小写</li><li>“()”前后不能有空格</li><li>“}” 和 “(“ 中间有空格</li></ol><h2 id="4-PSR-3-日志规范"><a href="#4-PSR-3-日志规范" class="headerlink" title="4. PSR-3(日志规范)"></a>4. PSR-3(日志规范)</h2><ol><li>LoggerInterface 定义了8个等级的日志</li><li>Psr\Log\LoggerInterface</li></ol><hr><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Psr</span>\<span class="title">Log</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 描述一个日志记录器实例</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * 该消息必须实现一个__toString()的字符串或者对象.</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * 该消息可能包含以下形式的占位符: &#123;foo&#125;  </span></span><br><span class="line"><span class="comment"> * foo 将会被关键词 &quot;foo&quot;中的上下文数据替换.</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * 上下文数组可以包含任意数据, 我们只能假设代码实现者</span></span><br><span class="line"><span class="comment"> * 如果给出一个生成堆栈跟踪的异常实例, 那么它的键名</span></span><br><span class="line"><span class="comment"> * 必须为 &quot;exception&quot;。</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * 请前往 https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md</span></span><br><span class="line"><span class="comment"> * 查看完整的接口规范.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">LoggerInterface</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 系统无法使用。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $message</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> array $context</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> void</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">emergency</span>(<span class="params"><span class="variable">$message</span>, <span class="keyword">array</span> <span class="variable">$context</span> = <span class="keyword">array</span>(<span class="params"></span>)</span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 必须立即采取行动。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 例如: 整个网站宕机了，数据库挂了，等等。 这应该</span></span><br><span class="line"><span class="comment">     * 发送短信通知警告你.</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $message</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> array $context</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> void</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">alert</span>(<span class="params"><span class="variable">$message</span>, <span class="keyword">array</span> <span class="variable">$context</span> = <span class="keyword">array</span>(<span class="params"></span>)</span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 临界条件。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 例如: 应用组件不可用，意外的异常。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $message</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> array $context</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> void</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">critical</span>(<span class="params"><span class="variable">$message</span>, <span class="keyword">array</span> <span class="variable">$context</span> = <span class="keyword">array</span>(<span class="params"></span>)</span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 运行时错误不需要马上处理，</span></span><br><span class="line"><span class="comment">     * 但通常应该被记录和监控。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $message</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> array $context</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> void</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">error</span>(<span class="params"><span class="variable">$message</span>, <span class="keyword">array</span> <span class="variable">$context</span> = <span class="keyword">array</span>(<span class="params"></span>)</span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 例外事件不是错误。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 例如: 使用过时的API，API使用不当，不合理的东西不一定是错误。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $message</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> array $context</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> void</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">warning</span>(<span class="params"><span class="variable">$message</span>, <span class="keyword">array</span> <span class="variable">$context</span> = <span class="keyword">array</span>(<span class="params"></span>)</span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 正常但重要的事件.</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $message</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> array $context</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> void</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">notice</span>(<span class="params"><span class="variable">$message</span>, <span class="keyword">array</span> <span class="variable">$context</span> = <span class="keyword">array</span>(<span class="params"></span>)</span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 有趣的事件.</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 例如: 用户登录，SQL日志。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $message</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> array $context</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> void</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">info</span>(<span class="params"><span class="variable">$message</span>, <span class="keyword">array</span> <span class="variable">$context</span> = <span class="keyword">array</span>(<span class="params"></span>)</span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 详细的调试信息。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $message</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> array $context</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> void</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">debug</span>(<span class="params"><span class="variable">$message</span>, <span class="keyword">array</span> <span class="variable">$context</span> = <span class="keyword">array</span>(<span class="params"></span>)</span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 可任意级别记录日志。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> mixed $level</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $message</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> array $context</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> void</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">log</span>(<span class="params"><span class="variable">$level</span>, <span class="variable">$message</span>, <span class="keyword">array</span> <span class="variable">$context</span> = <span class="keyword">array</span>(<span class="params"></span>)</span>)</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="5-PSR-4-自动加载"><a href="#5-PSR-4-自动加载" class="headerlink" title="5. PSR-4(自动加载)"></a>5. PSR-4(自动加载)</h2><ol><li>必须拥有一个顶级命名空间，可以有几个子命名空间</li><li>必须有一个类名</li><li>区分大小写</li></ol><span id="more"></span><h2 id="6-PSR-5-未通过"><a href="#6-PSR-5-未通过" class="headerlink" title="6. PSR-5(未通过)"></a>6. PSR-5(未通过)</h2><h2 id="7-PSR-6-缓存接口规范"><a href="#7-PSR-6-缓存接口规范" class="headerlink" title="7.PSR-6(缓存接口规范)"></a>7.PSR-6(缓存接口规范)</h2><ol><li>Psr\Cache\CacheItemInterface</li></ol><hr><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Psr</span>\<span class="title">Cache</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * CacheItemInterface 定了缓存系统里对缓存项操作的接口</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">CacheItemInterface</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 返回当前缓存项的「键」</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 「键」由实现类库来加载，并且高层的调用者（如：CacheItemPoolInterface）</span></span><br><span class="line"><span class="comment">     * **应该** 能使用此方法来获取到「键」的信息。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> string</span></span><br><span class="line"><span class="comment">     *  当前缓存项的「键」</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">getKey</span>(<span class="params"></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 凭借此缓存项的「键」从缓存系统里面取出缓存项。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 取出的数据 **必须** 跟使用 `set()` 存进去的数据是一模一样的。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 如果 `isHit()` 返回 false 的话，此方法必须返回 `null`，需要注意的是 `null` </span></span><br><span class="line"><span class="comment">     * 本来就是一个合法的缓存数据，所以你 **应该** 使用 `isHit()` 方法来辨别到底是</span></span><br><span class="line"><span class="comment">     * &quot;返回 null 数据&quot; 还是 &quot;缓存里没有此数据&quot;</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> mixed</span></span><br><span class="line"><span class="comment">     *   此缓存项的「键」对应的「值」，如果找不到的话，返回 `null`</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">get</span>(<span class="params"></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 确认缓存项的检查是否命中。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 注意: 调用此方法和调用 `get()` 时 **一定不可** 有先后顺序之分。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> bool</span></span><br><span class="line"><span class="comment">     * 如果缓冲池里有命中的话，返回 `true`，反之返回 `false`</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">isHit</span>(<span class="params"></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 为此缓存项设置「值」。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 参数 $value 可以是所有能被 PHP 序列化的数据，序列化的逻辑</span></span><br><span class="line"><span class="comment">     * 需要在实现类库里书写。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> mixed $value</span></span><br><span class="line"><span class="comment">     * 将被存储的可序列化的数据。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> static</span></span><br><span class="line"><span class="comment">     * 返回当前对象。</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">set</span>(<span class="params"><span class="variable">$value</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 设置缓存项的准确过期时间点。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> \DateTimeInterface|null $expiration</span></span><br><span class="line"><span class="comment">     * 过期的准确时间点，过了这个时间点后，缓存项就 **必须** 被认为是过期了的。</span></span><br><span class="line"><span class="comment">     * 如果明确的传参 `null` 的话，**可以** 使用一个默认的时间。</span></span><br><span class="line"><span class="comment">     * 如果没有设置的话，缓存 **应该** 存储到底层实现的最大允许时间。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> static</span></span><br><span class="line"><span class="comment">     * 返回当前对象</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">expiresAt</span>(<span class="params"><span class="variable">$expiration</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 设置缓存项的过期时间</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> int|\DateInterval|null $time</span></span><br><span class="line"><span class="comment">     * 以秒为单位的过期时长，过了这段时间后，缓存项就 **必须** 被认为是过期了的。</span></span><br><span class="line"><span class="comment">     * 如果明确的传参 `null` 的话，**可以** 使用一个默认的时间。</span></span><br><span class="line"><span class="comment">     * 如果没有设置的话，缓存 **应该** 存储到底层实现的最大允许时间。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> static</span></span><br><span class="line"><span class="comment">     * 返回当前对象</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">expiresAfter</span>(<span class="params"><span class="variable">$time</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="2"><li>Psr\Cache\CacheItemPoolInterface</li></ol><hr><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Psr</span>\<span class="title">Cache</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * CacheItemPoolInterface 生成 CacheItemInterface 对象</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">CacheItemPoolInterface</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 返回「键」对应的一个缓存项。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 此方法 **必须** 返回一个 CacheItemInterface 对象，即使是找不到对应的缓存项</span></span><br><span class="line"><span class="comment">     * 也 **一定不可** 返回 `null`。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $key</span></span><br><span class="line"><span class="comment">     * 用来搜索缓存项的「键」。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> InvalidArgumentException</span></span><br><span class="line"><span class="comment">     *   如果 $key 不是合法的值，\Psr\Cache\InvalidArgumentException 异常会被抛出。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> CacheItemInterface</span></span><br><span class="line"><span class="comment">     *  对应的缓存项。</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">getItem</span>(<span class="params"><span class="variable">$key</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 返回一个可供遍历的缓存项集合。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string[] $keys</span></span><br><span class="line"><span class="comment">     * 由一个或者多个「键」组成的数组。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> InvalidArgumentException</span></span><br><span class="line"><span class="comment">     *   如果 $keys 里面有哪个「键」不是合法，\Psr\Cache\InvalidArgumentException 异常</span></span><br><span class="line"><span class="comment">     *   会被抛出。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> array|\Traversable</span></span><br><span class="line"><span class="comment">     *   返回一个可供遍历的缓存项集合，集合里每个元素的标识符由「键」组成，即使即使是找不到对的缓存项，也要返回一个「CacheItemInterface」对象到对应的「键」中。</span></span><br><span class="line"><span class="comment">     *   如果传参的数组为空，也需要返回一个空的可遍历的集合。</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">getItems</span>(<span class="params"><span class="keyword">array</span> <span class="variable">$keys</span> = <span class="keyword">array</span>(<span class="params"></span>)</span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 检查缓存系统中是否有「键」对应的缓存项。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 注意: 此方法应该调用 `CacheItemInterface::isHit()` 来做检查操作，而不是 `CacheItemInterface::get()`</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $key</span></span><br><span class="line"><span class="comment">     * 用来搜索缓存项的「键」。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> InvalidArgumentException</span></span><br><span class="line"><span class="comment">     *   如果 $key 不是合法的值，\Psr\Cache\InvalidArgumentException 异常会被抛出。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> bool</span></span><br><span class="line"><span class="comment">     *   如果存在「键」对应的缓存项即返回 true，否则 false</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">hasItem</span>(<span class="params"><span class="variable">$key</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 清空缓冲池</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> bool</span></span><br><span class="line"><span class="comment">     *   成功返回 true，有错误发生返回 false</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">clear</span>(<span class="params"></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 从缓冲池里移除某个缓存项</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $key</span></span><br><span class="line"><span class="comment">     *   用来搜索缓存项的「键」。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> InvalidArgumentException</span></span><br><span class="line"><span class="comment">     * 如果 $key 不是合法的值，\Psr\Cache\InvalidArgumentException 异常会被抛出。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> bool</span></span><br><span class="line"><span class="comment">     *   成功返回 true，有错误发生返回 false</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">deleteItem</span>(<span class="params"><span class="variable">$key</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 从缓冲池里移除多个缓存项</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string[] $keys</span></span><br><span class="line"><span class="comment">     * 由一个或者多个「键」组成的数组。</span></span><br><span class="line"><span class="comment">     * </span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> InvalidArgumentException</span></span><br><span class="line"><span class="comment">     * 如果 $keys 里面有哪个「键」不是合法，\Psr\Cache\InvalidArgumentException 异常会被抛出。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> bool</span></span><br><span class="line"><span class="comment">     * 成功返回 true，有错误发生返回 false</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">deleteItems</span>(<span class="params"><span class="keyword">array</span> <span class="variable">$keys</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 立刻为「CacheItemInterface」对象做数据持久化。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> CacheItemInterface $item</span></span><br><span class="line"><span class="comment">     * 将要被存储的缓存项</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> bool</span></span><br><span class="line"><span class="comment">     * 成功返回 true，有错误发生返回 false</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">save</span>(<span class="params">CacheItemInterface <span class="variable">$item</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 稍后为「CacheItemInterface」对象做数据持久化。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> CacheItemInterface $item</span></span><br><span class="line"><span class="comment">     * 将要被存储的缓存项</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> bool</span></span><br><span class="line"><span class="comment">     * 成功返回 true，有错误发生返回 false</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">saveDeferred</span>(<span class="params">CacheItemInterface <span class="variable">$item</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 提交所有的正在队列里等待的请求到数据持久层，配合 `saveDeferred()` 使用</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> bool</span></span><br><span class="line"><span class="comment">     * 成功返回 true，有错误发生返回 false</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">commit</span>(<span class="params"></span>)</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="8-PSR-7-HTTP消息接口规范"><a href="#8-PSR-7-HTTP消息接口规范" class="headerlink" title="8. PSR-7 (HTTP消息接口规范)"></a>8. PSR-7 (HTTP消息接口规范)</h2><ol><li>RequestInterface 和ResponseInterface都继承于MessageInterface</li><li>Psr\Http\Message\RequestInterface </li></ol><hr><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Psr</span>\<span class="title">Http</span>\<span class="title">Message</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 代表客户端向服务器发起请求的 HTTP 消息对象。</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * 根据 HTTP 规范，此接口包含以下属性：</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * - HTTP 协议版本号</span></span><br><span class="line"><span class="comment"> * - HTTP 请求方法</span></span><br><span class="line"><span class="comment"> * - URI</span></span><br><span class="line"><span class="comment"> * - 报头信息</span></span><br><span class="line"><span class="comment"> * - 消息内容</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * 在构造 HTTP 请求对象的时候，如果没有提供 Host 信息，</span></span><br><span class="line"><span class="comment"> * 实现类库 **必须** 从给出的 URI 中去提取 Host 信息。</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * HTTP 请求是被视为无法修改的，所有能修改状态的方法，都 **必须** 有一套机制，在内部保</span></span><br><span class="line"><span class="comment"> * 持好原有的内容，然后把修改状态后的新的 HTTP 请求实例返回。</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">RequestInterface</span> <span class="keyword">extends</span> <span class="title">MessageInterface</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 获取消息的请求目标。</span></span><br><span class="line"><span class="comment">     * </span></span><br><span class="line"><span class="comment">     * 获取消息的请求目标的使用场景，可能是在客户端，也可能是在服务器端，也可能是在指定信息的时候</span></span><br><span class="line"><span class="comment">     * （参阅下方的 `withRequestTarget()`）。</span></span><br><span class="line"><span class="comment">     * </span></span><br><span class="line"><span class="comment">     * 在大部分情况下，此方法会返回组合 URI 的原始形式，除非被指定过（参阅下方的 `withRequestTarget()`）。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 如果没有可用的 URI，并且没有设置过请求目标，此方法 **必须** 返回 「/」。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> string</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">getRequestTarget</span>(<span class="params"></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 返回一个指定目标的请求实例。</span></span><br><span class="line"><span class="comment">     * </span></span><br><span class="line"><span class="comment">     * 如果请求需要非原始形式的请求目标——例如指定绝对形式、认证形式或星号形式——则此方法</span></span><br><span class="line"><span class="comment">     * 可用于创建指定请求目标的实例。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 此方法在实现的时候，**必须** 保留原有的不可修改的 HTTP 请求实例，然后返回</span></span><br><span class="line"><span class="comment">     * 一个新的修改过的 HTTP 请求实例。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@see</span> [http://tools.ietf.org/html/rfc7230#section-2.7](http://tools.ietf.org/html/rfc7230#section-2.7) </span></span><br><span class="line"><span class="comment">     * （关于请求目标的各种允许的格式）</span></span><br><span class="line"><span class="comment">     * </span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> mixed $requestTarget</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> self</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">withRequestTarget</span>(<span class="params"><span class="variable">$requestTarget</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 获取当前请求使用的 HTTP 方法</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> string HTTP 方法字符串</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">getMethod</span>(<span class="params"></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 返回更改了请求方法的消息实例。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 虽然，在大部分情况下，HTTP 请求方法都是使用大写字母来标示的，但是，实现类库 **不应该**</span></span><br><span class="line"><span class="comment">     * 修改用户传参的大小格式。</span></span><br><span class="line"><span class="comment">     * </span></span><br><span class="line"><span class="comment">     * 此方法在实现的时候，**必须** 保留原有的不可修改的 HTTP 请求实例，然后返回</span></span><br><span class="line"><span class="comment">     * 一个新的修改过的 HTTP 请求实例。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $method 大小写敏感的方法名</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> self</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> \InvalidArgumentException 当非法的 HTTP 方法名传入时会抛出异常。</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">withMethod</span>(<span class="params"><span class="variable">$method</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 获取 URI 实例。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 此方法 **必须** 返回 `UriInterface` 的 URI 实例。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@see</span> http://tools.ietf.org/html/rfc3986#section-4.3</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> UriInterface 返回与当前请求相关的 `UriInterface` 类型的 URI 实例。</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">getUri</span>(<span class="params"></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 返回修改了 URI 的消息实例。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 当传入的 URI 包含有 HOST 信息时，此方法 **必须** 更新 HOST 信息。如果 URI </span></span><br><span class="line"><span class="comment">     * 实例没有附带 HOST 信息，任何之前存在的 HOST 信息 **必须** 作为候补，应用</span></span><br><span class="line"><span class="comment">     * 更改到返回的消息实例里。</span></span><br><span class="line"><span class="comment">     * </span></span><br><span class="line"><span class="comment">     * 你可以通过传入第二个参数来，来干预方法的处理，当 `$preserveHost` 设置为 `true` </span></span><br><span class="line"><span class="comment">     * 的时候，会保留原来的 HOST 信息。当 `$preserveHost` 设置为 `true` 时，此方法</span></span><br><span class="line"><span class="comment">     * 会如下处理 HOST 信息：</span></span><br><span class="line"><span class="comment">     * </span></span><br><span class="line"><span class="comment">     * - 如果 HOST 信息不存在或为空，并且新 URI 包含 HOST 信息，则此方法 **必须** 更新返回请求中的 HOST 信息。</span></span><br><span class="line"><span class="comment">     * - 如果 HOST 信息不存在或为空，并且新 URI 不包含 HOST 信息，则此方法 **不得** 更新返回请求中的 HOST 信息。</span></span><br><span class="line"><span class="comment">     * - 如果HOST 信息存在且不为空，则此方法 **不得** 更新返回请求中的 HOST 信息。</span></span><br><span class="line"><span class="comment">     * </span></span><br><span class="line"><span class="comment">     * 此方法在实现的时候，**必须** 保留原有的不可修改的 HTTP 请求实例，然后返回</span></span><br><span class="line"><span class="comment">     * 一个新的修改过的 HTTP 请求实例。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@see</span> http://tools.ietf.org/html/rfc3986#section-4.3</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> UriInterface $uri `UriInterface` 新的 URI 实例</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> bool $preserveHost 是否保留原有的 HOST 头信息</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> self</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">withUri</span>(<span class="params">UriInterface <span class="variable">$uri</span>, <span class="variable">$preserveHost</span> = <span class="literal">false</span></span>)</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="3"><li>Psr\Http\Message\ResponseInterface</li></ol><hr><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Psr</span>\<span class="title">Http</span>\<span class="title">Message</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 表示服务器返回的响应消息。</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * 根据 HTTP 规范，此接口包含以下各项的属性：</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * - 协议版本</span></span><br><span class="line"><span class="comment"> * - 状态码和原因短语</span></span><br><span class="line"><span class="comment"> * - 报头</span></span><br><span class="line"><span class="comment"> * - 消息体</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * HTTP 响应是被视为无法修改的，所有能修改状态的方法，都 **必须** 有一套机制，在内部保</span></span><br><span class="line"><span class="comment"> * 持好原有的内容，然后把修改状态后的，新的 HTTP 响应实例返回。</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">ResponseInterface</span> <span class="keyword">extends</span> <span class="title">MessageInterface</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 获取响应状态码。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 状态码是一个三位整数，用于理解请求。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> int 状态码。</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">getStatusCode</span>(<span class="params"></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 返回具有指定状态码和原因短语（可选）的实例。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 如果未指定原因短语，实现代码 **可能** 选择 RFC7231 或 IANA 为状态码推荐的原因短语。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 此方法在实现的时候，**必须** 保留原有的不可修改的 HTTP 消息实例，然后返回</span></span><br><span class="line"><span class="comment">     * 一个新的修改过的 HTTP 消息实例。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@see</span> http://tools.ietf.org/html/rfc7231#section-6</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@see</span> http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> int $code 三位整数的状态码。</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $reasonPhrase 为状态码提供的原因短语；如果未提供，实现代码可以使用 HTTP 规范建议的默认代码。</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> self</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> \InvalidArgumentException 如果传入无效的状态码，则抛出。</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">withStatus</span>(<span class="params"><span class="variable">$code</span>, <span class="variable">$reasonPhrase</span> = <span class="string">&#x27;&#x27;</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 获取与响应状态码关联的响应原因短语。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 因为原因短语不是响应状态行中的必需元素，所以原因短语 **可能** 是空。</span></span><br><span class="line"><span class="comment">     * 实现代码可以选择返回响应的状态代码的默认 RFC 7231 推荐原因短语（或 IANA HTTP 状态码注册表中列出的原因短语）。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@see</span> http://tools.ietf.org/html/rfc7231#section-6</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@see</span> http://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> string 原因短语；如果不存在，则 **必须** 返回空字符串。</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">getReasonPhrase</span>(<span class="params"></span>)</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="9-PSR-8-到PSR-10-未通过"><a href="#9-PSR-8-到PSR-10-未通过" class="headerlink" title="9. PSR-8 到PSR-10 未通过"></a>9. PSR-8 到PSR-10 未通过</h2><h2 id="10-PSR-11-容器接口"><a href="#10-PSR-11-容器接口" class="headerlink" title="10. PSR-11 (容器接口)"></a>10. PSR-11 (容器接口)</h2><blockquote><p>设定 <code>ContainerInterface</code> 的目的是为了标准化框架或类库如何使用容器来获取对象和参数。</p></blockquote><ol><li>Psr\Container\ContainerInterface</li></ol><hr><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Psr</span>\<span class="title">Container</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 容器的接口类，提供了获取容器中对象的方法。</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">ContainerInterface</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 在容器中查找并返回实体标识符对应的对象。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $id 查找的实体标识符字符串。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> NotFoundExceptionInterface  容器中没有实体标识符对应对象时抛出的异常。</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> ContainerExceptionInterface 查找对象过程中发生了其他错误时抛出的异常。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> mixed 查找到的对象。</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">get</span>(<span class="params"><span class="variable">$id</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 如果容器内有标识符对应的内容时，返回 true 。</span></span><br><span class="line"><span class="comment">     * 否则，返回 false。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 调用 `has($id)` 方法返回 true，并不意味调用  `get($id)` 不会抛出异常。</span></span><br><span class="line"><span class="comment">     * 而只意味着 `get($id)` 方法不会抛出 `NotFoundExceptionInterface` 实现类的异常。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $id 查找的实体标识符字符串。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> bool</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">has</span>(<span class="params"><span class="variable">$id</span></span>)</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="11-PSR-15-HTTP请求处理器"><a href="#11-PSR-15-HTTP请求处理器" class="headerlink" title="11. PSR-15 (HTTP请求处理器)"></a>11. PSR-15 (HTTP请求处理器)</h2><blockquote><p>主要用于描述抽象的请求处理器和中间件 </p></blockquote><ol><li>Psr\Http\Server\RequestHandlerInterface</li></ol><hr><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">namespace</span> <span class="title">Psr</span>\<span class="title">Http</span>\<span class="title">Server</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">Psr</span>\<span class="title">Http</span>\<span class="title">Message</span>\<span class="title">ResponseInterface</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">Psr</span>\<span class="title">Http</span>\<span class="title">Message</span>\<span class="title">ServerRequestInterface</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 处理服务器请求并返回响应</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * HTTP 请求处理程序处理 HTTP 请求，以便生成 HTTP 相应。</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">RequestHandlerInterface</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 处理服务器请求并返回响应</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 可以调用其他协助代码来生成响应。</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">handle</span>(<span class="params">ServerRequestInterface <span class="variable">$request</span></span>): <span class="title">ResponseInterface</span></span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="2"><li>Psr\Http\Server\MiddlewareInterface</li></ol><hr><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">namespace</span> <span class="title">Psr</span>\<span class="title">Http</span>\<span class="title">Server</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">Psr</span>\<span class="title">Http</span>\<span class="title">Message</span>\<span class="title">ResponseInterface</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">Psr</span>\<span class="title">Http</span>\<span class="title">Message</span>\<span class="title">ServerRequestInterface</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 参与处理服务器的请求与响应</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * 一个 HTTP 中间件组件参与处理一个 HTTP 的消息:</span></span><br><span class="line"><span class="comment"> * 通过对请求进行操作, 生成相应,或者将请求转发给后续的中间件，并  且可能对它的响应进行操作</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">MiddlewareInterface</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 处理一个传入的请求</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 处理传入的服务器请求以产生相应.</span></span><br><span class="line"><span class="comment">     * 如果无法生成响应本身，它可能会委托给提供的请求处理程序来执行此操作</span></span><br><span class="line"><span class="comment">     * </span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">process</span>(<span class="params">ServerRequestInterface <span class="variable">$request</span>, RequestHandlerInterface <span class="variable">$handler</span></span>): <span class="title">ResponseInterface</span></span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="12-PSR-16-更简单的缓存接口"><a href="#12-PSR-16-更简单的缓存接口" class="headerlink" title="12. PSR-16(更简单的缓存接口)"></a>12. PSR-16(更简单的缓存接口)</h2><ol><li>Psr\SimpleCache\CacheInterface</li></ol><hr><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Psr</span>\<span class="title">SimpleCache</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">CacheInterface</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 从缓存中取出值</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $key     该项在缓存中唯一的key值</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> mixed  $default key不存在时，返回的默认值</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> mixed 从缓存中返回的值，或者是不存在时的默认值</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> \Psr\SimpleCache\InvalidArgumentException</span></span><br><span class="line"><span class="comment">     *   如果给定的key不是一个合法的字符串时，抛出该异常</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">get</span>(<span class="params"><span class="variable">$key</span>, <span class="variable">$default</span> = <span class="literal">null</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 存储值在cache中，唯一关键到一个key及一个可选的存在时间</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string                 $key   存储项目的key.</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> mixed                  $value 存储的值，必须可以被序列化的</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> null|int|\DateInterval $ttl   可选项.项目的存在时间，如果该值没有设置，且驱动支持生存时间时，将设置一个默认值，或者驱自行处理。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> bool true 存储成功  false 存储失败</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> \Psr\SimpleCache\InvalidArgumentException</span></span><br><span class="line"><span class="comment">     *  如果给定的key不是一个合法的字符串时，抛出该异常。</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">set</span>(<span class="params"><span class="variable">$key</span>, <span class="variable">$value</span>, <span class="variable">$ttl</span> = <span class="literal">null</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 删除指定键值的缓存项</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $key 指定的唯一缓存key对应的项目将会被删除</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> bool 成功删除时返回ture，有其它错误时时返回false</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> \Psr\SimpleCache\InvalidArgumentException</span></span><br><span class="line"><span class="comment">     *   如果给定的key不是一个合法的字符串时，抛出该异常。</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">delete</span>(<span class="params"><span class="variable">$key</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 清除所有缓存中的key</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> bool 成功返回True.失败返回False</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">clear</span>(<span class="params"></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 根据指定的缓存键值列表获取得多个缓存项目</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> iterable $keys   在单次操作中可被获取的键值项</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> mixed    $default 如果key不存在时，返回的默认值</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> iterable  返回键值对（key=&gt;value形式）列表。如果key不存在，或者已经过期时，返回默认值。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> \Psr\SimpleCache\InvalidArgumentException</span></span><br><span class="line"><span class="comment">     *  如果给定的keys既不是合法的数组，也不可以被转成数组，或者给得的任何一个key不是一个合法的值时，拖出该异常。</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">getMultiple</span>(<span class="params"><span class="variable">$keys</span>, <span class="variable">$default</span> = <span class="literal">null</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 存储一个键值对形式的集合到缓存中。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> iterable               $values 一系列操作的键值对列表</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> null|int|\DateInterval $ttl     可选项.项目的存在时间，如果该值没有设置，且驱动支持生存时间时，将设置一个默认值，或者驱自行处理。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> bool 成功返回True.失败返回False.</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> \Psr\SimpleCache\InvalidArgumentException</span></span><br><span class="line"><span class="comment">     *   如果给定的keys既不是合法的数组，也不可以被转成数组，或者给得的任何一个key不是一个合法的值时，拖出该异常.</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">setMultiple</span>(<span class="params"><span class="variable">$values</span>, <span class="variable">$ttl</span> = <span class="literal">null</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     *  单次操作删除多个缓存项目.</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> iterable $keys 一个基于字符串键列表会被删除</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> bool True 所有项目都成功被删除时回true,有任何错误时返回false</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> \Psr\SimpleCache\InvalidArgumentException</span></span><br><span class="line"><span class="comment">     *   如果给定的keys既不是合法的数组，也不可以被转成数组，或者给得的任何一个key不是一个合法的值时，拖出该异常.</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">deleteMultiple</span>(<span class="params"><span class="variable">$keys</span></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 判断一个项目在缓存中是否存在</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * 注意: has()方法仅仅在缓存预热的场景被推荐使用且不允许的活跃     * 的应用中场景中对get/set方法使用, 因为方法受竞态条件的限制，当     * 你调用has()方法时会立即返回true。另一个脚本可以删除它，使应     * 用状态过期。</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $key 缓存键值</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@return</span> bool  </span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@throws</span> \Psr\SimpleCache\InvalidArgumentException</span></span><br><span class="line"><span class="comment">     *    如果给定的key不是一个合法的字符串时，抛出该异常.</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">has</span>(<span class="params"><span class="variable">$key</span></span>)</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="13-PSR-17-HTTP工厂"><a href="#13-PSR-17-HTTP工厂" class="headerlink" title="13. PSR-17(HTTP工厂)"></a>13. PSR-17(HTTP工厂)</h2><blockquote><p>HTTP 工厂是可以创建由 PSR-7 定义的 HTTP 对象的方法。HTTP 工厂 <strong>必须</strong> 实现包中提供的所有对象类型。</p></blockquote><ol><li>Psr\Http\Message\RequestFactoryInterface</li></ol><hr><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">namespace</span> <span class="title">Psr</span>\<span class="title">Http</span>\<span class="title">Message</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">Psr</span>\<span class="title">Http</span>\<span class="title">Message</span>\<span class="title">RequestInterface</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">Psr</span>\<span class="title">Http</span>\<span class="title">Message</span>\<span class="title">UriInterface</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">RequestFactoryInterface</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 创建一个新的请求</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $method 请求使用的 HTTP 方法。</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> UriInterface|string $uri 请求关联的 URI。</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">createRequest</span>(<span class="params"><span class="keyword">string</span> <span class="variable">$method</span>, <span class="variable">$uri</span></span>): <span class="title">RequestInterface</span></span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><ol start="2"><li>Psr\Http\Message\ResponseFactoryInterface</li></ol><hr><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">namespace</span> <span class="title">Psr</span>\<span class="title">Http</span>\<span class="title">Message</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">Psr</span>\<span class="title">Http</span>\<span class="title">Message</span>\<span class="title">ResponseInterface</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">ResponseFactoryInterface</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="comment">/**</span></span><br><span class="line"><span class="comment">     * 创建一个响应对象。</span></span><br><span class="line"><span class="comment">     *</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> int $code HTTP 状态码，默认值为 200。</span></span><br><span class="line"><span class="comment">     * <span class="doctag">@param</span> string $reasonPhrase 与状态码关联的原因短语。如果未提供，实现 **可能** 使用 HTTP 规范中建议的值。</span></span><br><span class="line"><span class="comment">     */</span></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">createResponse</span>(<span class="params"><span class="keyword">int</span> <span class="variable">$code</span> = <span class="number">200</span>, <span class="keyword">string</span> <span class="variable">$reasonPhrase</span> = <span class="string">&#x27;&#x27;</span></span>): <span class="title">ResponseInterface</span></span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>先写这么多。</p>]]></content>
    
    
    <summary type="html">&lt;h1 id=&quot;PSR笔记&quot;&gt;&lt;a href=&quot;#PSR笔记&quot; class=&quot;headerlink&quot; title=&quot;PSR笔记&quot;&gt;&lt;/a&gt;PSR笔记&lt;/h1&gt;&lt;blockquote&gt;
&lt;p&gt;PSR 是 PHP Standard Recommendations （PHP 推荐标准）的简写，由 &lt;a href=&quot;https://github.com/php-fig&quot;&gt;PHP FIG&lt;/a&gt; 组织制定的 PHP 规范，是 PHP 开发的实践标准。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;1-PSR-0-弃用&quot;&gt;&lt;a href=&quot;#1-PSR-0-弃用&quot; class=&quot;headerlink&quot; title=&quot;1. PSR-0(弃用)&quot;&gt;&lt;/a&gt;1. PSR-0(弃用)&lt;/h2&gt;&lt;h2 id=&quot;2-PSR-1-编码风格&quot;&gt;&lt;a href=&quot;#2-PSR-1-编码风格&quot; class=&quot;headerlink&quot; title=&quot;2. PSR-1(编码风格)&quot;&gt;&lt;/a&gt;2. PSR-1(编码风格)&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;使用PSR-4规范自动加载规范，命名空间&lt;/li&gt;
&lt;li&gt;类名使用大坨峰&lt;/li&gt;
&lt;li&gt;类中的常量使用全大写，下划线&lt;/li&gt;
&lt;li&gt;方法名使用小驼峰&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;3-PSR-2-编码风格&quot;&gt;&lt;a href=&quot;#3-PSR-2-编码风格&quot; class=&quot;headerlink&quot; title=&quot;3. PSR-2(编码风格)&quot;&gt;&lt;/a&gt;3. PSR-2(编码风格)&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;每个namespace和use块后空一行&lt;/li&gt;
&lt;li&gt;花括号自成一行&lt;/li&gt;
&lt;li&gt;控制结构的”{}” ,写在同一行&lt;/li&gt;
&lt;li&gt;true，false，null必须小写&lt;/li&gt;
&lt;li&gt;“()”前后不能有空格&lt;/li&gt;
&lt;li&gt;“}” 和 “(“ 中间有空格&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;4-PSR-3-日志规范&quot;&gt;&lt;a href=&quot;#4-PSR-3-日志规范&quot; class=&quot;headerlink&quot; title=&quot;4. PSR-3(日志规范)&quot;&gt;&lt;/a&gt;4. PSR-3(日志规范)&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;LoggerInterface 定义了8个等级的日志&lt;/li&gt;
&lt;li&gt;Psr\Log\LoggerInterface&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;figure class=&quot;highlight php&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;83&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;84&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;85&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;86&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;87&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;88&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;89&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;90&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;91&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;92&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;93&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;94&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;95&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;96&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;97&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;98&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;99&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;100&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;101&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;102&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;103&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;104&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;105&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;106&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;107&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;108&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;109&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;110&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;111&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;112&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;113&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;Psr&lt;/span&gt;\&lt;span class=&quot;title&quot;&gt;Log&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt; * 描述一个日志记录器实例&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt; *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt; * 该消息必须实现一个__toString()的字符串或者对象.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt; *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt; * 该消息可能包含以下形式的占位符: &amp;#123;foo&amp;#125;  &lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt; * foo 将会被关键词 &amp;quot;foo&amp;quot;中的上下文数据替换.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt; *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt; * 上下文数组可以包含任意数据, 我们只能假设代码实现者&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt; * 如果给出一个生成堆栈跟踪的异常实例, 那么它的键名&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt; * 必须为 &amp;quot;exception&amp;quot;。&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt; *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt; * 请前往 https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt; * 查看完整的接口规范.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt; */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;LoggerInterface&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;comment&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * 系统无法使用。&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; string $message&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; array $context&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@return&lt;/span&gt; void&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;emergency&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$message&lt;/span&gt;, &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;variable&quot;&gt;$context&lt;/span&gt; = &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;)&lt;/span&gt;)&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;comment&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * 必须立即采取行动。&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * 例如: 整个网站宕机了，数据库挂了，等等。 这应该&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * 发送短信通知警告你.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; string $message&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; array $context&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@return&lt;/span&gt; void&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;alert&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$message&lt;/span&gt;, &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;variable&quot;&gt;$context&lt;/span&gt; = &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;)&lt;/span&gt;)&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;comment&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * 临界条件。&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * 例如: 应用组件不可用，意外的异常。&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; string $message&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; array $context&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@return&lt;/span&gt; void&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;critical&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$message&lt;/span&gt;, &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;variable&quot;&gt;$context&lt;/span&gt; = &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;)&lt;/span&gt;)&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;comment&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * 运行时错误不需要马上处理，&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * 但通常应该被记录和监控。&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; string $message&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; array $context&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@return&lt;/span&gt; void&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;error&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$message&lt;/span&gt;, &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;variable&quot;&gt;$context&lt;/span&gt; = &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;)&lt;/span&gt;)&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;comment&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * 例外事件不是错误。&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * 例如: 使用过时的API，API使用不当，不合理的东西不一定是错误。&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; string $message&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; array $context&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@return&lt;/span&gt; void&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;warning&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$message&lt;/span&gt;, &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;variable&quot;&gt;$context&lt;/span&gt; = &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;)&lt;/span&gt;)&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;comment&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * 正常但重要的事件.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; string $message&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; array $context&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@return&lt;/span&gt; void&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;notice&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$message&lt;/span&gt;, &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;variable&quot;&gt;$context&lt;/span&gt; = &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;)&lt;/span&gt;)&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;comment&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * 有趣的事件.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * 例如: 用户登录，SQL日志。&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; string $message&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; array $context&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@return&lt;/span&gt; void&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;info&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$message&lt;/span&gt;, &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;variable&quot;&gt;$context&lt;/span&gt; = &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;)&lt;/span&gt;)&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;comment&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * 详细的调试信息。&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; string $message&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; array $context&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@return&lt;/span&gt; void&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;debug&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$message&lt;/span&gt;, &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;variable&quot;&gt;$context&lt;/span&gt; = &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;)&lt;/span&gt;)&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;comment&quot;&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * 可任意级别记录日志。&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     *&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; mixed $level&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; string $message&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@param&lt;/span&gt; array $context&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     * &lt;span class=&quot;doctag&quot;&gt;@return&lt;/span&gt; void&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;     */&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;log&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$level&lt;/span&gt;, &lt;span class=&quot;variable&quot;&gt;$message&lt;/span&gt;, &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt; &lt;span class=&quot;variable&quot;&gt;$context&lt;/span&gt; = &lt;span class=&quot;keyword&quot;&gt;array&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;)&lt;/span&gt;)&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;h2 id=&quot;5-PSR-4-自动加载&quot;&gt;&lt;a href=&quot;#5-PSR-4-自动加载&quot; class=&quot;headerlink&quot; title=&quot;5. PSR-4(自动加载)&quot;&gt;&lt;/a&gt;5. PSR-4(自动加载)&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;必须拥有一个顶级命名空间，可以有几个子命名空间&lt;/li&gt;
&lt;li&gt;必须有一个类名&lt;/li&gt;
&lt;li&gt;区分大小写&lt;/li&gt;
&lt;/ol&gt;</summary>
    
    
    
    
    <category term="PHP" scheme="https://kgtech.top/tags/PHP/"/>
    
  </entry>
  
  <entry>
    <title>Redis学习笔记(三)</title>
    <link href="https://kgtech.top/2019/09/04/Redis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E4%B8%89/"/>
    <id>https://kgtech.top/2019/09/04/Redis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E4%B8%89/</id>
    <published>2019-09-04T06:32:49.000Z</published>
    <updated>2019-09-04T06:35:44.019Z</updated>
    
    <content type="html"><![CDATA[<h3 id="一、内存回收策略"><a href="#一、内存回收策略" class="headerlink" title="一、内存回收策略"></a>一、内存回收策略</h3><p>使用redis作为缓存服务已经非常常用了，但是如果对于内存并不大的机器来说，就需要对redis占用的内存大小做限制，一般使用”maxmemory”来做限制</p><figure class="highlight gams"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CONFIG <span class="keyword">SET</span> maxmemory <span class="comment">100mb</span></span><br></pre></td></tr></table></figure><p>但是，当你使用达到上限之后，应该如何处理这种情况呢，redis官方提供了几种策略，包括一个近似LRU回收算法。</p><ol><li><strong>noeviction</strong> 这个是默认的策略，即当达到内存限制之后，如果尝试写入时只会报错</li><li><strong>allkeys-lru</strong> 尝试使用近似LRU算法回收最近使用较少的键</li><li><strong>volatile-lru</strong> 尝试使用近似LRU算法回收设置了过期时间的且最近使用较少的键</li><li><strong>allkeys-random</strong> 随机回收键</li><li><strong>volatile-random</strong> 随机回收设置了过期时间的键</li><li><strong>volatile-ttl</strong> 删除过期时间最近的一个键</li></ol><figure class="highlight pgsql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CONFIG <span class="keyword">SET</span> maxmemory-<span class="keyword">policy</span> <span class="keyword">volatile</span>-lru</span><br></pre></td></tr></table></figure><p>回收的一般过程：</p><ol><li>客户端发起了写入请求，想要添加数据</li><li>redis检查内存使用情况，如果大于maxmemory，根据设定好的策略进行回收。</li><li>再执行写入请求</li></ol><h3 id="二、缓存策略"><a href="#二、缓存策略" class="headerlink" title="二、缓存策略"></a>二、缓存策略</h3><p>redis作为高速缓存的解决方案也存在一些问题</p><h4 id="1-缓存穿透"><a href="#1-缓存穿透" class="headerlink" title="1.缓存穿透"></a>1.缓存穿透</h4><p>当客户端指定查询一个缓存和数据都肯定不存在的数据的时候，如果没有做好考虑，那么会导致程序不停的去查询数据库，产生大量的数据库查询。如果并发大的时候，还有可能拖垮数据库。<br><strong>解决方案</strong>：一般的做法就是，即使数据库查询的数据为空，也把空的结果放入redis中并且设置一个短的过期时间，这样下次查询的时候就直接把缓存中的数据返回，避免了缓存穿透</p><h4 id="2-缓存雪崩"><a href="#2-缓存雪崩" class="headerlink" title="2.缓存雪崩"></a>2.缓存雪崩</h4><p>当设置的缓存数据集中在某一时刻过期的时候，此时大量的查询将直接转发到了数据库上，导致瞬间压力上升<br><strong>解决方案</strong>：一般的做法是尽量避免设置同一个过期时间，可以在过期时间上加一个1-5分钟的随机值，从而保证数据不会同一时间集中过期。另外如果是经常使用的热点数据，可以设置永不过期</p><h4 id="3-缓存击穿"><a href="#3-缓存击穿" class="headerlink" title="3.缓存击穿"></a>3.缓存击穿</h4><p>如果某少数key过期之后，产生了大量的对这些key的并发请求，也会造成类似于缓存雪崩的问题。<br><strong>解决方案</strong>：一般使用锁来保证，当判断缓存失效的时候，先使用SETNX方法，set一个互斥锁，操作成功之后再去访问数据库。具体如何使用redis锁的方法下一篇研究</p><p>参考文章：<a href="https://blog.csdn.net/doujinlong1/article/details/82024340">高并发缓存处理之——缓存穿透的几种形式及解决方案</a></p><p>前期回顾：<br><a href="https://kgtech.top/2019/03/09/Redis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E4%B8%80/">Redis学习笔记(一)</a><br><a href="https://kgtech.top/2019/05/08/Redis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E4%BA%8C/">Redis学习笔记(二)</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;一、内存回收策略&quot;&gt;&lt;a href=&quot;#一、内存回收策略&quot; class=&quot;headerlink&quot; title=&quot;一、内存回收策略&quot;&gt;&lt;/a&gt;一、内存回收策略&lt;/h3&gt;&lt;p&gt;使用redis作为缓存服务已经非常常用了，但是如果对于内存并不大的机器来说，就需要对redi</summary>
      
    
    
    
    
    <category term="redis" scheme="https://kgtech.top/tags/redis/"/>
    
  </entry>
  
  <entry>
    <title>PHP知识点整理(四)-PHP-FPM</title>
    <link href="https://kgtech.top/2019/09/02/PHP%E7%9F%A5%E8%AF%86%E7%82%B9%E6%95%B4%E7%90%86-%E5%9B%9B-PHP-FPM/"/>
    <id>https://kgtech.top/2019/09/02/PHP%E7%9F%A5%E8%AF%86%E7%82%B9%E6%95%B4%E7%90%86-%E5%9B%9B-PHP-FPM/</id>
    <published>2019-09-02T12:10:44.000Z</published>
    <updated>2019-09-03T08:42:38.903Z</updated>
    
    <content type="html"><![CDATA[<p>PHP-FPM是PHP FastCGI运行模式的一个进程管理器，并且作为web服务器和php-cli之间的桥梁，负责转发来自web服务器的http请求以及将php处理好的response转发给web服务器。<br><img src="https://i.loli.net/2019/09/02/PRip3qjBOZaMLyK.png" alt="nginx和php-fpm之间的关系"><br>一、 PHP-FPM有以下特点:</p><ol><li>自从PHP5.4之后，PHP-FPM就汇入php的核心代码里了，在编译的时候”–enable-php-fpm”就可以了</li><li>区别于cgi的启动和退出的模式，php-fpm启动之后就会维护一定数量实现了php-cgi的进程，来处理请求</li><li>php-fpm是管理一系列php-cgi的程序，因为php-cgi本身只能解析请求，并不会管理进程，所以需要一个程序来管理一系列进程</li><li>php-fpm有两种监听模式，一种是监听TCP端口，另一种为Unix domain socket模式。如果你的web服务器和php-fpm不在同一台机器上时，就只能使用TCP端口模式，当然这种模式需要握手建立连接等过程后才能通信。如果你的web服务器和php-fpm在同一台机器上，就可以使用Unix domain socket，这种模式是可以在同一台机器上的不同进程间使用字节流或者数据队列进行数据通信，理论上会比第一种效率更高一点。</li></ol><p>二、 Opcache<br>首先要了解一次完整的HTTP请求到PHP脚本的过程:<br>以nginx+php-fpm为例</p><ol><li>nginx识别请求的为php脚本，并把请求转给php-fpm</li><li>php-fpm将请求进一步交给其中一个子进程</li><li>子进程找到对应的php脚本然后读取，编译成字节码或者操作码，执行</li><li>将生成的响应层一层层返回给http客户端</li></ol><p>可以看到，由于php语言本身的特性，php脚本的执行是一边编译一边执行的，而且产生的不是机器码，而是中间码，再由解析器(Zend)来执行，所以速度上取决于编译的速度和解析器的性能。<br>自从php5.5之后，可以使用官方提供的Opcache，来提高性能。其中的原理就是，将中间码也就是缓存起来，假如第二还是执行同样的文件时，就可以直接将缓存的中间码给解析器解析就行了，省去了编译的过程，一定程度上提高了运行速度。</p><p>自己也稍微测试了一下，测试最简单的接口，速度从原来的105ms，下降到了45ms，快了近一倍。<br><img src="https://i.loli.net/2019/09/02/pgVeOFnlRymjhuB.png" alt="未开启opcache"><br><img src="https://i.loli.net/2019/09/02/8RZNErPSetUAsun.png" alt="开启opcache"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;PHP-FPM是PHP FastCGI运行模式的一个进程管理器，并且作为web服务器和php-cli之间的桥梁，负责转发来自web服务器的http请求以及将php处理好的response转发给web服务器。&lt;br&gt;&lt;img src=&quot;https://i.loli.net/2</summary>
      
    
    
    
    
    <category term="php" scheme="https://kgtech.top/tags/php/"/>
    
  </entry>
  
  <entry>
    <title>SSL证书申请历程</title>
    <link href="https://kgtech.top/2019/08/28/SSL%E8%AF%81%E4%B9%A6%E7%94%B3%E8%AF%B7%E5%8E%86%E7%A8%8B/"/>
    <id>https://kgtech.top/2019/08/28/SSL%E8%AF%81%E4%B9%A6%E7%94%B3%E8%AF%B7%E5%8E%86%E7%A8%8B/</id>
    <published>2019-08-28T06:13:07.000Z</published>
    <updated>2019-08-29T02:12:54.445Z</updated>
    
    <content type="html"><![CDATA[<p>一、 安装acme.sh</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">1.mkdir ~/.acme.sh</span><br><span class="line"></span><br><span class="line">2. 在~/.acme.sh目录下运行</span><br><span class="line">curl  https://get.acme.sh | sh</span><br><span class="line">等待安装完成</span><br><span class="line"></span><br><span class="line">3. <span class="built_in">alias</span> acme.sh=~/.acme.sh/acme.sh</span><br><span class="line"></span><br><span class="line">4. 编译安装socat</span><br><span class="line">wget http://www.dest-unreach.org/socat/download/socat-1.7.3.2.tar.gz</span><br><span class="line">./configure --prefix=<span class="variable">$HOME</span> &amp;&amp; make &amp;&amp; make install </span><br></pre></td></tr></table></figure><p>二、 关闭nginx服务器，确保80和443端口是通的<br>三、使用acme.sh申请和安装证书</p><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">1.acme.sh假装自己是一个webserver,临时监听80端口, 完成验证</span><br><span class="line">acme.sh --issue --standalone -d example.com </span><br><span class="line"></span><br><span class="line">安装完成后会告诉你证书的安装地址一般是在/root/.acme.sh/example.com/</span><br><span class="line"></span><br><span class="line">2.验证完成之后记得启动nginx服务器</span><br><span class="line">/path/to/nginx/nginx/sbin/nginx</span><br><span class="line"></span><br><span class="line">3. 安装证书</span><br><span class="line">acme.sh --installcert -d example.com \</span><br><span class="line">--keypath /path/to/nginx/ssl/example.com.key \</span><br><span class="line">--fullchainpath  /path/to/nginx/ssl/example.com.key.pem \</span><br><span class="line">--reloadcmd <span class="string">&quot;/path/to/nginx/nginx/sbin/nginx -s reload&quot;</span></span><br><span class="line"></span><br><span class="line">4. 运行以下命令</span><br><span class="line">openssl dhparam -out /path/to/nginx/ssl/dhparam.pem 2048</span><br></pre></td></tr></table></figure><p>四、更新nginx配置文件(放在server模块里面)</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">listen</span>   <span class="number">80</span> ;</span><br><span class="line"><span class="attribute">listen</span>   <span class="number">443</span>  ssl;</span><br><span class="line"><span class="attribute">server_name</span>  example.com;</span><br><span class="line"><span class="attribute">charset</span> utf-<span class="number">8</span>;</span><br><span class="line"><span class="comment">#HTTP_TO_HTTPS_START</span></span><br><span class="line"><span class="attribute">if</span> ($server_port !<span class="regexp">~ 443)</span>&#123;</span><br><span class="line">    <span class="attribute">rewrite</span><span class="regexp"> ^(/.*)$</span> https://$host<span class="variable">$1</span> <span class="literal">permanent</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">#HTTP_TO_HTTPS_END</span></span><br><span class="line"><span class="comment">#SSL_START</span></span><br><span class="line"><span class="attribute">ssl_certificate</span>    /path/to/nginx/ssl/example.com.key.pem;</span><br><span class="line"><span class="attribute">ssl_certificate_key</span>     /path/to/nginx/ssl/example.com.key;</span><br><span class="line"><span class="attribute">ssl_dhparam</span>       /path/to/nginx/ssl/dhparam.pem;</span><br><span class="line"><span class="attribute">ssl_protocols</span> TLSv1 TLSv1.<span class="number">1</span> TLSv1.<span class="number">2</span>;</span><br><span class="line"><span class="attribute">ssl_ciphers</span> ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;</span><br><span class="line"><span class="attribute">ssl_prefer_server_ciphers</span> <span class="literal">on</span>;</span><br><span class="line"><span class="attribute">ssl_session_cache</span> shared:SSL:<span class="number">10m</span>;</span><br><span class="line"><span class="attribute">ssl_session_timeout</span> <span class="number">10m</span>;</span><br><span class="line"><span class="attribute">error_page</span> <span class="number">497</span>  https://$host$request_uri;</span><br><span class="line"><span class="comment">#SSL_END</span></span><br></pre></td></tr></table></figure><hr><p>然后reload一下nginx，就大功告成了！</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;一、 安装acme.sh&lt;/p&gt;
&lt;figure class=&quot;highlight sh&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/spa</summary>
      
    
    
    
    
    <category term="技巧" scheme="https://kgtech.top/tags/%E6%8A%80%E5%B7%A7/"/>
    
  </entry>
  
  <entry>
    <title>PHP知识点整理(三) - 基础排序算法</title>
    <link href="https://kgtech.top/2019/07/30/PHP%E7%9F%A5%E8%AF%86%E7%82%B9%E6%95%B4%E7%90%86-%E4%B8%89-%E5%9F%BA%E7%A1%80%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/"/>
    <id>https://kgtech.top/2019/07/30/PHP%E7%9F%A5%E8%AF%86%E7%82%B9%E6%95%B4%E7%90%86-%E4%B8%89-%E5%9F%BA%E7%A1%80%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/</id>
    <published>2019-07-30T03:59:34.000Z</published>
    <updated>2020-07-24T03:17:50.665Z</updated>
    
    <content type="html"><![CDATA[<p>了解如何快速使用程序进行排序，对于程序运行速度的提升，对于程序的优化有着很关键的作用，今天先来总结一下几种最基础也是最经典的排序算法。</p><h3 id="一、冒泡排序"><a href="#一、冒泡排序" class="headerlink" title="一、冒泡排序"></a>一、冒泡排序</h3><p>依次比较相邻两个元素大小，将小的的放前面，大的放后面，直至最后两个数。</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">BubbleSort</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">bubbleSort</span>(<span class="params"><span class="variable">$array</span></span>)</span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (!is_array(<span class="variable">$array</span>))&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">if</span> (count(<span class="variable">$array</span>) &lt;<span class="number">2</span>) <span class="keyword">return</span> <span class="variable">$array</span>;</span><br><span class="line">    <span class="variable">$length</span> = count(<span class="variable">$array</span>);</span><br><span class="line">    <span class="keyword">for</span> (<span class="variable">$i</span> = <span class="number">0</span>;<span class="variable">$i</span>&lt;<span class="variable">$length</span>-<span class="number">1</span>; <span class="variable">$i</span>++)&#123;</span><br><span class="line">        <span class="keyword">for</span> (<span class="variable">$j</span> = <span class="number">0</span>; <span class="variable">$j</span>&lt;<span class="variable">$length</span>-<span class="variable">$i</span>-<span class="number">1</span>;<span class="variable">$j</span>++)&#123;</span><br><span class="line">            <span class="keyword">if</span> (<span class="variable">$array</span>[<span class="variable">$j</span>] &gt;<span class="variable">$array</span>[<span class="variable">$j</span>+<span class="number">1</span>]) &#123;</span><br><span class="line">                <span class="variable">$temp</span> = <span class="variable">$array</span>[<span class="variable">$j</span>];</span><br><span class="line">                <span class="variable">$array</span>[<span class="variable">$j</span>] = <span class="variable">$array</span>[<span class="variable">$j</span>+<span class="number">1</span>];</span><br><span class="line">                <span class="variable">$array</span>[<span class="variable">$j</span>+<span class="number">1</span>] = <span class="variable">$temp</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable">$array</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable">$arr</span> = [<span class="number">2</span>,<span class="number">6</span>,<span class="number">2</span>,<span class="number">8</span>,<span class="number">2</span>,<span class="number">34</span>,<span class="number">5</span>,<span class="number">9</span>,<span class="number">2341</span>,<span class="number">23</span>];</span><br><span class="line">var_dump(bubbleSort(<span class="variable">$arr</span>));</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><span id="more"></span><h3 id="二、快速排序"><a href="#二、快速排序" class="headerlink" title="二、快速排序"></a>二、快速排序</h3><ol><li>从序列当中选择一个基准数，一般取第一个</li><li>将序列当中的所有数依次遍历，比基准数大的位于其右侧，比基准数小的位于其左侧。</li><li>重复前两个步骤，直到所有子集当中只有一个元素为止。</li></ol><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">QuickSort</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">quickSort</span>(<span class="params"><span class="variable">$arr</span></span>)</span>&#123;</span><br><span class="line">    <span class="keyword">if</span>(!is_array(<span class="variable">$arr</span>)) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">    <span class="variable">$length</span> = count(<span class="variable">$arr</span>);</span><br><span class="line">    <span class="keyword">if</span> (<span class="variable">$length</span> &lt;=<span class="number">1</span>) <span class="keyword">return</span> <span class="variable">$arr</span>;</span><br><span class="line"></span><br><span class="line">    <span class="variable">$left</span> = <span class="variable">$right</span> = <span class="keyword">array</span>();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="variable">$i</span>=<span class="number">1</span>;<span class="variable">$i</span>&lt;<span class="variable">$length</span>;<span class="variable">$i</span>++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">if</span> (<span class="variable">$arr</span>[<span class="variable">$i</span>] &lt; <span class="variable">$arr</span>[<span class="number">0</span>])</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="variable">$left</span>[] = <span class="variable">$arr</span>[<span class="variable">$i</span>];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="variable">$right</span>[] = <span class="variable">$arr</span>[<span class="variable">$i</span>];</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="variable">$left</span> = quickSort(<span class="variable">$left</span>);</span><br><span class="line">    <span class="variable">$right</span> = quickSort(<span class="variable">$right</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> array_merge(<span class="variable">$left</span>,[<span class="variable">$arr</span>[<span class="number">0</span>]],<span class="variable">$right</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="variable">$arr</span> = [<span class="number">34</span>,<span class="number">56</span>,<span class="number">8</span>,<span class="number">79</span>,<span class="number">12</span>,<span class="number">3</span>];</span><br><span class="line">var_dump(quick_sort(<span class="variable">$arr</span>));</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h3 id="三、插入排序"><a href="#三、插入排序" class="headerlink" title="三、插入排序"></a>三、插入排序</h3><p>每次从无序列表中取出第一个元素，把他插入到有序表中的合适位置，使有序表仍然有序</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">InsertSort</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">insertSort</span>(<span class="params"><span class="variable">$arr</span></span>)</span>&#123;</span><br><span class="line">    <span class="keyword">if</span> (count(<span class="variable">$arr</span>)&lt;<span class="number">2</span>) <span class="keyword">return</span> <span class="variable">$arr</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (!is_array(<span class="variable">$arr</span>)) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">    <span class="variable">$length</span> = count(<span class="variable">$arr</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="variable">$p</span> = <span class="number">1</span>; <span class="variable">$p</span>&lt;<span class="variable">$length</span>; <span class="variable">$p</span>++)&#123;</span><br><span class="line">        <span class="variable">$temp</span> = <span class="variable">$arr</span>[<span class="variable">$p</span>];</span><br><span class="line">        <span class="keyword">for</span> (<span class="variable">$i</span> = <span class="variable">$p</span> ; <span class="variable">$i</span>&gt;<span class="number">0</span>&amp;&amp; <span class="variable">$arr</span>[<span class="variable">$i</span>-<span class="number">1</span>]&gt;<span class="variable">$temp</span>;<span class="variable">$i</span>--)&#123;</span><br><span class="line">            <span class="variable">$arr</span>[<span class="variable">$i</span>] = <span class="variable">$arr</span>[<span class="variable">$i</span>-<span class="number">1</span>];</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="variable">$arr</span>[<span class="variable">$i</span>] = <span class="variable">$temp</span>;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable">$arr</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="variable">$arr</span> = [<span class="number">34</span>,<span class="number">56</span>,<span class="number">8</span>,<span class="number">79</span>,<span class="number">12</span>,<span class="number">3</span>];</span><br><span class="line">var_dump(insertSort(<span class="variable">$arr</span>));</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h3 id="四、选择排序"><a href="#四、选择排序" class="headerlink" title="四、选择排序"></a>四、选择排序</h3><p>每次从待排序的元素中的第一个元素，设为最小值，再遍历每一个没有排序的元素，如果元素小于现在的最小值，就将这个元素设为最小值和第一个没有排过序的元素交换位置。</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">SelectSort</span>;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">selectSort</span>(<span class="params"><span class="variable">$arr</span></span>)</span>&#123;</span><br><span class="line">    <span class="variable">$length</span> = count(<span class="variable">$arr</span>);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="variable">$i</span> =<span class="number">0</span>;<span class="variable">$i</span>&lt;<span class="variable">$length</span>;<span class="variable">$i</span>++)&#123;</span><br><span class="line">        <span class="variable">$min</span> = <span class="variable">$i</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="variable">$j</span> = <span class="variable">$i</span>+<span class="number">1</span>; <span class="variable">$j</span>&lt;<span class="variable">$length</span>;<span class="variable">$j</span>++)&#123;</span><br><span class="line">            <span class="keyword">if</span> (<span class="variable">$arr</span>[<span class="variable">$j</span>]&lt;<span class="variable">$arr</span>[<span class="variable">$min</span>])&#123;</span><br><span class="line">                <span class="variable">$min</span> = <span class="variable">$j</span>;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (<span class="variable">$min</span> != <span class="variable">$i</span>) &#123;</span><br><span class="line">            <span class="keyword">list</span>(<span class="variable">$arr</span>[<span class="variable">$i</span>], <span class="variable">$arr</span>[<span class="variable">$min</span>]) = [<span class="variable">$arr</span>[<span class="variable">$min</span>], <span class="variable">$arr</span>[<span class="variable">$i</span>]];</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> <span class="variable">$arr</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable">$arr</span> = [<span class="number">34</span>,<span class="number">56</span>,<span class="number">8</span>,<span class="number">79</span>,<span class="number">12</span>,<span class="number">3</span>];</span><br><span class="line">var_dump(selectSort(<span class="variable">$arr</span>));</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;了解如何快速使用程序进行排序，对于程序运行速度的提升，对于程序的优化有着很关键的作用，今天先来总结一下几种最基础也是最经典的排序算法。&lt;/p&gt;
&lt;h3 id=&quot;一、冒泡排序&quot;&gt;&lt;a href=&quot;#一、冒泡排序&quot; class=&quot;headerlink&quot; title=&quot;一、冒泡排序&quot;&gt;&lt;/a&gt;一、冒泡排序&lt;/h3&gt;&lt;p&gt;依次比较相邻两个元素大小，将小的的放前面，大的放后面，直至最后两个数。&lt;/p&gt;
&lt;figure class=&quot;highlight php&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;24&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;BubbleSort&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;bubbleSort&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$array&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; (!is_array(&lt;span class=&quot;variable&quot;&gt;$array&lt;/span&gt;))&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;literal&quot;&gt;false&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; (count(&lt;span class=&quot;variable&quot;&gt;$array&lt;/span&gt;) &amp;lt;&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt;) &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;variable&quot;&gt;$array&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;variable&quot;&gt;$length&lt;/span&gt; = count(&lt;span class=&quot;variable&quot;&gt;$array&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;variable&quot;&gt;$i&lt;/span&gt; = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;span class=&quot;variable&quot;&gt;$i&lt;/span&gt;&amp;lt;&lt;span class=&quot;variable&quot;&gt;$length&lt;/span&gt;-&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;; &lt;span class=&quot;variable&quot;&gt;$i&lt;/span&gt;++)&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;keyword&quot;&gt;for&lt;/span&gt; (&lt;span class=&quot;variable&quot;&gt;$j&lt;/span&gt; = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;; &lt;span class=&quot;variable&quot;&gt;$j&lt;/span&gt;&amp;lt;&lt;span class=&quot;variable&quot;&gt;$length&lt;/span&gt;-&lt;span class=&quot;variable&quot;&gt;$i&lt;/span&gt;-&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;;&lt;span class=&quot;variable&quot;&gt;$j&lt;/span&gt;++)&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;            &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; (&lt;span class=&quot;variable&quot;&gt;$array&lt;/span&gt;[&lt;span class=&quot;variable&quot;&gt;$j&lt;/span&gt;] &amp;gt;&lt;span class=&quot;variable&quot;&gt;$array&lt;/span&gt;[&lt;span class=&quot;variable&quot;&gt;$j&lt;/span&gt;+&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;]) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                &lt;span class=&quot;variable&quot;&gt;$temp&lt;/span&gt; = &lt;span class=&quot;variable&quot;&gt;$array&lt;/span&gt;[&lt;span class=&quot;variable&quot;&gt;$j&lt;/span&gt;];&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                &lt;span class=&quot;variable&quot;&gt;$array&lt;/span&gt;[&lt;span class=&quot;variable&quot;&gt;$j&lt;/span&gt;] = &lt;span class=&quot;variable&quot;&gt;$array&lt;/span&gt;[&lt;span class=&quot;variable&quot;&gt;$j&lt;/span&gt;+&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;];&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                &lt;span class=&quot;variable&quot;&gt;$array&lt;/span&gt;[&lt;span class=&quot;variable&quot;&gt;$j&lt;/span&gt;+&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;] = &lt;span class=&quot;variable&quot;&gt;$temp&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;            &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;variable&quot;&gt;$array&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$arr&lt;/span&gt; = [&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt;,&lt;span class=&quot;number&quot;&gt;6&lt;/span&gt;,&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt;,&lt;span class=&quot;number&quot;&gt;8&lt;/span&gt;,&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt;,&lt;span class=&quot;number&quot;&gt;34&lt;/span&gt;,&lt;span class=&quot;number&quot;&gt;5&lt;/span&gt;,&lt;span class=&quot;number&quot;&gt;9&lt;/span&gt;,&lt;span class=&quot;number&quot;&gt;2341&lt;/span&gt;,&lt;span class=&quot;number&quot;&gt;23&lt;/span&gt;];&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;var_dump(bubbleSort(&lt;span class=&quot;variable&quot;&gt;$arr&lt;/span&gt;));&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    
    <category term="php" scheme="https://kgtech.top/tags/php/"/>
    
  </entry>
  
  <entry>
    <title>初识RabbitMQ(一)</title>
    <link href="https://kgtech.top/2019/07/26/%E5%88%9D%E8%AF%86RabbitMQ-%E4%B8%80/"/>
    <id>https://kgtech.top/2019/07/26/%E5%88%9D%E8%AF%86RabbitMQ-%E4%B8%80/</id>
    <published>2019-07-26T09:25:06.000Z</published>
    <updated>2019-08-16T07:08:39.840Z</updated>
    
    <content type="html"><![CDATA[<p>最近在给自己的服务进行解耦，就需要用到消息队列，虽然Redis能够实现消息队列，但是对于实时性要求没有太高，于是就想到了各种MQ产品，目前市面上有很多，比如ActiveMQ,RabbitMQ,Kafka,ZeroMQ,RocketMQ等等。<br>对比了一下各家的MQ产品，最终看中了RabbitMQ。RabbitMQ是用Erlang作为开发语言进行开发的开源消息队列，所以在使用RabbitMQ之前，得先配好Erlang的环境，当然本身支持很多协议包括:AMQP,XMPP,SMTP等。</p><h3 id="一、三个角色"><a href="#一、三个角色" class="headerlink" title="一、三个角色"></a>一、三个角色</h3><p>对于MQ产品而言，一般包含三种角色：</p><ol><li>生产者(Producer)</li><li>队列(queue)</li><li>消费者(consumer)</li></ol><p>一个大致的流程就是生产者产生消息，消息包括两个部分：<strong>有效载荷(payload)<strong>和</strong>标签(label)<strong>，并将消息放入队列中，这个时候生产者的任务就完成了，队列服务器会根据标签信息发送给对应的消费者，等待消费者去消费就行了，当消费者消费消息的时候只会得到消息的有效载荷。<br>另外生产者、队列以及消费者可以不放在同一台机器上，在某种程度上也是一种</strong>解耦</strong>。</p><h3 id="二、信道"><a href="#二、信道" class="headerlink" title="二、信道"></a>二、信道</h3><p>在消费者或者生产者与RabbitMQ服务器之间除了创建了一条TCP连接，还需要在这条连接上建立一条虚拟的信道(channel)，每一条信道都会有被指派一个唯一ID保存在服务器上，所有的发送、传送和接收消息都是在这条信道上完成的。<br>这样做的好处就是在消息量大的时候，相对于每一个线程创建一个TCP连接，信道的模式能够减少创建TCP连接带来的开销，保障了时效性。</p><h3 id="三、消息确认"><a href="#三、消息确认" class="headerlink" title="三、消息确认"></a>三、消息确认</h3><p>为了保障消息队列的可靠性，MQ产品设计了一个消息消费确认机制，当生产者将消息放在队列上等待消费者消费时，消费者每接收到一条消息，都必须进行确认，这里有两种情况，一种是手动确认，一种是自动确认。</p><ol><li>手动确认是指当消费者接收到消息时，显示地向RabbitMQ服务发送一个确认，这样做的好处是，当应用程序有BUG忘记确认消息或者出现格式错误导致无法处理而崩溃时，RabbitMQ则不会继续发送更多的消息给消费者，防止消息的丢失</li><li>自动确认是指一旦消费者接收到消息之后，RabbitMQ服务器将会自动确认已经正确接收到消息了，这样做对于一些简单的消息来说，提高了效率。</li><li>当然如果程序出现问题时也可以主动拒收消息，这个时候消费者可以向RabbitMQ服务器发送一个reject命令，当服务器接收到后会将这条信息放入“死信”(dead letter)队列，这个队列专门存放那些被拒绝又不重新入队的消息，这样通过监控死信队列可以及时发现问题。</li></ol><h3 id="四、几种工作模式"><a href="#四、几种工作模式" class="headerlink" title="四、几种工作模式"></a>四、几种工作模式</h3><h4 id="1-简单队列"><a href="#1-简单队列" class="headerlink" title="1. 简单队列"></a>1. 简单队列</h4><p>一个生产者，一条队列，一个消费者。<br><img src="https://i.loli.net/2019/07/26/5d3ab67d33cf393570.png" alt="简单队列"></p><h4 id="2-Work模式"><a href="#2-Work模式" class="headerlink" title="2. Work模式"></a>2. Work模式</h4><p>两个消费者，一条消息只能被一个消费者消费，分摊消费压力，有点负载均衡的意思。<br><img src="https://i.loli.net/2019/07/26/5d3ab7ed86cd228166.png" alt="Work模式"></p><h4 id="3-发布-订阅模式"><a href="#3-发布-订阅模式" class="headerlink" title="3. 发布/订阅模式"></a>3. 发布/订阅模式</h4><p>可以有多个消费者，而每个消费者都有自己的队列，每个队列要绑定到交换器，发送者将消息交给交换器，交换器根据绑定时指定的binding key，将消息放进对应的队列<br><img src="https://i.loli.net/2019/08/16/rlOiYGgILCADoKB.png" alt="发布/订阅模式"></p><p>交换器有4种类型:</p><ul><li>direct</li><li>fanout</li><li>topic</li><li>headers</li></ul><h4 id="4-路由模式"><a href="#4-路由模式" class="headerlink" title="4. 路由模式"></a>4. 路由模式</h4><p>交换器为direct，交换器根据不同的路由键(routing key)，放进不同的队列中，可以有个路由键对应同一条队列</p><p><img src="https://i.loli.net/2019/07/26/5d3abf4eb95fe28170.png" alt="路由模式"></p><h4 id="5-主题模式"><a href="#5-主题模式" class="headerlink" title="5. 主题模式"></a>5. 主题模式</h4><p>主题模式也就是通配符模式。同一个消息被多个消费者获取。一个消费者队列可以有多个消费者实例，只有其中一个消费者实例会消费到消息。<br><img src="https://i.loli.net/2019/07/26/5d3ac653f22aa59485.png" alt="主题模式"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;最近在给自己的服务进行解耦，就需要用到消息队列，虽然Redis能够实现消息队列，但是对于实时性要求没有太高，于是就想到了各种MQ产品，目前市面上有很多，比如ActiveMQ,RabbitMQ,Kafka,ZeroMQ,RocketMQ等等。&lt;br&gt;对比了一下各家的MQ产品，</summary>
      
    
    
    
    
    <category term="mq" scheme="https://kgtech.top/tags/mq/"/>
    
  </entry>
  
  <entry>
    <title>PHP知识点整理(三) - 工厂模式</title>
    <link href="https://kgtech.top/2019/07/25/PHP%E7%9F%A5%E8%AF%86%E7%82%B9%E6%95%B4%E7%90%86-%E4%B8%89-%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/"/>
    <id>https://kgtech.top/2019/07/25/PHP%E7%9F%A5%E8%AF%86%E7%82%B9%E6%95%B4%E7%90%86-%E4%B8%89-%E5%B7%A5%E5%8E%82%E6%A8%A1%E5%BC%8F/</id>
    <published>2019-07-25T00:03:11.000Z</published>
    <updated>2020-07-24T03:18:59.411Z</updated>
    
    <content type="html"><![CDATA[<h3 id="1-简单工厂模式"><a href="#1-简单工厂模式" class="headerlink" title="1. 简单工厂模式"></a>1. 简单工厂模式</h3><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">Math</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="function"><span class="keyword">function</span> <span class="title">calc</span>(<span class="params"><span class="variable">$num1</span>, <span class="variable">$num2</span></span>)</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Add</span> <span class="keyword">implements</span> <span class="title">Math</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">calc</span>(<span class="params"><span class="variable">$num1</span>, <span class="variable">$num2</span></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="comment">// <span class="doctag">TODO:</span> Implement calc() method.</span></span><br><span class="line">        <span class="keyword">return</span> <span class="variable">$num1</span> + <span class="variable">$num2</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Sub</span> <span class="keyword">implements</span> <span class="title">Math</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">calc</span>(<span class="params"><span class="variable">$num1</span>, <span class="variable">$num2</span></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="comment">// <span class="doctag">TODO:</span> Implement calc() method.</span></span><br><span class="line">        <span class="keyword">return</span> <span class="variable">$num1</span> - <span class="variable">$num2</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Cal</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">static</span> <span class="function"><span class="keyword">function</span> <span class="title">getMath</span>(<span class="params"><span class="variable">$type</span></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="keyword">switch</span> (<span class="variable">$type</span>) &#123;</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&quot;+&quot;</span> :</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">new</span> Add();</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">case</span> <span class="string">&quot;-&quot;</span> :</span><br><span class="line">                <span class="keyword">return</span> <span class="keyword">new</span> Sub();</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            <span class="keyword">default</span> :</span><br><span class="line">                <span class="keyword">die</span>(<span class="string">&quot;不支持其他计算方法&quot;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable">$math</span> = Cal::getMath(<span class="string">&quot;+&quot;</span>);</span><br><span class="line">var_dump(<span class="variable">$math</span>-&gt;calc(<span class="number">1</span>,<span class="number">2</span>));</span><br><span class="line"><span class="variable">$math2</span> = Cal::getMath(<span class="string">&quot;-&quot;</span>);</span><br><span class="line">var_dump(<span class="variable">$math2</span>-&gt;calc(<span class="number">3</span>,<span class="number">2</span>));</span><br></pre></td></tr></table></figure><p>好处就是，只需要管理getMath里面的类型就行了，不需要管如何实现的，但是缺点就是，当需要实现的方法较多时就比较麻烦，每增加一种，就需要增加一个类型。</p><h3 id="2-工厂模式"><a href="#2-工厂模式" class="headerlink" title="2. 工厂模式"></a>2. 工厂模式</h3><p>定义工厂的接口，让工厂的子类来确定实例化哪一个具体的产品类，延迟了类的实例化。</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">FactoryMethod2</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//父类</span></span><br><span class="line"><span class="keyword">abstract</span> <span class="class"><span class="keyword">class</span> <span class="title">Math</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">abstract</span> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">create</span>(<span class="params"></span>)</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//操作类</span></span><br><span class="line"><span class="keyword">abstract</span> <span class="class"><span class="keyword">class</span> <span class="title">Operation</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">protected</span> <span class="variable">$num1</span> = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">protected</span> <span class="variable">$num2</span> = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">setNum1</span>(<span class="params"><span class="variable">$num1</span></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;num1 = <span class="variable">$num1</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">setNum2</span>(<span class="params"><span class="variable">$num2</span></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;num2 = <span class="variable">$num2</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">abstract</span> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">calc</span>(<span class="params"></span>)</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Add</span> <span class="keyword">extends</span> <span class="title">Operation</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">calc</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">$this</span>-&gt;num1 + <span class="keyword">$this</span>-&gt;num2;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Sub</span> <span class="keyword">extends</span> <span class="title">Operation</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">calc</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">$this</span>-&gt;num1 - <span class="keyword">$this</span>-&gt;num2;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//工厂类</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">AddFactory</span> <span class="keyword">extends</span> <span class="title">Math</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">create</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="comment">// <span class="doctag">TODO:</span> Implement create() method.</span></span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> Add();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//工厂类</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">SubFactory</span> <span class="keyword">extends</span> <span class="title">Math</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">create</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="comment">// <span class="doctag">TODO:</span> Implement create() method.</span></span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> Sub();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable">$factory1</span> = <span class="keyword">new</span> AddFactory();</span><br><span class="line"><span class="variable">$math1</span> = <span class="variable">$factory1</span>-&gt;create();</span><br><span class="line"><span class="variable">$math1</span>-&gt;setNum1(<span class="number">1</span>);</span><br><span class="line"><span class="variable">$math1</span>-&gt;setNum2(<span class="number">2</span>);</span><br><span class="line">var_dump(<span class="variable">$math1</span>-&gt;calc());</span><br><span class="line"></span><br><span class="line"><span class="variable">$factory2</span> = <span class="keyword">new</span> SubFactory();</span><br><span class="line"><span class="variable">$math2</span> = <span class="variable">$factory2</span>-&gt;create();</span><br><span class="line"><span class="variable">$math2</span>-&gt;setNum1(<span class="number">2</span>);</span><br><span class="line"><span class="variable">$math2</span>-&gt;setNum2(<span class="number">1</span>);</span><br><span class="line">var_dump(<span class="variable">$math2</span>-&gt;calc());</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><span id="more"></span><h3 id="3-抽象工厂模式"><a href="#3-抽象工厂模式" class="headerlink" title="3. 抽象工厂模式"></a>3. 抽象工厂模式</h3><p>抽象工厂模式和工厂模式最大的区别就是把对象的创建抽象成了接口</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">FactoryMethod3</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">User</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">insert</span>(<span class="params"></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">select</span>(<span class="params"></span>)</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">Factory</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">createUser</span>(<span class="params"></span>)</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">createArticle</span>(<span class="params"></span>)</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">MySqlUser</span> <span class="keyword">implements</span> <span class="title">User</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">insert</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="comment">// <span class="doctag">TODO:</span> Implement insert() method.</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">select</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="comment">// <span class="doctag">TODO:</span> Implement select() method.</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">MySqlArticle</span> <span class="keyword">implements</span> <span class="title">User</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">select</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="comment">// <span class="doctag">TODO:</span> Implement select() method.</span></span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">insert</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="comment">// <span class="doctag">TODO:</span> Implement insert() method.</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">MySqlFactory</span> <span class="keyword">implements</span> <span class="title">Factory</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">createUser</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="comment">// <span class="doctag">TODO:</span> Implement createUser() method.</span></span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> MySqlUser();</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">createArticle</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="comment">// <span class="doctag">TODO:</span> Implement createArticle() method.</span></span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> MySqlArticle();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="variable">$factory1</span> = <span class="keyword">new</span> MySqlFactory();</span><br><span class="line"></span><br><span class="line"><span class="variable">$user</span> = <span class="variable">$factory1</span>-&gt;createUser();</span><br><span class="line"><span class="variable">$user</span>-&gt;insert();</span><br><span class="line"><span class="variable">$user</span>-&gt;select();</span><br><span class="line"></span><br><span class="line"><span class="variable">$article</span> = <span class="variable">$factory1</span>-&gt;createArticle();</span><br><span class="line"><span class="variable">$article</span>-&gt;select();</span><br><span class="line"><span class="variable">$article</span>-&gt;insert();</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><ol><li>简单工厂模式一般用于生产同一类产品，操作相同的，对于新的产品类就比较麻烦</li><li>工厂模式一般用于生产同一结构的固定产品，对于新增产品也比较支持</li><li>抽象工厂模式可以生产不同产品族的全部产品，但也对新增产品无能为力</li></ol>]]></content>
    
    
    <summary type="html">&lt;h3 id=&quot;1-简单工厂模式&quot;&gt;&lt;a href=&quot;#1-简单工厂模式&quot; class=&quot;headerlink&quot; title=&quot;1. 简单工厂模式&quot;&gt;&lt;/a&gt;1. 简单工厂模式&lt;/h3&gt;&lt;figure class=&quot;highlight php&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;46&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;interface&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;Math&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;calc&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$num1&lt;/span&gt;, &lt;span class=&quot;variable&quot;&gt;$num2&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;Add&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;Math&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;calc&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$num1&lt;/span&gt;, &lt;span class=&quot;variable&quot;&gt;$num2&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;function&quot;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;comment&quot;&gt;// &lt;span class=&quot;doctag&quot;&gt;TODO:&lt;/span&gt; Implement calc() method.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;variable&quot;&gt;$num1&lt;/span&gt; + &lt;span class=&quot;variable&quot;&gt;$num2&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;Sub&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;implements&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;Math&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;calc&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$num1&lt;/span&gt;, &lt;span class=&quot;variable&quot;&gt;$num2&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;function&quot;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;comment&quot;&gt;// &lt;span class=&quot;doctag&quot;&gt;TODO:&lt;/span&gt; Implement calc() method.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;variable&quot;&gt;$num1&lt;/span&gt; - &lt;span class=&quot;variable&quot;&gt;$num2&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;Cal&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;built_in&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;getMath&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$type&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;function&quot;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;keyword&quot;&gt;switch&lt;/span&gt; (&lt;span class=&quot;variable&quot;&gt;$type&lt;/span&gt;) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;            &lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;+&amp;quot;&lt;/span&gt; :&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;new&lt;/span&gt; Add();&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                &lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;            &lt;span class=&quot;keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&amp;quot;-&amp;quot;&lt;/span&gt; :&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;new&lt;/span&gt; Sub();&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                &lt;span class=&quot;keyword&quot;&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;            &lt;span class=&quot;keyword&quot;&gt;default&lt;/span&gt; :&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                &lt;span class=&quot;keyword&quot;&gt;die&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&amp;quot;不支持其他计算方法&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$math&lt;/span&gt; = Cal::getMath(&lt;span class=&quot;string&quot;&gt;&amp;quot;+&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;var_dump(&lt;span class=&quot;variable&quot;&gt;$math&lt;/span&gt;-&amp;gt;calc(&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;,&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt;));&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$math2&lt;/span&gt; = Cal::getMath(&lt;span class=&quot;string&quot;&gt;&amp;quot;-&amp;quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;var_dump(&lt;span class=&quot;variable&quot;&gt;$math2&lt;/span&gt;-&amp;gt;calc(&lt;span class=&quot;number&quot;&gt;3&lt;/span&gt;,&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt;));&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;好处就是，只需要管理getMath里面的类型就行了，不需要管如何实现的，但是缺点就是，当需要实现的方法较多时就比较麻烦，每增加一种，就需要增加一个类型。&lt;/p&gt;
&lt;h3 id=&quot;2-工厂模式&quot;&gt;&lt;a href=&quot;#2-工厂模式&quot; class=&quot;headerlink&quot; title=&quot;2. 工厂模式&quot;&gt;&lt;/a&gt;2. 工厂模式&lt;/h3&gt;&lt;p&gt;定义工厂的接口，让工厂的子类来确定实例化哪一个具体的产品类，延迟了类的实例化。&lt;/p&gt;
&lt;figure class=&quot;highlight php&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;71&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;&amp;lt;?php&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;namespace&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;FactoryMethod2&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;//父类&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;abstract&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;Math&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;abstract&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;create&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;)&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;//操作类&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;abstract&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;Operation&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;variable&quot;&gt;$num1&lt;/span&gt; = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;protected&lt;/span&gt; &lt;span class=&quot;variable&quot;&gt;$num2&lt;/span&gt; = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;setNum1&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$num1&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;keyword&quot;&gt;$this&lt;/span&gt;-&amp;gt;num1 = &lt;span class=&quot;variable&quot;&gt;$num1&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;setNum2&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$num2&lt;/span&gt;&lt;/span&gt;)&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;keyword&quot;&gt;$this&lt;/span&gt;-&amp;gt;num2 = &lt;span class=&quot;variable&quot;&gt;$num2&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;abstract&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;calc&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;)&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;Add&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;Operation&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;calc&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;)&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;$this&lt;/span&gt;-&amp;gt;num1 + &lt;span class=&quot;keyword&quot;&gt;$this&lt;/span&gt;-&amp;gt;num2;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;Sub&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;Operation&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;calc&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;)&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;$this&lt;/span&gt;-&amp;gt;num1 - &lt;span class=&quot;keyword&quot;&gt;$this&lt;/span&gt;-&amp;gt;num2;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;//工厂类&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;AddFactory&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;Math&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;create&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;function&quot;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;comment&quot;&gt;// &lt;span class=&quot;doctag&quot;&gt;TODO:&lt;/span&gt; Implement create() method.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;new&lt;/span&gt; Add();&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;comment&quot;&gt;//工厂类&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;SubFactory&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;extends&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;Math&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;class&quot;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;create&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;function&quot;&gt;    &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;comment&quot;&gt;// &lt;span class=&quot;doctag&quot;&gt;TODO:&lt;/span&gt; Implement create() method.&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;new&lt;/span&gt; Sub();&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$factory1&lt;/span&gt; = &lt;span class=&quot;keyword&quot;&gt;new&lt;/span&gt; AddFactory();&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$math1&lt;/span&gt; = &lt;span class=&quot;variable&quot;&gt;$factory1&lt;/span&gt;-&amp;gt;create();&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$math1&lt;/span&gt;-&amp;gt;setNum1(&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$math1&lt;/span&gt;-&amp;gt;setNum2(&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;var_dump(&lt;span class=&quot;variable&quot;&gt;$math1&lt;/span&gt;-&amp;gt;calc());&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$factory2&lt;/span&gt; = &lt;span class=&quot;keyword&quot;&gt;new&lt;/span&gt; SubFactory();&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$math2&lt;/span&gt; = &lt;span class=&quot;variable&quot;&gt;$factory2&lt;/span&gt;-&amp;gt;create();&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$math2&lt;/span&gt;-&amp;gt;setNum1(&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;variable&quot;&gt;$math2&lt;/span&gt;-&amp;gt;setNum2(&lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;var_dump(&lt;span class=&quot;variable&quot;&gt;$math2&lt;/span&gt;-&amp;gt;calc());&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;meta&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;</summary>
    
    
    
    
    <category term="php" scheme="https://kgtech.top/tags/php/"/>
    
  </entry>
  
  <entry>
    <title>PHP知识点整理(三) - 单例模式</title>
    <link href="https://kgtech.top/2019/07/24/PHP%E7%9F%A5%E8%AF%86%E7%82%B9%E6%95%B4%E7%90%86-%E4%B8%89-%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/"/>
    <id>https://kgtech.top/2019/07/24/PHP%E7%9F%A5%E8%AF%86%E7%82%B9%E6%95%B4%E7%90%86-%E4%B8%89-%E5%8D%95%E4%BE%8B%E6%A8%A1%E5%BC%8F/</id>
    <published>2019-07-24T02:54:54.000Z</published>
    <updated>2019-07-24T02:56:29.793Z</updated>
    
    <content type="html"><![CDATA[<p>今天来学习一下几种简单常用的设计模式，更深的还看不懂，只能从简单的开始。</p><h3 id="单例模式"><a href="#单例模式" class="headerlink" title="单例模式"></a>单例模式</h3><p>单例模式不管是哪种语言，都是比较常用的设计模式，因为程序中经常会用到全局变量，如果全局变量没有得到好的保护，就会造成一些难以想象的后果。所以当我们在设计类的时候就要考虑到这一点，而我们要做的就是程序中同一个类的所有对象都使用的是同一个对象。</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Preference</span> </span>&#123;</span><br><span class="line">    <span class="comment">//创建私有静态变量来保存类对象</span></span><br><span class="line">    <span class="keyword">private</span> <span class="built_in">static</span> <span class="variable">$instance</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//防止被创建对象</span></span><br><span class="line">    <span class="keyword">private</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"></span>)</span>&#123;&#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//防止克隆对象</span></span><br><span class="line">    <span class="keyword">private</span> <span class="function"><span class="keyword">function</span> <span class="title">__clone</span>(<span class="params"></span>)</span>&#123;&#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//判断是否有创建对象</span></span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">static</span> <span class="function"><span class="keyword">function</span> <span class="title">getInstance</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">if</span> (!<span class="built_in">self</span>::<span class="variable">$instance</span> <span class="keyword">instanceof</span> <span class="built_in">self</span>) &#123;</span><br><span class="line">             <span class="built_in">self</span>::<span class="variable">$instance</span> = <span class="keyword">new</span> Preference();</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">self</span>::<span class="variable">$instance</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天来学习一下几种简单常用的设计模式，更深的还看不懂，只能从简单的开始。&lt;/p&gt;
&lt;h3 id=&quot;单例模式&quot;&gt;&lt;a href=&quot;#单例模式&quot; class=&quot;headerlink&quot; title=&quot;单例模式&quot;&gt;&lt;/a&gt;单例模式&lt;/h3&gt;&lt;p&gt;单例模式不管是哪种语言，都是比较常用</summary>
      
    
    
    
    
    <category term="php" scheme="https://kgtech.top/tags/php/"/>
    
  </entry>
  
  <entry>
    <title>PHP知识点整理(三) - 命名空间</title>
    <link href="https://kgtech.top/2019/07/22/PHP%E7%9F%A5%E8%AF%86%E7%82%B9%E6%95%B4%E7%90%86-%E4%B8%89-%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4/"/>
    <id>https://kgtech.top/2019/07/22/PHP%E7%9F%A5%E8%AF%86%E7%82%B9%E6%95%B4%E7%90%86-%E4%B8%89-%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4/</id>
    <published>2019-07-22T09:20:52.000Z</published>
    <updated>2019-07-22T09:25:44.017Z</updated>
    
    <content type="html"><![CDATA[<p>今天稍微深入一点点，学习一下几个重要的概念。</p><h3 id="一、命名空间"><a href="#一、命名空间" class="headerlink" title="一、命名空间"></a>一、命名空间</h3><p>命名空间这个概念是从PHP5.3之后开始引入的，当然PHP7也支持，命名空间主要解决以下两个问题</p><ul><li>你敲的代码和PHP内部或者是第三方类/函数/常量之间的<strong>命名冲突</strong></li><li>给很长的标识符名称创建一个别名（主要还是为了上一个问题）</li></ul><h4 id="命名空间的规则"><a href="#命名空间的规则" class="headerlink" title="命名空间的规则"></a>命名空间的规则</h4><ul><li>命名空间必须是程序脚本的第一条语句</li><li>只有类（包括抽象类和traits）、接口、函数和常量受命名空间的影响</li></ul><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">MyProject</span>; </span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> CONNECT_OK = <span class="number">1</span>;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Connection</span> </span>&#123; <span class="comment">/* ... */</span> &#125;</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">connect</span>(<span class="params"></span>) </span>&#123; <span class="comment">/* ... */</span>  &#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h4 id="子命名空间"><a href="#子命名空间" class="headerlink" title="子命名空间"></a>子命名空间</h4><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">MyProject</span>\<span class="title">Sub</span>\<span class="title">Level</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> CONNECT_OK = <span class="number">1</span>;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Connection</span> </span>&#123; <span class="comment">/* ... */</span> &#125;</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">connect</span>(<span class="params"></span>) </span>&#123; <span class="comment">/* ... */</span>  &#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><h4 id="命名空间的使用"><a href="#命名空间的使用" class="headerlink" title="命名空间的使用"></a>命名空间的使用</h4><p>在文件系统中:</p><ul><li>相对文件名形式如foo.txt。它会被解析为 currentdirectory/foo.txt，其中 currentdirectory 表示当前目录。因此如果当前目录是 /home/foo，则该文件名被解析为/home/foo/foo.txt。</li><li>相对路径名形式如subdirectory/foo.txt。它会被解析为 currentdirectory/subdirectory/foo.txt。</li><li>绝对路径名形式如/main/foo.txt。它会被解析为/main/foo.txt。</li></ul><p>那么在命名空间中的元素:<br>有以下两个文件<br>1.php</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Foo</span>\<span class="title">Bar</span>\<span class="title">subnamespace</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> FOO = <span class="number">1</span>;</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">foo</span>(<span class="params"></span>) </span>&#123;&#125;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">foo</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="built_in">static</span> <span class="function"><span class="keyword">function</span> <span class="title">staticmethod</span>(<span class="params"></span>) </span>&#123;&#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><p>2.php</p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Foo</span>\<span class="title">Bar</span>;</span><br><span class="line"><span class="keyword">include</span> <span class="string">&#x27;1.php&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> FOO = <span class="number">2</span>;</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">foo</span>(<span class="params"></span>) </span>&#123;&#125;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">foo</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="built_in">static</span> <span class="function"><span class="keyword">function</span> <span class="title">staticmethod</span>(<span class="params"></span>) </span>&#123;&#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* 非限定名称 */</span></span><br><span class="line">foo(); <span class="comment">// 解析为 Foo\Bar\foo </span></span><br><span class="line">foo::staticmethod(); <span class="comment">// 解析为类 Foo\Bar\foo的静态方法staticmethod。</span></span><br><span class="line"><span class="keyword">echo</span> FOO; <span class="comment">// 解析为常量 Foo\Bar\FOO</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/* 限定名称 */</span></span><br><span class="line">subnamespace\foo(); <span class="comment">// 解析为函数 Foo\Bar\subnamespace\foo</span></span><br><span class="line">subnamespace\foo::staticmethod(); <span class="comment">// 解析为类 Foo\Bar\subnamespace\foo,</span></span><br><span class="line">                                  <span class="comment">// 以及类的方法 staticmethod</span></span><br><span class="line"><span class="keyword">echo</span> subnamespace\FOO; <span class="comment">// 解析为常量 Foo\Bar\subnamespace\FOO</span></span><br><span class="line">                                  </span><br><span class="line"><span class="comment">/* 完全限定名称 */</span></span><br><span class="line">\Foo\Bar\foo(); <span class="comment">// 解析为函数 Foo\Bar\foo</span></span><br><span class="line">\Foo\Bar\foo::staticmethod(); <span class="comment">// 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod</span></span><br><span class="line"><span class="keyword">echo</span> \Foo\Bar\FOO; <span class="comment">// 解析为常量 Foo\Bar\FOO</span></span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><blockquote><p>常量”<strong>NAMESPACE</strong>“的值是包含当前命名空间名称的字符串。在全局的，不包括在任何命名空间中的代码，它包含一个空的字符串。</p></blockquote><h4 id="在命名空间中访问全局类"><a href="#在命名空间中访问全局类" class="headerlink" title="在命名空间中访问全局类"></a>在命名空间中访问全局类</h4><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">A</span>\<span class="title">B</span>\<span class="title">C</span>;</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Exception</span> <span class="keyword">extends</span> \<span class="title">Exception</span> </span>&#123;&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable">$a</span> = <span class="keyword">new</span> <span class="built_in">Exception</span>(<span class="string">&#x27;hi&#x27;</span>); <span class="comment">// $a 是类 A\B\C\Exception 的一个对象</span></span><br><span class="line"><span class="variable">$b</span> = <span class="keyword">new</span> \<span class="built_in">Exception</span>(<span class="string">&#x27;hi&#x27;</span>); <span class="comment">// $b 是类 Exception 的一个对象</span></span><br><span class="line"></span><br><span class="line"><span class="variable">$c</span> = <span class="keyword">new</span> <span class="built_in">ArrayObject</span>; <span class="comment">// 致命错误, 找不到 A\B\C\ArrayObject 类</span></span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天稍微深入一点点，学习一下几个重要的概念。&lt;/p&gt;
&lt;h3 id=&quot;一、命名空间&quot;&gt;&lt;a href=&quot;#一、命名空间&quot; class=&quot;headerlink&quot; title=&quot;一、命名空间&quot;&gt;&lt;/a&gt;一、命名空间&lt;/h3&gt;&lt;p&gt;命名空间这个概念是从PHP5.3之后开始引入的，</summary>
      
    
    
    
    
    <category term="php" scheme="https://kgtech.top/tags/php/"/>
    
  </entry>
  
  <entry>
    <title>PHP知识点整理(二)</title>
    <link href="https://kgtech.top/2019/07/17/PHP%E7%9F%A5%E8%AF%86%E7%82%B9%E6%95%B4%E7%90%86-%E4%BA%8C/"/>
    <id>https://kgtech.top/2019/07/17/PHP%E7%9F%A5%E8%AF%86%E7%82%B9%E6%95%B4%E7%90%86-%E4%BA%8C/</id>
    <published>2019-07-17T09:02:00.000Z</published>
    <updated>2019-07-23T00:20:37.367Z</updated>
    
    <content type="html"><![CDATA[<h3 id="一、几个Array排序函数"><a href="#一、几个Array排序函数" class="headerlink" title="一、几个Array排序函数"></a>一、几个Array排序函数</h3><ol><li>sort()和rsort()<br>对数组中的元素按字母进行升序/降序排序<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="variable">$b</span> = <span class="keyword">array</span>(“a”=&gt;<span class="number">5</span>,”b”=&gt;<span class="number">2</span>,”c”=&gt;<span class="number">3</span>);</span><br><span class="line">sort(<span class="variable">$b</span>);</span><br><span class="line">print_r(<span class="variable">$b</span>);</span><br><span class="line"><span class="comment">/*Array</span></span><br><span class="line"><span class="comment">(</span></span><br><span class="line"><span class="comment">    [0] =&gt; 2</span></span><br><span class="line"><span class="comment">    [1] =&gt; 3</span></span><br><span class="line"><span class="comment">    [2] =&gt; 5</span></span><br><span class="line"><span class="comment">)*/</span></span><br><span class="line">rsort(<span class="variable">$b</span>);</span><br><span class="line">print_r(<span class="variable">$b</span>);</span><br><span class="line"><span class="comment">/*Array</span></span><br><span class="line"><span class="comment">(</span></span><br><span class="line"><span class="comment">    [0] =&gt; 5</span></span><br><span class="line"><span class="comment">    [1] =&gt; 3</span></span><br><span class="line"><span class="comment">    [2] =&gt; 2</span></span><br><span class="line"><span class="comment">)*/</span></span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure></li><li>ksort()和krsort()<br>对数组按照键名进行升序/降序排序<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="variable">$b</span> = <span class="keyword">array</span>(“a”=&gt;<span class="number">5</span>,”b”=&gt;<span class="number">2</span>,”c”=&gt;<span class="number">3</span>);</span><br><span class="line">ksort(<span class="variable">$b</span>);</span><br><span class="line">print_r(<span class="variable">$b</span>);</span><br><span class="line"><span class="comment">/*Array</span></span><br><span class="line"><span class="comment">(</span></span><br><span class="line"><span class="comment">    [a] =&gt; 5</span></span><br><span class="line"><span class="comment">    [b] =&gt; 2</span></span><br><span class="line"><span class="comment">    [c] =&gt; 3</span></span><br><span class="line"><span class="comment">)*/</span></span><br><span class="line">krsort(<span class="variable">$b</span>);</span><br><span class="line">print_r(<span class="variable">$b</span>);</span><br><span class="line"><span class="comment">/*Array</span></span><br><span class="line"><span class="comment">(</span></span><br><span class="line"><span class="comment">    [c] =&gt; 3</span></span><br><span class="line"><span class="comment">    [b] =&gt; 2</span></span><br><span class="line"><span class="comment">    [a] =&gt; 5</span></span><br><span class="line"><span class="comment">)*/</span></span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure></li><li>asort()和arsort()<br>对关联数组按照键值进行升序/降序排序，同时会保持索引关系<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="variable">$b</span> = <span class="keyword">array</span>(“a”=&gt;<span class="number">5</span>,”b”=&gt;<span class="number">2</span>,”c”=&gt;<span class="number">3</span>);</span><br><span class="line">asort(<span class="variable">$b</span>);</span><br><span class="line">print_r(<span class="variable">$b</span>);</span><br><span class="line"><span class="comment">/*Array</span></span><br><span class="line"><span class="comment">(</span></span><br><span class="line"><span class="comment">    [b] =&gt; 2</span></span><br><span class="line"><span class="comment">    [c] =&gt; 3</span></span><br><span class="line"><span class="comment">    [a] =&gt; 5</span></span><br><span class="line"><span class="comment">)*/</span></span><br><span class="line">ksort(<span class="variable">$b</span>);</span><br><span class="line">print_r(<span class="variable">$b</span>);</span><br><span class="line"><span class="comment">/*Array</span></span><br><span class="line"><span class="comment">(</span></span><br><span class="line"><span class="comment">    [a] =&gt; 5</span></span><br><span class="line"><span class="comment">    [b] =&gt; 2</span></span><br><span class="line"><span class="comment">    [c] =&gt; 3</span></span><br><span class="line"><span class="comment">)*/</span></span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure></li></ol><h3 id="二、require-和include"><a href="#二、require-和include" class="headerlink" title="二、require()和include"></a>二、require()和include</h3><ol><li>require()一般放在程序最前面，执行前会将对应文件读取进来，require没有返回值</li><li>include()一般不强制放在程序最前面，也可以放在程序中间，做流程控制，只有当执行到这里的时候才会把对应的文件读取进来，include有返回值</li><li>require一个文件存在错误的话，程序就会中断执行，并抛出致命错误，include一个文件存在错误的话，程序不会中断，但是会显示一个警告</li><li>require()通常来导入静态的内容，而include()则适合用导入动态的程序代码。</li><li>require_once()会先检查目标文件的内容是不是在之前就已经导入过了，如果是的话，便不会再次重复导入同样的内容。</li></ol><h3 id="三、extends-和implements"><a href="#三、extends-和implements" class="headerlink" title="三、extends()和implements()"></a>三、extends()和implements()</h3><ol><li>extends，一般是单继承某个类，继承之后可以使用父类的方法，也可以重写父类的方法<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="keyword">abstract</span> <span class="class"><span class="keyword">class</span> <span class="title">Father</span></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">getName</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;I&#x27;m your Father&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Son</span> <span class="keyword">extends</span> <span class="title">Father</span></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">getFatherName</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">echo</span> <span class="keyword">$this</span>-&gt;getName();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="variable">$a</span> = <span class="keyword">new</span> Son();</span><br><span class="line"><span class="variable">$a</span>-&gt;getFatherName(); <span class="comment">//I&#x27;m your Father</span></span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure></li><li>implements，一般是实现多个接口，接口的方法一般是空的，需要重写才能实现<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="class"><span class="keyword">interface</span> <span class="title">iTemplate</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">setVariable</span>(<span class="params"><span class="variable">$name</span>, <span class="variable">$var</span></span>)</span>;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">getHtml</span>(<span class="params"><span class="variable">$template</span></span>)</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Template</span> <span class="keyword">implements</span> <span class="title">iTemplate</span></span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="variable">$vars</span> = <span class="keyword">array</span>();</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">setVariable</span>(<span class="params"><span class="variable">$name</span>, <span class="variable">$var</span></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="comment">// <span class="doctag">TODO:</span> Implement setVariable() method.</span></span><br><span class="line">        <span class="keyword">$this</span>-&gt;vars[<span class="variable">$name</span>] = <span class="variable">$var</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">getHtml</span>(<span class="params"><span class="variable">$template</span></span>)</span></span><br><span class="line"><span class="function">    </span>&#123;</span><br><span class="line">        <span class="comment">// <span class="doctag">TODO:</span> Implement getHtml() method.</span></span><br><span class="line">        <span class="keyword">foreach</span> (<span class="keyword">$this</span>-&gt;vars <span class="keyword">as</span> <span class="variable">$name</span> =&gt; <span class="variable">$value</span>)&#123;</span><br><span class="line">            <span class="variable">$template</span> = str_replace(‘&#123;‘ . <span class="variable">$name</span> . ‘&#125;’, <span class="variable">$value</span>, <span class="variable">$template</span>);</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="variable">$template</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure></li><li>在interface之间也可以声明为extends（多继承）的关系。注意一个interface可以extends多个其他interface。</li></ol><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Template</span> <span class="keyword">extends</span> <span class="title">TemService</span> <span class="keyword">implements</span> <span class="title">iTem1</span>, <span class="title">iTem2</span> </span>&#123;</span><br><span class="line">    <span class="comment">//Code Here</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure><ol start="4"><li>更多接口对象参考：<a href="https://www.php.net/manual/zh/language.oop5.interfaces.php">PHP: 对象接口 - Manual</a></li></ol><hr><p>接下来研究：</p><ol><li>命名空间</li><li>排序算法</li><li>设计模式</li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;一、几个Array排序函数&quot;&gt;&lt;a href=&quot;#一、几个Array排序函数&quot; class=&quot;headerlink&quot; title=&quot;一、几个Array排序函数&quot;&gt;&lt;/a&gt;一、几个Array排序函数&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;sort()和rsort()&lt;br&gt;对数</summary>
      
    
    
    
    
    <category term="php" scheme="https://kgtech.top/tags/php/"/>
    
  </entry>
  
  <entry>
    <title>PHP知识点整理(一)</title>
    <link href="https://kgtech.top/2019/07/17/PHP%E7%9F%A5%E8%AF%86%E7%82%B9%E6%95%B4%E7%90%86-%E4%B8%80/"/>
    <id>https://kgtech.top/2019/07/17/PHP%E7%9F%A5%E8%AF%86%E7%82%B9%E6%95%B4%E7%90%86-%E4%B8%80/</id>
    <published>2019-07-17T06:29:07.000Z</published>
    <updated>2019-09-02T02:42:43.442Z</updated>
    
    <content type="html"><![CDATA[<h3 id="一、几个输出语句的区别"><a href="#一、几个输出语句的区别" class="headerlink" title="一、几个输出语句的区别"></a>一、几个输出语句的区别</h3><ol><li>echo<br>echo没有返回值，只接受一个参数，可以不使用括号<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line">    <span class="variable">$a</span> = <span class="keyword">echo</span>(<span class="string">&quot;Hello World&quot;</span>); <span class="comment">// 错误，因为 echo 没返回值，不能用来赋值</span></span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&quot;Hello World&quot;</span>; <span class="comment">// 正确，输出 Hello World</span>     </span><br><span class="line">    <span class="keyword">echo</span> (<span class="string">&quot;Hello World&quot;</span>); <span class="comment">//正确，输出 Hello World</span>     </span><br><span class="line">    <span class="keyword">echo</span> (<span class="string">&quot;Hello&quot;</span>,<span class="string">&quot;Wrold&quot;</span>); <span class="comment">//错误，因为传递多个参数的时候不能用括号</span></span><br><span class="line">    <span class="keyword">echo</span> <span class="string">&quot;Hello&quot;</span>,<span class="string">&quot; World&quot;</span>,<span class="string">&quot; is&quot;</span>, <span class="string">&quot; web&quot;</span>; <span class="comment">// 正确，不用括号的时候可以用逗号隔开多个值</span></span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure></li><li>print<br>和echo几乎一样，但是print有返回值1，虽然没啥用，但是因此会比echo效率低一点<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line">    <span class="variable">$x</span> = <span class="keyword">print</span>(<span class="string">&quot;Hello World&quot;</span>); <span class="comment">// 输出 Hello World </span></span><br><span class="line">    <span class="keyword">echo</span> <span class="variable">$x</span>; <span class="comment">// 输出 1</span>     </span><br><span class="line">    <span class="keyword">print</span> <span class="string">&quot;Hello World&quot;</span>; <span class="comment">//输出 Hello World </span></span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure></li><li>printf<br>printf主要用来格式化字符串<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line">    printf(<span class="string">&quot;First %s %s。&quot;</span>,<span class="string">&quot;hello&quot;</span>, <span class="string">&quot;world&quot;</span>); <span class="comment">// First hello world</span>     </span><br><span class="line">    printf(<span class="string">&quot;This is %1\$s %1\$s&quot;</span>,<span class="string">&quot;A&quot;</span>, <span class="string">&quot;B&quot;</span>); <span class="comment">//输出 This is A A，因为只显示第一个参数两次，而没有用到第二个参数 </span></span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure></li><li>sprintf<br>和printf一样，但是没有输出，而只是格式化字符串<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line">    printf(“First %s %s。”,”hello”, “world”); <span class="comment">// First hello world</span></span><br><span class="line">    printf(“This is %<span class="number">1</span>\<span class="variable">$s</span> %<span class="number">1</span>\<span class="variable">$s</span>”,”A”, “B”); <span class="comment">//输出 This is A A，因为只显示第一个参数两次，而没有用到第二个参数 </span></span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure></li><li>print_r<br>主要用来将数组、对象等数据类型以更易展示的形式输出来<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line">    <span class="variable">$a</span> = <span class="keyword">array</span> (<span class="string">&#x27;a&#x27;</span> =&gt; <span class="string">&#x27;A&#x27;</span>, <span class="string">&#x27;b&#x27;</span> =&gt; <span class="string">&#x27;B&#x27;</span>, <span class="string">&#x27;c&#x27;</span> =&gt; <span class="keyword">array</span> (<span class="string">&#x27;a&#x27;</span>,<span class="string">&#x27;b&#x27;</span>,<span class="string">&#x27;c&#x27;</span>)); </span><br><span class="line">    print_r (<span class="variable">$a</span>); </span><br><span class="line"><span class="meta">?&gt;</span></span><br><span class="line">结果如下:</span><br><span class="line"><span class="keyword">Array</span> </span><br><span class="line">(     </span><br><span class="line">    [a] =&gt; A </span><br><span class="line">    [b] =&gt; B     </span><br><span class="line">    [c] =&gt; <span class="keyword">Array</span></span><br><span class="line">    (         </span><br><span class="line">    [<span class="number">0</span>] =&gt; a </span><br><span class="line">        [<span class="number">1</span>] =&gt; b </span><br><span class="line">        [<span class="number">2</span>] =&gt; c </span><br><span class="line">    ) </span><br><span class="line">) </span><br></pre></td></tr></table></figure></li><li>var_dump<br>用于调试，还会把变量的内容和类型输出来，还有长度也会输出来<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span> </span><br><span class="line">    <span class="variable">$a</span>=<span class="number">1.5</span>; </span><br><span class="line">    var_dump(<span class="variable">$a</span>); <span class="comment">//float(1.5) </span></span><br><span class="line">    <span class="variable">$a</span>=<span class="number">2</span>;</span><br><span class="line">    var_dump(<span class="variable">$a</span>); <span class="comment">//int(2) </span></span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure></li></ol><h3 id="二、单引号和双引号的区别"><a href="#二、单引号和双引号的区别" class="headerlink" title="二、单引号和双引号的区别"></a>二、单引号和双引号的区别</h3><ol><li>单引号只支持 \’和\转义，而双引号支持更多的转义</li><li>单引号不会解析变量值，双引号会<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;?php</span></span><br><span class="line">    <span class="variable">$age</span> = <span class="number">20</span>; </span><br><span class="line">    <span class="variable">$str1</span> = <span class="string">&#x27;I am $age years old&#x27;</span>;     </span><br><span class="line">    <span class="variable">$str2</span> = <span class="string">&quot;I am <span class="subst">$age</span> years old&quot;</span>;     </span><br><span class="line">    <span class="keyword">echo</span> <span class="variable">$str1</span>,<span class="string">&#x27;&lt;br /&gt;&#x27;</span>; <span class="comment">//输出: I am $age years old; </span></span><br><span class="line">    <span class="keyword">echo</span> <span class="variable">$str2</span>,<span class="string">&#x27;&lt;br /&gt;&#x27;</span>; <span class="comment">// 输出:I am 20 years old; </span></span><br><span class="line"><span class="meta">?&gt;</span></span><br></pre></td></tr></table></figure></li><li>单引号比双引号快<h3 id="三、“-”、”-gt-”和”-gt-”的区别"><a href="#三、“-”、”-gt-”和”-gt-”的区别" class="headerlink" title="三、“::”、”-&gt;”和”=&gt;”的区别"></a>三、“::”、”-&gt;”和”=&gt;”的区别</h3></li><li>“::”运算符是调用一个类中的静态成员的方法<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">test</span></span>&#123;</span><br><span class="line">    <span class="keyword">protected</span> <span class="built_in">static</span> <span class="variable">$instance</span>;</span><br><span class="line">    <span class="built_in">self</span>::<span class="variable">$instance</span> = “abc”;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>”-&gt;”是操作类中成员变量或者方法的方法<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">test</span></span>&#123;</span><br><span class="line">    <span class="keyword">private</span> <span class="variable">$test</span>;</span><br><span class="line">    <span class="keyword">$this</span>-&gt;test = “abc”;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>“=&gt;”是映射数组中key和value时候使用的  </li></ol><h3 id="四、构造函数和析构函数"><a href="#四、构造函数和析构函数" class="headerlink" title="四、构造函数和析构函数"></a>四、构造函数和析构函数</h3><ol><li>__construct 实例化对象的时候会被调用</li><li>__destruct 对象呗销毁的时候被调用，因为PHP只会释放对象所占用的内存和相关资源，而由程序员自己申请的资源需要自己释放<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Test</span></span>&#123;</span><br><span class="line">    <span class="keyword">protected</span> <span class="variable">$file</span> = <span class="literal">NULL</span>;</span><br><span class="line">    <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        <span class="keyword">$this</span>-&gt;file = fopen(“test.txt”,”r”);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="function"><span class="keyword">function</span> <span class="title">__destruct</span>(<span class="params"></span>)</span>&#123;</span><br><span class="line">        fclose(<span class="keyword">$this</span>-&gt;file);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol><h3 id="五、-call-和-callStatic"><a href="#五、-call-和-callStatic" class="headerlink" title="五、__call()和__callStatic()"></a>五、__call()和__callStatic()</h3><ol><li>__call()，当调用一个不可访问的方法时会调用这个方法。</li><li>__callStatic(),当调用的静态方法不存在或者权限不足的时候，会调用这个方法<figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Test</span> </span></span><br><span class="line"><span class="class"></span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__call</span> (<span class="params"><span class="variable">$name</span>, <span class="variable">$arguments</span></span>) </span>&#123; </span><br><span class="line">        <span class="keyword">echo</span> “调用对象方法 ‘<span class="variable">$name</span>’ “. implode(‘, ‘,<span class="variable">$arguments</span>). “\n”; </span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">static</span> <span class="function"><span class="keyword">function</span> <span class="title">__callStatic</span> (<span class="params"><span class="variable">$name</span>, <span class="variable">$arguments</span></span>) </span>&#123; </span><br><span class="line">        <span class="keyword">echo</span> “调用静态方法 ‘<span class="variable">$name</span>’ “. implode(‘, ‘, <span class="variable">$arguments</span>). “\n”; &#125; </span><br><span class="line">&#125;</span><br><span class="line"><span class="variable">$obj</span> = <span class="keyword">new</span> Test; </span><br><span class="line"><span class="variable">$obj</span>-&gt;method1(‘参数 <span class="number">1</span>’); <span class="comment">//调用对象方法 &#x27;method1&#x27; 参数 1 </span></span><br><span class="line">Test::method2(‘参数 <span class="number">2</span>’); <span class="comment">//调用静态方法 &#x27;method2&#x27; 参数 2 </span></span><br></pre></td></tr></table></figure></li></ol><h3 id="六、值传递和引用传递"><a href="#六、值传递和引用传递" class="headerlink" title="六、值传递和引用传递"></a>六、值传递和引用传递</h3><ol><li>值传递，在方法调用中，实参会把它的值传递给形参，形参只是用实参的值初始化一个存储单元，所以实参和形参有相同的值，却有着不同的存储单元</li><li>引用传递，传递的是对象的引用，形参和实参指向的是同一块地址</li></ol><h3 id="七、public、private和protected的区别"><a href="#七、public、private和protected的区别" class="headerlink" title="七、public、private和protected的区别"></a>七、public、private和protected的区别</h3><ol><li>public表示全局可以访问，比如类内部、外部和子类</li><li>protected表示受保护的，只有本类和子类可以访问</li><li>private表示私有的，只有本类内部可以访问</li></ol><h3 id="八、继承"><a href="#八、继承" class="headerlink" title="八、继承"></a>八、继承</h3><ol><li>通过用一个extends来继承基类的方法和成员。</li><li>子类只能继承父类的非私有(包括public和protected)成员变量和方法</li><li>当子类中定义的成员变量和父类中定义的成员变量同名时，子类中的成员变量会覆盖 父类的成员变量 </li><li>当子类中的方法与父类中的方法有相同的方法签名(相同的方法名，相同的参数个数 与类型)时，子类将会覆盖父类的方法，而不是重载。 </li></ol><hr><p>接下来准备研究</p><ol><li>各种排序方法的内部实现，sort(),ksort(),asort(),arsort(),rsort()</li><li>extends 和 implements 的区别</li><li>require 和 require_once 还有 include</li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;一、几个输出语句的区别&quot;&gt;&lt;a href=&quot;#一、几个输出语句的区别&quot; class=&quot;headerlink&quot; title=&quot;一、几个输出语句的区别&quot;&gt;&lt;/a&gt;一、几个输出语句的区别&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;echo&lt;br&gt;echo没有返回值，只接受一个参数，可以</summary>
      
    
    
    
    
    <category term="php" scheme="https://kgtech.top/tags/php/"/>
    
  </entry>
  
  <entry>
    <title>如何利用systemctl管理后台服务</title>
    <link href="https://kgtech.top/2019/07/15/%E5%A6%82%E4%BD%95%E5%88%A9%E7%94%A8systemctl%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0%E6%9C%8D%E5%8A%A1/"/>
    <id>https://kgtech.top/2019/07/15/%E5%A6%82%E4%BD%95%E5%88%A9%E7%94%A8systemctl%E7%AE%A1%E7%90%86%E5%90%8E%E5%8F%B0%E6%9C%8D%E5%8A%A1/</id>
    <published>2019-07-15T08:48:43.000Z</published>
    <updated>2019-07-18T07:00:53.304Z</updated>
    
    <content type="html"><![CDATA[<p>利用周末时间写了一个简单的后台推送服务，需要一直保持在后台跑。搜了网上的一些方案，比如<br>1.写一个sh脚本，在运行的命令最后加一个”&amp;”，虽然这个方法可以保持后台运行，但是只要关掉终端，这个服务也会被kill。</p><p>2.使用nohup这个命令，nohup的意思是忽略SIGHUP信号。</p><ul><li>SIGHUP信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 也就是关闭终端的时候发出的，这个信号的默认操作为终止进程，因此前台进程组和后台有终端输出的进程就会中止。</li><li>如果用nohup运行脚本的话，需要用kill命令来终止，比较麻烦。</li></ul><p>最后发现用systemctl来管理更加方便，遵循以下步骤就能一劳永逸。</p><p>1.写一个service文件，总共分三个部分[Unit]、[Service]和[Install]</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#[Unit]部分主要是对这个服务的说明，内容包括Description和After，Description用于描述服务，After用于描述服务类别</span></span><br><span class="line"><span class="section">[Unit]</span></span><br><span class="line"><span class="attr">Description</span>=pusher</span><br><span class="line"><span class="comment">#After=network.target remote-fs.target nss-lookup.target</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#[Service]部分是服务的关键，是服务的一些具体运行参数的设置</span></span><br><span class="line"><span class="comment">#Type=forking是后台运行的形式，</span></span><br><span class="line"><span class="comment">#PIDFile为存放PID的文件路径，</span></span><br><span class="line"><span class="comment">#ExecStart为服务的具体运行命令，ExecReload为重启命令，ExecStop为停止命令</span></span><br><span class="line"><span class="comment">#Restart指发生异常时是否重启</span></span><br><span class="line"><span class="comment">#PrivateTmp=True表示给服务分配独立的临时空间</span></span><br><span class="line"><span class="comment">#Environment=执行环境设置(绝对路径)</span></span><br><span class="line"><span class="comment">#注意：[Service]部分的启动、重启、停止命令全部要求使用绝对路径，使用相对路径则会报错！</span></span><br><span class="line"><span class="section">[Service]</span></span><br><span class="line"><span class="attr">Type</span>=forking</span><br><span class="line"><span class="attr">ExecStart</span>=/www/wwwroot/servicelog.com/runtime/run_pusher.sh</span><br><span class="line"><span class="attr">KillMode</span>=control-group</span><br><span class="line"><span class="attr">Restart</span>=<span class="literal">no</span></span><br><span class="line"><span class="attr">PrivateTmp</span>=<span class="literal">true</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#[Install]部分是服务安装的相关设置，可设置为多用户的</span></span><br><span class="line"><span class="section">[Install]</span></span><br><span class="line"><span class="attr">WantedBy</span>=multi-user.target</span><br></pre></td></tr></table></figure><p>2.将写好的service文件放到/usr/lib/systemd/system</p><p>3.记好以下几个命令就行了</p><figure class="highlight vala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#启动</span></span><br><span class="line">systemctl start xxx.service </span><br><span class="line"><span class="meta">#重启</span></span><br><span class="line">systemctl restart xxx.service</span><br><span class="line"><span class="meta">#停止</span></span><br><span class="line">systemctl stop xxx.service</span><br><span class="line"><span class="meta">#重载</span></span><br><span class="line">systemctl reload xxx.service</span><br><span class="line"><span class="meta">#状态</span></span><br><span class="line">systemctl status xxx.service</span><br></pre></td></tr></table></figure><p>4.还能实现开机自启动</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#在开机启用服务</span></span><br><span class="line">systemctl <span class="builtin-name">enable</span> xxx.service</span><br><span class="line"><span class="comment">#禁止开机服务</span></span><br><span class="line">systemctl <span class="builtin-name">disable</span> xxx.service</span><br></pre></td></tr></table></figure><p>参考链接：<br>1.<a href="https://wiki.archlinux.org/index.php/Systemd#Basic_systemctl_usage"><em>Systemctl</em> - ArchWiki</a><br>2.<a href="http://linux265.com/news/3385.html">systemctl 命令详解及使用教程 | linux资讯</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;利用周末时间写了一个简单的后台推送服务，需要一直保持在后台跑。搜了网上的一些方案，比如&lt;br&gt;1.写一个sh脚本，在运行的命令最后加一个”&amp;amp;”，虽然这个方法可以保持后台运行，但是只要关掉终端，这个服务也会被kill。&lt;/p&gt;
&lt;p&gt;2.使用nohup这个命令，noh</summary>
      
    
    
    
    
    <category term="linux" scheme="https://kgtech.top/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>nginx的11个阶段</title>
    <link href="https://kgtech.top/2019/06/05/nginx%E7%9A%8411%E4%B8%AA%E9%98%B6%E6%AE%B5/"/>
    <id>https://kgtech.top/2019/06/05/nginx%E7%9A%8411%E4%B8%AA%E9%98%B6%E6%AE%B5/</id>
    <published>2019-06-05T02:24:18.000Z</published>
    <updated>2019-06-05T02:26:43.810Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://i.loli.net/2019/06/05/5cf727f7e9ea265716.png" alt="11个阶段"></p><ol><li>POST_READ<br>读取头部信息</li><li>SERVER_REWRITE<br>修改URI的阶段，用于重定向，在server内，location外</li><li>FIND_CONFIG<br>根据URL找到location块，根据重写后的uri来找对应的location</li><li>REWRITE<br>在location内进行URI重写</li><li>POST_REWRITE<br>防止重写URL后导致的死循环，location级别重写的后一阶段，用来检查上阶段是否有uri重写，并根据结果跳转到合适的阶段</li><li>PREACCESS<br>设置一些处理并发，限制速度，权限控制等</li><li>ACCESS<br>让HTTP模块判断是否进入NGINX服务器，比如基于ip黑名单饿权限控制</li><li>POST_ACCESS<br>根据权限控制阶段的执行结果进行相应处理，向用户发送拒绝服务的错误码，用来响应上一阶段的拒绝。</li><li>PRECONTENT<br>发给第三方服务，try_files</li><li>CONTENT<br>index，autoindex，反向代理</li><li>LOG<br>打印日志</li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;&lt;img src=&quot;https://i.loli.net/2019/06/05/5cf727f7e9ea265716.png&quot; alt=&quot;11个阶段&quot;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;POST_READ&lt;br&gt;读取头部信息&lt;/li&gt;
&lt;li&gt;SERVER_REWRITE&lt;br&gt;</summary>
      
    
    
    
    
    <category term="nginx" scheme="https://kgtech.top/tags/nginx/"/>
    
  </entry>
  
  <entry>
    <title>Redis学习笔记(二)</title>
    <link href="https://kgtech.top/2019/05/08/Redis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E4%BA%8C/"/>
    <id>https://kgtech.top/2019/05/08/Redis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E4%BA%8C/</id>
    <published>2019-05-08T03:21:28.000Z</published>
    <updated>2019-05-08T03:26:08.588Z</updated>
    
    <content type="html"><![CDATA[<p>学习完数据结构之后，就来看看利用其中列表的特性来实现任务队列。<br>列表可以存储一个有序的字符串列表，通常的命令分别是：</p><ul><li>LPUSH(左边添加)</li><li>LPOP(从左边弹出)</li><li>RPUSH(右边添加)</li><li>RPOP(从右边弹出)</li><li>…</li></ul><p>其实用上面四个命令就能实现一个任务队列，基本上就是生产者从一端不停的添加元素，而消费者从另一端不停的取出元素即可。</p><h3 id="任务队列"><a href="#任务队列" class="headerlink" title="任务队列"></a>任务队列</h3><p>用列表做任务队列有几个优点：</p><ol><li>因为列表类型内部是用双向链表实现的，所以不管从哪一端添加元素都是非常快的。</li><li>当然生产者只管往列表里面添加任务，还可以由多个消费者来执行任务，这样就可以降低一个服务器的负载。</li><li>生产者和消费者之间不会产生耦合关系，只需要约定好内容格式即可，这样即使使用不同语言，一样能够实现</li></ol><p>伪代码：</p><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"># 写一个无限循环函</span><br><span class="line"><span class="keyword">while</span> <span class="keyword">True</span>:</span><br><span class="line">    <span class="keyword">task</span> = RPOP queue</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">task</span> == <span class="keyword">True</span>:</span><br><span class="line">        execute(<span class="keyword">task</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        time.sleep(<span class="number">1</span>)</span><br></pre></td></tr></table></figure><hr><p>当然RPOP有一个问题就是需要隔一秒去取一次是否有任务，主动发起可能会浪费资源，Redis还提供了另外一个命令<strong>BRPOP</strong>（当然还有BLPOP），二者唯一的区别就是，当队列中没有任务时，会一直阻塞连接，直到有新的任务进来了，这样伪代码可以这么写:</p><figure class="highlight autoit"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">    <span class="meta"># BRPOP 接受两个参数，第一个是键名，第二个是超时时间，为0则不超时</span></span><br><span class="line">    task = BRPOP queue, <span class="number">0</span></span><br><span class="line">    <span class="meta"># BRPOP 会返回一个数组，第二个就是我们的任务</span></span><br><span class="line">    <span class="built_in">execute</span>(task[<span class="number">1</span>])</span><br></pre></td></tr></table></figure><h3 id="优先级队列"><a href="#优先级队列" class="headerlink" title="优先级队列"></a>优先级队列</h3><p><strong>BRPOP</strong>命令可以接受多个键值 </p><figure class="highlight lasso"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">BRPOP key1 <span class="meta">[</span>key2 <span class="params">...</span><span class="meta">]</span> timeout</span><br></pre></td></tr></table></figure><p>逻辑如下:</p><ul><li>如果所有键都没有元素则阻塞</li><li>如果其中一个键有元素就会弹出</li><li>如果多个键都有元素，则会按照从左到右的顺序依次取出</li></ul><p>所以我们可以利用这一特性来实现优先级队列，将优先级高的键值放在左侧</p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">while</span> True:</span><br><span class="line">    <span class="comment"># class1 为最高优先级，放最左侧</span></span><br><span class="line">    <span class="attribute">task</span> = BRPOP queue:class<span class="number">1</span>, queue:class<span class="number">2</span>, queue:class<span class="number">3</span>,<span class="number">0</span></span><br><span class="line">    <span class="attribute">execute</span>(task[<span class="number">1</span>])</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;学习完数据结构之后，就来看看利用其中列表的特性来实现任务队列。&lt;br&gt;列表可以存储一个有序的字符串列表，通常的命令分别是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LPUSH(左边添加)&lt;/li&gt;
&lt;li&gt;LPOP(从左边弹出)&lt;/li&gt;
&lt;li&gt;RPUSH(右边添加)&lt;/li&gt;
&lt;li</summary>
      
    
    
    
    
    <category term="redis" scheme="https://kgtech.top/tags/redis/"/>
    
  </entry>
  
  <entry>
    <title>Redis配置文件详解</title>
    <link href="https://kgtech.top/2019/03/11/Redis%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%A6%E8%A7%A3/"/>
    <id>https://kgtech.top/2019/03/11/Redis%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%A6%E8%A7%A3/</id>
    <published>2019-03-11T03:45:44.000Z</published>
    <updated>2019-03-11T06:05:26.940Z</updated>
    
    <content type="html"><![CDATA[<figure class="highlight clean"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br></pre></td><td class="code"><pre><span class="line">#redis.conf</span><br><span class="line">#Redis configuration file example.</span><br><span class="line">#./redis-server /path/to/redis.conf</span><br><span class="line"></span><br><span class="line">##################################INCLUDES ###################################</span><br><span class="line">#这在你有标准配置模板但是每个redis服务器又需要个性设置的时候很有用。</span><br><span class="line">#include /path/to/local.conf</span><br><span class="line">#include /path/to/other.conf</span><br><span class="line"></span><br><span class="line">################################GENERAL #####################################</span><br><span class="line"></span><br><span class="line">#是否在后台执行，yes：后台运行；no：不是后台运行（老版本默认）</span><br><span class="line">daemonize yes</span><br><span class="line"></span><br><span class="line">#<span class="number">3.2</span>里的参数，是否开启保护模式，默认开启。要是配置里没有指定bind和密码。开启该参数后，redis只会本地进行访问，拒绝外部访问。要是开启了密码   和bind，可以开启。否   则最好关闭，设置为no。</span><br><span class="line">protected-mode yes</span><br><span class="line">#redis的进程文件</span><br><span class="line">pidfile /var/run/redis/redis-server.pid</span><br><span class="line"></span><br><span class="line">#redis监听的端口号。</span><br><span class="line">port <span class="number">6379</span></span><br><span class="line"></span><br><span class="line">#此参数确定了TCP连接中已完成队列(完成三次握手之后)的长度， 当然此值必须不大于Linux系统定义的/proc/sys/net/core/somaxconn值，默认是<span class="number">511</span>，而Linux的默认参数值是<span class="number">128</span>。当系统并发量大并且客户端速度缓慢的时候，可以将这二个参数一起参考设定。该内核参数默认值一般是<span class="number">128</span>，对于负载很大的服务程序来说大大的不够。一般会将它修改为<span class="number">2048</span>或者更大。在/etc/sysctl.conf中添加:net.core.somaxconn = <span class="number">2048</span>，然后在终端中执行sysctl -p。</span><br><span class="line">tcp-backlog <span class="number">511</span></span><br><span class="line"></span><br><span class="line">#指定 redis 只接收来自于该 IP 地址的请求，如果不进行设置，那么将处理所有请求</span><br><span class="line">bind <span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span></span><br><span class="line"></span><br><span class="line">#配置unix socket来让redis支持监听本地连接。</span><br><span class="line">#unixsocket /var/run/redis/redis.sock</span><br><span class="line">#配置unix socket使用文件的权限</span><br><span class="line">#unixsocketperm <span class="number">700</span></span><br><span class="line"></span><br><span class="line">#此参数为设置客户端空闲超过timeout，服务端会断开连接，为<span class="number">0</span>则服务端不会主动断开连接，不能小于<span class="number">0</span>。</span><br><span class="line">timeout <span class="number">0</span></span><br><span class="line"></span><br><span class="line">#tcp keepalive参数。如果设置不为<span class="number">0</span>，就使用配置tcp的SO_KEEPALIVE值，使用keepalive有两个好处:检测挂掉的对端。降低中间设备出问题而导致网络看似连接却已经与对端端口的问题。在Linux内核中，设置了keepalive，redis会定时给对端发送ack。检测到对端关闭需要两倍的设置值。</span><br><span class="line">tcp-keepalive <span class="number">0</span></span><br><span class="line"></span><br><span class="line">#指定了服务端日志的级别。级别包括：debug（很多信息，方便开发、测试），verbose（许多有用的信息，但是没有debug级别信息多），notice（适当的日志级别，适合生产环境），warn（只有非常重要的信息）</span><br><span class="line">loglevel notice</span><br><span class="line"></span><br><span class="line">#指定了记录日志的文件。空字符串的话，日志会打印到标准输出设备。后台运行的redis标准输出是/dev/null。</span><br><span class="line">logfile /var/log/redis/redis-server.log</span><br><span class="line"></span><br><span class="line">#是否打开记录syslog功能</span><br><span class="line">#syslog-enabled no</span><br><span class="line"></span><br><span class="line">#syslog的标识符。</span><br><span class="line">#syslog-ident redis</span><br><span class="line"></span><br><span class="line">#日志的来源、设备</span><br><span class="line">#syslog-facility local0</span><br><span class="line"></span><br><span class="line">#数据库的数量，默认使用的数据库是DB <span class="number">0</span>。可以通过”SELECT “命令选择一个db</span><br><span class="line">databases <span class="number">16</span></span><br><span class="line"></span><br><span class="line">################################SNAPSHOTTING ################################</span><br><span class="line">#快照配置</span><br><span class="line">#注释掉“save”这一行配置项就可以让保存数据库功能失效</span><br><span class="line">#设置sedis进行数据库镜像的频率。</span><br><span class="line">#<span class="number">900</span>秒（<span class="number">15</span>分钟）内至少<span class="number">1</span>个key值改变（则进行数据库保存--持久化） </span><br><span class="line">#<span class="number">300</span>秒（<span class="number">5</span>分钟）内至少<span class="number">10</span>个key值改变（则进行数据库保存--持久化） </span><br><span class="line">#<span class="number">60</span>秒（<span class="number">1</span>分钟）内至少<span class="number">10000</span>个key值改变（则进行数据库保存--持久化）</span><br><span class="line">save <span class="number">900</span> <span class="number">1</span></span><br><span class="line">save <span class="number">300</span> <span class="number">10</span></span><br><span class="line">save <span class="number">60</span> <span class="number">10000</span></span><br><span class="line"></span><br><span class="line">#当RDB持久化出现错误后，是否依然进行继续进行工作，yes：不能进行工作，no：可以继续进行工作，可以通过info中的rdb_last_bgsave_status了解RDB持久化是否有错误</span><br><span class="line">stop-writes-on-bgsave-error yes</span><br><span class="line"></span><br><span class="line">#使用压缩rdb文件，rdb文件压缩使用LZF压缩算法，yes：压缩，但是需要一些cpu的消耗。no：不压缩，需要更多的磁盘空间</span><br><span class="line">rdbcompression yes</span><br><span class="line"></span><br><span class="line">#是否校验rdb文件。从rdb格式的第五个版本开始，在rdb文件的末尾会带上CRC64的校验和。这跟有利于文件的容错性，但是在保存rdb文件的时候，会有大概<span class="number">10</span>%的性能损耗，所以如果你追求高性能，可以关闭该配置。</span><br><span class="line">rdbchecksum yes</span><br><span class="line"></span><br><span class="line">#rdb文件的名称</span><br><span class="line">dbfilename dump.rdb</span><br><span class="line"></span><br><span class="line">#数据目录，数据库的写入会在这个目录。rdb、aof文件也会写在这个目录</span><br><span class="line">dir /var/lib/redis</span><br><span class="line"></span><br><span class="line">#################################REPLICATION #################################</span><br><span class="line">#复制选项，slave复制对应的master。</span><br><span class="line">#slaveof &lt;masterip&gt; &lt;masterport&gt;</span><br><span class="line"></span><br><span class="line">#如果master设置了requirepass，那么slave要连上master，需要有master的密码才行。masterauth就是用来配置master的密码，这样可以在连上master后进行认证。</span><br><span class="line">#masterauth &lt;master-password&gt;</span><br><span class="line"></span><br><span class="line">#当从库同主机失去连接或者复制正在进行，从机库有两种运行方式：<span class="number">1</span>) 如果slave-serve-stale-data设置为yes(默认设置)，从库会继续响应客户端的请求。<span class="number">2</span>) 如果slave-serve-stale-data设置为no，除去INFO和SLAVOF命令之外的任何请求都会返回一个错误”SYNC <span class="keyword">with</span> master <span class="keyword">in</span> progress”。</span><br><span class="line">slave-serve-stale-data yes</span><br><span class="line"></span><br><span class="line">#作为从服务器，默认情况下是只读的（yes），可以修改成NO，用于写（不建议）。</span><br><span class="line">slave-read-only yes</span><br><span class="line"></span><br><span class="line">#是否使用socket方式复制数据。目前redis复制提供两种方式，disk和socket。如果新的slave连上来或者重连的slave无法部分同步，就会执行全量同步，master会生成rdb文件。有<span class="number">2</span>种方式：disk方式是master创建一个新的进程把rdb文件保存到磁盘，再把磁盘上的rdb文件传递给slave。socket是master创建一个新的进程，直接把rdb文件以socket的方式发给slave。disk方式的时候，当一个rdb保存的过程中，多个slave都能共享这个rdb文件。socket的方式就的一个个slave顺序复制。在磁盘速度缓慢，网速快的情况下推荐用socket方式。</span><br><span class="line">repl-diskless-sync no</span><br><span class="line"></span><br><span class="line">#diskless复制的延迟时间，防止设置为<span class="number">0</span>。一旦复制开始，节点不会再接收新slave的复制请求直到下一个rdb传输。所以最好等待一段时间，等更多的slave连上来。</span><br><span class="line">repl-diskless-sync-delay <span class="number">5</span></span><br><span class="line"></span><br><span class="line">#slave根据指定的时间间隔向服务器发送ping请求。时间间隔可以通过 repl_ping_slave_period 来设置，默认<span class="number">10</span>秒。</span><br><span class="line">#repl-ping-slave-period <span class="number">10</span></span><br><span class="line"></span><br><span class="line">#复制连接超时时间。master和slave都有超时时间的设置。master检测到slave上次发送的时间超过repl-timeout，即认为slave离线，清除该slave信息。slave检测到上次和master交互的时间超过repl-timeout，则认为master离线。需要注意的是repl-timeout需要设置一个比repl-ping-slave-period更大的值，不然会经常检测到超时。</span><br><span class="line">#repl-timeout <span class="number">60</span></span><br><span class="line"></span><br><span class="line">#是否禁止复制tcp链接的tcp nodelay参数，可传递yes或者no。默认是no，即使用tcp nodelay。如果master设置了yes来禁止tcp nodelay设置，在把数据复制给slave的时候，会减少包的数量和更小的网络带宽。但是这也可能带来数据的延迟。默认我们推荐更小的延迟，但是在数据量传输很大的场景下，建议选择yes。</span><br><span class="line">repl-disable-tcp-nodelay no</span><br><span class="line"></span><br><span class="line">#复制缓冲区大小，这是一个环形复制缓冲区，用来保存最新复制的命令。这样在slave离线的时候，不需要完全复制master的数据，如果可以执行部分同步，只需要把缓冲区的部分数据复制给slave，就能恢复正常复制状态。缓冲区的大小越大，slave离线的时间可以更长，复制缓冲区只有在有slave连接的时候才分配内存。没有slave的一段时间，内存会被释放出来，默认<span class="number">1</span>m。</span><br><span class="line">#repl-backlog-size <span class="number">5</span>mb</span><br><span class="line"></span><br><span class="line">#master没有slave一段时间会释放复制缓冲区的内存，repl-backlog-ttl用来设置该时间长度。单位为秒。</span><br><span class="line">#repl-backlog-ttl <span class="number">3600</span></span><br><span class="line"></span><br><span class="line">#当master不可用，Sentinel会根据slave的优先级选举一个master。最低的优先级的slave，当选master。而配置成<span class="number">0</span>，永远不会被选举。</span><br><span class="line">slave-priority <span class="number">100</span></span><br><span class="line"></span><br><span class="line">#redis提供了可以让master停止写入的方式，如果配置了min-slaves-to-write，健康的slave的个数小于N，mater就禁止写入。master最少得有多少个健康的slave存活才能执行写命令。这个配置虽然不能保证N个slave都一定能接收到master的写操作，但是能避免没有足够健康的slave的时候，master不能写入来避免数据丢失。设置为<span class="number">0</span>是关闭该功能。</span><br><span class="line">#min-slaves-to-write <span class="number">3</span></span><br><span class="line"></span><br><span class="line">#延迟小于min-slaves-max-lag秒的slave才认为是健康的slave。</span><br><span class="line">#min-slaves-max-lag <span class="number">10</span></span><br><span class="line"></span><br><span class="line">#设置<span class="number">1</span>或另一个设置为<span class="number">0</span>禁用这个特性。</span><br><span class="line">#Setting one or the other to <span class="number">0</span> disables the feature.</span><br><span class="line">#By default min-slaves-to-write is set to <span class="number">0</span> (feature disabled) and</span><br><span class="line">#min-slaves-max-lag is set to <span class="number">10.</span></span><br><span class="line"></span><br><span class="line">##################################SECURITY ###################################</span><br><span class="line">#requirepass配置可以让用户使用AUTH命令来认证密码，才能使用其他命令。这让redis可以使用在不受信任的网络中。为了保持向后的兼容性，可以注释该命令，因为大部分用户也不需要认证。使用requirepass的时候需要注意，因为redis太快了，每秒可以认证<span class="number">15</span>w次密码，简单的密码很容易被攻破，所以最好使用一个更复杂的密码。</span><br><span class="line">#requirepass foobared</span><br><span class="line"></span><br><span class="line">#把危险的命令给修改成其他名称。比如CONFIG命令可以重命名为一个很难被猜到的命令，这样用户不能使用，而内部工具还能接着使用。</span><br><span class="line">#rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52</span><br><span class="line"></span><br><span class="line">#设置成一个空的值，可以禁止一个命令</span><br><span class="line">#rename-command CONFIG <span class="string">&quot;&quot;</span></span><br><span class="line">###################################LIMITS ####################################</span><br><span class="line"></span><br><span class="line">#设置能连上redis的最大客户端连接数量。默认是<span class="number">10000</span>个客户端连接。由于redis不区分连接是客户端连接还是内部打开文件或者和slave连接等，所以maxclients最小建议设置到<span class="number">32</span>。如果超过了maxclients，redis会给新的连接发送’max number <span class="keyword">of</span> clients reached’，并关闭连接。</span><br><span class="line">#maxclients <span class="number">10000</span></span><br><span class="line"></span><br><span class="line">#redis配置的最大内存容量。当内存满了，需要配合maxmemory-policy策略进行处理。注意slave的输出缓冲区是不计算在maxmemory内的。所以为了防止主机内存使用完，建议设置的maxmemory需要更小一些。</span><br><span class="line">#maxmemory &lt;bytes&gt;</span><br><span class="line"></span><br><span class="line">#内存容量超过maxmemory后的处理策略。</span><br><span class="line">#volatile-lru：利用LRU算法移除设置过过期时间的key。</span><br><span class="line">#volatile-random：随机移除设置过过期时间的key。</span><br><span class="line">#volatile-ttl：移除即将过期的key，根据最近过期时间来删除（辅以TTL）</span><br><span class="line">#allkeys-lru：利用LRU算法移除任何key。</span><br><span class="line">#allkeys-random：随机移除任何key。</span><br><span class="line">#noeviction：不移除任何key，只是返回一个写错误。</span><br><span class="line">#上面的这些驱逐策略，如果redis没有合适的key驱逐，对于写命令，还是会返回错误。redis将不再接收写请求，只接收get请求。写命令包括：set setnx setex append incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby getset mset msetnx exec sort。</span><br><span class="line">#maxmemory-policy noeviction</span><br><span class="line"></span><br><span class="line">#lru检测的样本数。使用lru或者ttl淘汰算法，从需要淘汰的列表中随机选择sample个key，选出闲置时间最长的key移除。</span><br><span class="line">#maxmemory-samples <span class="number">5</span></span><br><span class="line"></span><br><span class="line">##############################APPEND ONLY MODE ###############################</span><br><span class="line">#默认redis使用的是rdb方式持久化，这种方式在许多应用中已经足够用了。但是redis如果中途宕机，会导致可能有几分钟的数据丢失，根据save来策略进行持久化，Append Only File是另一种持久化方式，可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件，每次启动时Redis都会先把这个文件的数据读入内存里，先忽略RDB文件。</span><br><span class="line">appendonly no</span><br><span class="line"></span><br><span class="line">#aof文件名</span><br><span class="line">appendfilename <span class="string">&quot;appendonly.aof&quot;</span></span><br><span class="line"></span><br><span class="line">#aof持久化策略的配置</span><br><span class="line">#no表示不执行fsync，由操作系统保证数据同步到磁盘，速度最快。</span><br><span class="line">#always表示每次写入都执行fsync，以保证数据同步到磁盘。</span><br><span class="line">#everysec表示每秒执行一次fsync，可能会导致丢失这<span class="number">1</span>s数据。</span><br><span class="line">appendfsync everysec</span><br><span class="line"></span><br><span class="line">#在aof重写或者写入rdb文件的时候，会执行大量IO，此时对于everysec和always的aof模式来说，执行fsync会造成阻塞过长时间，no-appendfsync-on-rewrite字段设置为默认设置为no。如果对延迟要求很高的应用，这个字段可以设置为yes，否则还是设置为no，这样对持久化特性来说这是更安全的选择。设置为yes表示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入，默认为no，建议yes。Linux的默认fsync策略是<span class="number">30</span>秒。可能丢失<span class="number">30</span>秒数据。</span><br><span class="line">no-appendfsync-on-rewrite no</span><br><span class="line"></span><br><span class="line">#aof自动重写配置。当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写，即当aof文件增长到一定大小的时候Redis能够调用bgrewriteaof对日志文件进行重写。当前AOF文件大小是上次日志重写得到AOF文件大小的二倍（设置为<span class="number">100</span>）时，自动启动新的日志重写过程。</span><br><span class="line">auto-aof-rewrite-percentage <span class="number">100</span></span><br><span class="line">#设置允许重写的最小aof文件大小，避免了达到约定百分比但尺寸仍然很小的情况还要重写</span><br><span class="line">auto-aof-rewrite-min-size <span class="number">64</span>mb</span><br><span class="line"></span><br><span class="line">#aof文件可能在尾部是不完整的，当redis启动的时候，aof文件的数据被载入内存。重启可能发生在redis所在的主机操作系统宕机后，尤其在ext4文件系统没有加上data=ordered选项（redis宕机或者异常终止不会造成尾部不完整现象。）出现这种现象，可以选择让redis退出，或者导入尽可能多的数据。如果选择的是yes，当截断的aof文件被导入的时候，会自动发布一个log给客户端然后load。如果是no，用户必须手动redis-check-aof修复AOF文件才可以。</span><br><span class="line">aof-load-truncated yes</span><br><span class="line"></span><br><span class="line">################################LUA SCRIPTING ###############################</span><br><span class="line">#如果达到最大时间限制（毫秒），redis会记个log，然后返回error。当一个脚本超过了最大时限。只有SCRIPT KILL和SHUTDOWN NOSAVE可以用。第一个可以杀没有调write命令的东西。要是已经调用了write，只能用第二个命令杀。</span><br><span class="line">lua-time-limit <span class="number">5000</span></span><br><span class="line"></span><br><span class="line">################################REDIS CLUSTER ###############################</span><br><span class="line">#集群开关，默认是不开启集群模式。</span><br><span class="line">#cluster-enabled yes</span><br><span class="line"></span><br><span class="line">#集群配置文件的名称，每个节点都有一个集群相关的配置文件，持久化保存集群的信息。这个文件并不需要手动配置，这个配置文件有Redis生成并更新，每个Redis集群节点需要一个单独的配置文件，请确保与实例运行的系统中配置文件名称不冲突</span><br><span class="line">#cluster-config-file nodes<span class="number">-6379.</span>conf</span><br><span class="line"></span><br><span class="line">#节点互连超时的阀值。集群节点超时毫秒数</span><br><span class="line">#cluster-node-timeout <span class="number">15000</span></span><br><span class="line"></span><br><span class="line">#在进行故障转移的时候，全部slave都会请求申请为master，但是有些slave可能与master断开连接一段时间了，导致数据过于陈旧，这样的slave不应该被提升为master。该参数就是用来判断slave节点与master断线的时间是否过长。判断方法是：</span><br><span class="line">#比较slave断开连接的时间和(node-timeout * slave-validity-factor) + repl-ping-slave-period</span><br><span class="line">#如果节点超时时间为三十秒, 并且slave-validity-factor为<span class="number">10</span>,假设默认的repl-ping-slave-period是<span class="number">10</span>秒，即如果超过<span class="number">310</span>秒slave将不会尝试进行故障转移 </span><br><span class="line">#cluster-slave-validity-factor <span class="number">10</span></span><br><span class="line"></span><br><span class="line">#master的slave数量大于该值，slave才能迁移到其他孤立master上，如这个参数若被设为<span class="number">2</span>，那么只有当一个主节点拥有<span class="number">2</span> 个可工作的从节点时，它的一个从节点会尝试迁移。</span><br><span class="line">#cluster-migration-barrier <span class="number">1</span></span><br><span class="line"></span><br><span class="line">#默认情况下，集群全部的slot有节点负责，集群状态才为ok，才能提供服务。设置为no，可以在slot没有全部分配的时候提供服务。不建议打开该配置，这样会造成分区的时候，小分区的master一直在接受写请求，而造成很长时间数据不一致。</span><br><span class="line">#cluster-require-full-coverage yes</span><br><span class="line"></span><br><span class="line">##################################SLOW LOG ###################################</span><br><span class="line">###slog log是用来记录redis运行中执行比较慢的命令耗时。当命令的执行超过了指定时间，就记录在slow log中，slog log保存在内存中，所以没有IO操作。</span><br><span class="line">#执行时间比slowlog-log-slower-than大的请求记录到slowlog里面，单位是微秒，所以<span class="number">1000000</span>就是<span class="number">1</span>秒。注意，负数时间会禁用慢查询日志，而<span class="number">0</span>则会强制记录所有命令。</span><br><span class="line">slowlog-log-slower-than <span class="number">10000</span></span><br><span class="line"></span><br><span class="line">#慢查询日志长度。当一个新的命令被写进日志的时候，最老的那个记录会被删掉。这个长度没有限制。只要有足够的内存就行。你可以通过 SLOWLOG RESET 来释放内存。</span><br><span class="line">slowlog-max-len <span class="number">128</span></span><br><span class="line"></span><br><span class="line">################################LATENCY MONITOR ##############################</span><br><span class="line">#延迟监控功能是用来监控redis中执行比较缓慢的一些操作，用LATENCY打印redis实例在跑命令时的耗时图表。只记录大于等于下边设置的值的操作。<span class="number">0</span>的话，就是关闭监视。默认延迟监控功能是关闭的，如果你需要打开，也可以通过CONFIG SET命令动态设置。</span><br><span class="line">latency-monitor-threshold <span class="number">0</span></span><br><span class="line"></span><br><span class="line">#############################EVENT NOTIFICATION ##############################</span><br><span class="line">#键空间通知使得客户端可以通过订阅频道或模式，来接收那些以某种方式改动了 Redis 数据集的事件。因为开启键空间通知功能需要消耗一些 CPU ，所以在默认配置下，该功能处于关闭状态。</span><br><span class="line">#notify-keyspace-events 的参数可以是以下字符的任意组合，它指定了服务器该发送哪些类型的通知：</span><br><span class="line">##K 键空间通知，所有通知以 __keyspace@__ 为前缀</span><br><span class="line">##E 键事件通知，所有通知以 __keyevent@__ 为前缀</span><br><span class="line">##g DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知</span><br><span class="line">##$ 字符串命令的通知</span><br><span class="line">##l 列表命令的通知</span><br><span class="line">##s 集合命令的通知</span><br><span class="line">##h 哈希命令的通知</span><br><span class="line">##z 有序集合命令的通知</span><br><span class="line">##x 过期事件：每当有过期键被删除时发送</span><br><span class="line">##e 驱逐(evict)事件：每当有键因为 maxmemory 政策而被删除时发送</span><br><span class="line">##A 参数 g$lshzxe 的别名</span><br><span class="line">#输入的参数中至少要有一个 K 或者 E，否则的话，不管其余的参数是什么，都不会有任何 通知被分发。详细使用可以参考http:<span class="comment">//redis.io/topics/notifications</span></span><br><span class="line"></span><br><span class="line">notify-keyspace-events <span class="string">&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">###############################ADVANCED CONFIG ###############################</span><br><span class="line">#数据量小于等于hash-max-ziplist-entries的用ziplist，大于hash-max-ziplist-entries用hash</span><br><span class="line">hash-max-ziplist-entries <span class="number">512</span></span><br><span class="line">#value大小小于等于hash-max-ziplist-value的用ziplist，大于hash-max-ziplist-value用hash。</span><br><span class="line">hash-max-ziplist-value <span class="number">64</span></span><br><span class="line"></span><br><span class="line">#数据量小于等于list-max-ziplist-entries用ziplist，大于list-max-ziplist-entries用list。</span><br><span class="line">list-max-ziplist-entries <span class="number">512</span></span><br><span class="line">#value大小小于等于list-max-ziplist-value的用ziplist，大于list-max-ziplist-value用list。</span><br><span class="line">list-max-ziplist-value <span class="number">64</span></span><br><span class="line"></span><br><span class="line">#数据量小于等于set-max-intset-entries用iniset，大于set-max-intset-entries用set。</span><br><span class="line">set-max-intset-entries <span class="number">512</span></span><br><span class="line"></span><br><span class="line">#数据量小于等于zset-max-ziplist-entries用ziplist，大于zset-max-ziplist-entries用zset。</span><br><span class="line">zset-max-ziplist-entries <span class="number">128</span></span><br><span class="line">#value大小小于等于zset-max-ziplist-value用ziplist，大于zset-max-ziplist-value用zset。</span><br><span class="line">zset-max-ziplist-value <span class="number">64</span></span><br><span class="line"></span><br><span class="line">#value大小小于等于hll-sparse-max-bytes使用稀疏数据结构（sparse），大于hll-sparse-max-bytes使用稠密的数据结构（dense）。一个比<span class="number">16000</span>大的value是几乎没用的，建议的value大概为<span class="number">3000</span>。如果对CPU要求不高，对空间要求较高的，建议设置到<span class="number">10000</span>左右。</span><br><span class="line">hll-sparse-max-bytes <span class="number">3000</span></span><br><span class="line"></span><br><span class="line">#Redis将在每<span class="number">100</span>毫秒时使用<span class="number">1</span>毫秒的CPU时间来对redis的hash表进行重新hash，可以降低内存的使用。当你的使用场景中，有非常严格的实时性需要，不能够接受Redis时不时的对请求有<span class="number">2</span>毫秒的延迟的话，把这项配置为no。如果没有这么严格的实时性要求，可以设置为yes，以便能够尽可能快的释放内存。</span><br><span class="line">activerehashing yes</span><br><span class="line"></span><br><span class="line">##对客户端输出缓冲进行限制可以强迫那些不从服务器读取数据的客户端断开连接，用来强制关闭传输缓慢的客户端。</span><br><span class="line">#对于normal client，第一个<span class="number">0</span>表示取消hard limit，第二个<span class="number">0</span>和第三个<span class="number">0</span>表示取消soft limit，normal client默认取消限制，因为如果没有寻问，他们是不会接收数据的。</span><br><span class="line">client-output-buffer-limit normal <span class="number">0</span> <span class="number">0</span> <span class="number">0</span></span><br><span class="line">#对于slave client和MONITER client，如果client-output-buffer一旦超过<span class="number">256</span>mb，又或者超过<span class="number">64</span>mb持续<span class="number">60</span>秒，那么服务器就会立即断开客户端连接。</span><br><span class="line">client-output-buffer-limit slave <span class="number">256</span>mb <span class="number">64</span>mb <span class="number">60</span></span><br><span class="line">#对于pubsub client，如果client-output-buffer一旦超过<span class="number">32</span>mb，又或者超过<span class="number">8</span>mb持续<span class="number">60</span>秒，那么服务器就会立即断开客户端连接。</span><br><span class="line">client-output-buffer-limit pubsub <span class="number">32</span>mb <span class="number">8</span>mb <span class="number">60</span></span><br><span class="line"></span><br><span class="line">#redis执行任务的频率为<span class="number">1</span>s除以hz。</span><br><span class="line">hz <span class="number">10</span></span><br><span class="line"></span><br><span class="line">#在aof重写的时候，如果打开了aof-rewrite-incremental-fsync开关，系统会每<span class="number">32</span>MB执行一次fsync。这对于把文件写入磁盘是有帮助的，可以避免过大的延迟峰值。</span><br><span class="line">aof-rewrite-incremental-fsync yes</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;figure class=&quot;highlight clean&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class</summary>
      
    
    
    
    
    <category term="Redis" scheme="https://kgtech.top/tags/Redis/"/>
    
  </entry>
  
  <entry>
    <title>Redis学习笔记(一)</title>
    <link href="https://kgtech.top/2019/03/09/Redis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E4%B8%80/"/>
    <id>https://kgtech.top/2019/03/09/Redis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E4%B8%80/</id>
    <published>2019-03-09T14:53:13.000Z</published>
    <updated>2019-03-22T02:12:06.996Z</updated>
    
    <content type="html"><![CDATA[<p>感觉已经到了不得不学Redis的时候了。。<br>Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的key-value存储数据库。有几大特点：</p><ul><li>开源单线程</li><li>内存操作</li><li>多种数据结构</li><li>支持事务</li><li>持久化</li><li>高可用、分布式</li><li>主从复制</li></ul><h2 id="支持的数据结构"><a href="#支持的数据结构" class="headerlink" title="支持的数据结构"></a>支持的数据结构</h2><p>Redis支持五种数据类型：string（字符串），hash（哈希），list（列表），set（集合）及zset(sorted set：有序集合)。</p><h3 id="字符串"><a href="#字符串" class="headerlink" title="字符串"></a>字符串</h3><p>字符串就是一对kv串，而对应的value可以是任意数据，比如jpg图片等，最大能存储 512MB</p><figure class="highlight pgsql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">SET</span> <span class="type">name</span> &quot;hello&quot;</span><br><span class="line">OK</span><br><span class="line"><span class="keyword">GET</span> <span class="type">name</span></span><br><span class="line">&quot;hello&quot;</span><br></pre></td></tr></table></figure><table><thead><tr><th>hello</th><th>world</th></tr></thead><tbody><tr><td>counter</td><td>1</td></tr><tr><td>bits</td><td>bits</td></tr></tbody></table><h3 id="哈希"><a href="#哈希" class="headerlink" title="哈希"></a>哈希</h3><p>哈希是键值对集合，是一个 string 类型的 field 和 value 的映射表，hash 特别适合用于存储对象。每个 hash 可以存储 232 -1 键值对（40多亿）。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">HMSET myhash field1 &quot;Hello&quot; field2 &quot;World&quot;</span><br><span class="line">&quot;OK&quot;</span><br><span class="line">redis&gt; HGET myhash field1</span><br><span class="line">&quot;Hello&quot;</span><br><span class="line">redis&gt; HGET myhash field2</span><br><span class="line">&quot;World&quot;</span><br></pre></td></tr></table></figure><p><a href="https://i.loli.net/2019/03/22/5c943a3e30646.jpg"><img src="https://i.loli.net/2019/03/22/5c943a3e30646.jpg" alt="哈希值.jpg"></a></p><h3 id="列表"><a href="#列表" class="headerlink" title="列表"></a>列表</h3><p>列表是简单的字符串列表，按照插入顺序排序。</p><p><a href="https://i.loli.net/2019/03/22/5c943a815f55c.jpg"><img src="https://i.loli.net/2019/03/22/5c943a815f55c.jpg" alt="列表.jpg"></a></p><h3 id="无序集合"><a href="#无序集合" class="headerlink" title="无序集合"></a>无序集合</h3><p>集合是通过哈希表实现的，所以添加，删除，查找的复杂度都是O(1)。<br>无序集合如何保证集合中的元素唯一？在添加之前会做两件事</p><ol><li>判断值是否相等</li><li>判断hashcode是否相等</li></ol><h3 id="有序集合"><a href="#有序集合" class="headerlink" title="有序集合"></a>有序集合</h3><p>Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数(score)来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。</p><h3 id="数据类型内部编码"><a href="#数据类型内部编码" class="headerlink" title="数据类型内部编码"></a>数据类型内部编码</h3><p><a href="https://i.loli.net/2019/03/22/5c942f42ca32e.jpg"><img src="https://i.loli.net/2019/03/22/5c942f42ca32e.jpg" alt="数据内部编码.jpg"></a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;感觉已经到了不得不学Redis的时候了。。&lt;br&gt;Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的key-value存储数据库。有几大特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开源单线程&lt;/li&gt;
&lt;li&gt;内存操作&lt;/li&gt;
&lt;li&gt;多种数据结构&lt;/li</summary>
      
    
    
    
    
    <category term="redis" scheme="https://kgtech.top/tags/redis/"/>
    
  </entry>
  
  <entry>
    <title>数据库事务的四大特性</title>
    <link href="https://kgtech.top/2019/02/28/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1%E7%9A%84%E5%9B%9B%E5%A4%A7%E7%89%B9%E6%80%A7/"/>
    <id>https://kgtech.top/2019/02/28/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BA%8B%E5%8A%A1%E7%9A%84%E5%9B%9B%E5%A4%A7%E7%89%B9%E6%80%A7/</id>
    <published>2019-02-28T14:11:13.000Z</published>
    <updated>2019-02-28T23:36:06.644Z</updated>
    
    <content type="html"><![CDATA[<h3 id="1、原子性（Atomicity）"><a href="#1、原子性（Atomicity）" class="headerlink" title="1、原子性（Atomicity）"></a>1、原子性（Atomicity）</h3><ul><li>原子性是指事务包含的所有操作要么全部成功，要么全部失败回滚</li></ul><h3 id="2、一致性（Consistency）"><a href="#2、一致性（Consistency）" class="headerlink" title="2、一致性（Consistency）"></a>2、一致性（Consistency）</h3><ul><li>一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态，也就是说一个事务执行之前和执行之后都必须处于一致性状态。</li></ul><h3 id="3、隔离性（Isolation）"><a href="#3、隔离性（Isolation）" class="headerlink" title="3、隔离性（Isolation）"></a>3、隔离性（Isolation）</h3><ul><li>隔离性是当多个用户并发访问数据库时，比如操作同一张表时，数据库为每一个用户开启的事务，不能被其他事务的操作所干扰，多个并发事务之间要相互隔离。</li></ul><h3 id="4、持久性（Durability）"><a href="#4、持久性（Durability）" class="headerlink" title="4、持久性（Durability）"></a>4、持久性（Durability）</h3><ul><li>持久性是指一个事务一旦被提交了，那么对数据库中的数据的改变就是永久性的，即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。</li></ul><p>那么问题来了。当数据库的并发高的时候会出现什么问题呢？</p><h2 id="数据库事务的高并发问题"><a href="#数据库事务的高并发问题" class="headerlink" title="数据库事务的高并发问题"></a>数据库事务的高并发问题</h2><h3 id="1、脏读"><a href="#1、脏读" class="headerlink" title="1、脏读"></a>1、脏读</h3><ul><li>事务A读取了事务B更新的数据，然后B回滚操作，那么A读取到的数据是脏数据</li></ul><h3 id="2、不可重复读"><a href="#2、不可重复读" class="headerlink" title="2、不可重复读"></a>2、不可重复读</h3><ul><li>事务 A 多次读取同一数据，事务 B 在事务A多次读取的过程中，对数据作了更新并提交，导致事务A多次读取同一数据时，结果不一致。</li></ul><h3 id="3、幻读"><a href="#3、幻读" class="headerlink" title="3、幻读"></a>3、幻读</h3><ul><li>系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级，但是系统管理员B就在这个时候插入了一条具体分数的记录，当系统管理员A改结束后发现还有一条记录没有改过来，就好像发生了幻觉一样，这就叫幻读。</li><li>T1从一个表中读取了一个字段，然后T2在该表中插入了一些新的行，之后T1在此读取该表会多出几行。</li></ul><h2 id="MySQL数据库事务的隔离级别"><a href="#MySQL数据库事务的隔离级别" class="headerlink" title="MySQL数据库事务的隔离级别"></a>MySQL数据库事务的隔离级别</h2><table><thead><tr><th>事务隔离级别</th><th>脏读</th><th>不可重复读</th><th>幻读</th></tr></thead><tbody><tr><td>读未提交（read-uncommitted）</td><td>√</td><td>√</td><td>√</td></tr><tr><td>不可重复读（read-committed）</td><td>×</td><td>√</td><td>√</td></tr><tr><td>可重复读（repeatable-read）</td><td>×</td><td>×</td><td>√</td></tr><tr><td>串行化（serializable）</td><td>×</td><td>×</td><td>×</td></tr></tbody></table><h3 id="说明："><a href="#说明：" class="headerlink" title="说明："></a>说明：</h3><ul><li>事务隔离级别为读提交时，写数据只会锁住相应的行</li><li>事务隔离级别为可重复读时，如果检索条件有索引（包括主键索引）的时候，默认加锁方式是next-key 锁；如果检索条件没有索引，更新数据时会锁住整张表。一个间隙被事务加了锁，其他事务是不能在这个间隙插入记录的，这样可以防止幻读。</li><li>事务隔离级别为串行化时，读写数据都会锁住整张表</li><li>隔离级别越高，越能保证数据的完整性和一致性，但是对并发性能的影响也越大。</li></ul><p>参考文章<a href="https://www.cnblogs.com/huanongying/p/7021555.html">：MySQL的四种事务隔离级别</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h3 id=&quot;1、原子性（Atomicity）&quot;&gt;&lt;a href=&quot;#1、原子性（Atomicity）&quot; class=&quot;headerlink&quot; title=&quot;1、原子性（Atomicity）&quot;&gt;&lt;/a&gt;1、原子性（Atomicity）&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;原子性是指事务包</summary>
      
    
    
    
    
    <category term="learn" scheme="https://kgtech.top/tags/learn/"/>
    
  </entry>
  
  <entry>
    <title>强类型语言和弱类型语言</title>
    <link href="https://kgtech.top/2019/02/28/%E5%BC%BA%E7%B1%BB%E5%9E%8B%E8%AF%AD%E8%A8%80%E5%92%8C%E5%BC%B1%E7%B1%BB%E5%9E%8B%E8%AF%AD%E8%A8%80/"/>
    <id>https://kgtech.top/2019/02/28/%E5%BC%BA%E7%B1%BB%E5%9E%8B%E8%AF%AD%E8%A8%80%E5%92%8C%E5%BC%B1%E7%B1%BB%E5%9E%8B%E8%AF%AD%E8%A8%80/</id>
    <published>2019-02-28T13:46:26.000Z</published>
    <updated>2019-02-28T23:34:46.593Z</updated>
    
    <content type="html"><![CDATA[<p>面试中考了一道题，题目如下：<br>在Python环境中运行</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="title">print</span><span class="params">(<span class="number">1</span> + <span class="string">&quot;9&quot;</span>)</span></span></span><br><span class="line"><span class="function"><span class="title">print</span><span class="params">(<span class="string">&quot;9&quot;</span> + <span class="number">1</span>)</span></span></span><br></pre></td></tr></table></figure><p>会出现什么？<br>一开始很困惑，当我自己去跑一遍之后发现，解释器会报错</p><figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">TypeError</span>: unsupported operand <span class="keyword">type</span>(s) <span class="keyword">for</span> +: <span class="string">&#x27;int&#x27;</span> and <span class="string">&#x27;str&#x27;</span></span><br></pre></td></tr></table></figure><p>我突然才意识到，这里涉及的强类型语言和弱类型语言的区别</p><hr><h3 id="强类型语言"><a href="#强类型语言" class="headerlink" title="强类型语言"></a>强类型语言</h3><ul><li>强类型语言又称为强类型定义语言，要求所有的变量都有强制定义，之后才能使用，而且一旦声明之后，如果不经过强制转换，那么它就永远是这个数据类型了。</li><li>一般也不允许不同类型的不同类型的变量互相进行运算</li><li>比如Java，C++，Python就属于强类型语言</li></ul><h3 id="弱类型语言"><a href="#弱类型语言" class="headerlink" title="弱类型语言"></a>弱类型语言</h3><ul><li>弱类型语言又称弱类型定义语言，与强类型语言相反，允许不同类型的变量进行相互运算</li><li>比如在VBScript中，可以将字符串‘12’和整数3进行连接得到字符串‘123’，然后可以把它看成整数123，而不需要显示转换。</li></ul><hr><p>强类型定义语言在速度上可能略逊色于弱类型定义语言，但是强类型定义语言带来的严谨性能够有效的避免许多错误。</p><h2 id="关于动态语言和静态语言"><a href="#关于动态语言和静态语言" class="headerlink" title="关于动态语言和静态语言"></a>关于动态语言和静态语言</h2><p>所有的编程语言都是需要先经过编译之后才能供机器使用的</p><h3 id="动态语言"><a href="#动态语言" class="headerlink" title="动态语言"></a>动态语言</h3><ul><li>动态类型语言是指在运行期间才去做数据类型检查的语言，也就是说，在用动态类型的语言编程时，永远也不用给任何变量指定数据类型，该语言会在你第一次赋值给变量时，在内部将数据类型记录下来。</li><li>Python和Ruby就是一种典型的动态类型语言，其他的各种脚本语言如VBScript也多少属于动态类型语言</li></ul><h3 id="静态语言"><a href="#静态语言" class="headerlink" title="静态语言"></a>静态语言</h3><ul><li>静态类型语言与动态类型语言刚好相反，它的数据类型是在编译其间检查的，也就是说在写程序时要声明所有变量的数据类型。</li><li>C/C++是静态类型语言的典型代表，其他的静态类型语言还有C#、JAVA等。</li></ul><hr><p>动态语言易上手，而且无需事先将所有变量都申明好，而静态语言的好处是运行速度会比动态语言快</p><p>Python 属于强类型的动态脚本语言</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;面试中考了一道题，题目如下：&lt;br&gt;在Python环境中运行&lt;/p&gt;
&lt;figure class=&quot;highlight stylus&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;sp</summary>
      
    
    
    
    
    <category term="learn" scheme="https://kgtech.top/tags/learn/"/>
    
  </entry>
  
  <entry>
    <title>python四种命名方式</title>
    <link href="https://kgtech.top/2019/02/19/python%E5%9B%9B%E7%A7%8D%E5%91%BD%E5%90%8D%E6%96%B9%E5%BC%8F/"/>
    <id>https://kgtech.top/2019/02/19/python%E5%9B%9B%E7%A7%8D%E5%91%BD%E5%90%8D%E6%96%B9%E5%BC%8F/</id>
    <published>2019-02-19T01:08:22.000Z</published>
    <updated>2019-02-19T01:08:49.703Z</updated>
    
    <content type="html"><![CDATA[<ol><li><p>object 公共方法</p></li><li><p>_object 半保护</p><blockquote><p>被看作是“protect”，意思是只有类对象和子类对象自己能访问到这些变量，在模块或类外不可以使用，不能用’from module import * 导入。</p></blockquote></li><li><p>_ _ object  全私有，全保护</p><blockquote><p>__object 是为了避免与子类的方法名称冲突， 对于该标识符描述的方法，父类的方法不能轻易地被子类的方法覆盖，他们的名字实际上_classname__methodname。</p></blockquote></li></ol><ol start="4"><li>_ _ object_ _     #内建方法，用户不要这样定义 </li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;ol&gt;
&lt;li&gt;&lt;p&gt;object 公共方法&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;_object 半保护&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;被看作是“protect”，意思是只有类对象和子类对象自己能访问到这些变量，在模块或类外不可以使用，不能用’from module i</summary>
      
    
    
    
    
    <category term="python" scheme="https://kgtech.top/tags/python/"/>
    
  </entry>
  
</feed>
