<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>PHP - 标签 - 开发者技术小屋</title>
        <link>https://www.developerhome.net/tags/php/</link>
        <description>PHP - 标签 - 开发者技术小屋</description>
        <generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Wed, 24 Jan 2018 16:34:36 &#43;0000</lastBuildDate><atom:link href="https://www.developerhome.net/tags/php/" rel="self" type="application/rss+xml" /><item>
    <title>构建一个自己的PHP框架（二）——  底层搭建之单例模式</title>
    <link>https://www.developerhome.net/archives/138/</link>
    <pubDate>Wed, 24 Jan 2018 16:34:36 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/138/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-138.jpg" referrerpolicy="no-referrer">
            </div><p>好了，上一篇文章我们划分了目录结构，这篇我们将底层设计出来</p>
<p>PHP作为一个脚本语言，其关闭后释放的特性，因此对于每次运行来说，我们如果重复使用的东西，一般都会采用单例模式，这样可以在一次脚本执行过程中，让每一个使用到的对象、变量等做到一次声明多次使用并保证其维持运行状态</p>
<p>一个简单的单例模式就是使用一个全局的对象来存储所有用到的对象或变量</p>
<p>比如，我声明一个注册类，用于存储所有注册的变量、对象</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-php">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Registry</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">private</span> <span class="k">static</span> <span class="nv">$instanceList</span> <span class="o">=</span> <span class="p">[];</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">public</span> <span class="k">static</span> <span class="k">function</span> <span class="nf">set</span><span class="p">(</span><span class="nv">$name</span><span class="p">,</span> <span class="nv">$value</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">self</span><span class="o">::</span><span class="nv">$instanceList</span><span class="p">[</span><span class="nv">$name</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$value</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">public</span> <span class="k">static</span> <span class="k">function</span> <span class="nf">get</span><span class="p">(</span><span class="nv">$name</span><span class="p">,</span> <span class="nv">$default</span> <span class="o">=</span> <span class="k">null</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="nx">self</span><span class="o">::</span><span class="nv">$instanceList</span><span class="p">[</span><span class="nv">$name</span><span class="p">]</span> <span class="o">??</span> <span class="nv">$default</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">public</span> <span class="k">static</span> <span class="k">function</span> <span class="nf">exists</span><span class="p">(</span><span class="nv">$name</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="nx">isset</span><span class="p">(</span><span class="nx">self</span><span class="o">::</span><span class="nv">$instanceList</span><span class="p">[</span><span class="nv">$name</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">public</span> <span class="k">static</span> <span class="k">function</span> <span class="nf">del</span><span class="p">(</span><span class="nv">$name</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nx">unset</span><span class="p">(</span><span class="nx">self</span><span class="o">::</span><span class="nv">$instanceList</span><span class="p">[</span><span class="nv">$name</span><span class="p">]);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div>
<p>这样一个简单的注册类就完成了，使用的时候，只要使用</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-php">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nx">Registry</span><span class="o">::</span><span class="na">set</span><span class="p">(</span><span class="s2">&#34;hello&#34;</span><span class="p">,</span> <span class="s2">&#34;hello world&#34;</span><span class="p">);</span><span class="err">`</span></span></span></code></pre></div></div>
<p>来注册，需要的时候使用</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-php">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="nx">Registry</span><span class="o">::</span><span class="na">get</span><span class="p">(</span><span class="s2">&#34;hello&#34;</span><span class="p">);</span> <span class="c1">//hello world`
</span></span></span></code></pre></div></div>
<p>来获取就可以了</p>]]></description>
</item>
<item>
    <title>构建一个自己的PHP框架（一）——  你需要准备的</title>
    <link>https://www.developerhome.net/archives/63/</link>
    <pubDate>Thu, 20 Apr 2017 15:15:58 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/63/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-63.jpg" referrerpolicy="no-referrer">
            </div><p>对于大多数PHP程序员来说，可能在公司做项目，大部分还是使用的开源框架，常用的ThinkPHP、去年火起来的Laravel、之前很火的Yii、比较轻量的Codeigniter，强调性能的Yaf等，很多人长期使用一个框架，就会有很多自己的心得，那么何不我们自己来写一个框架呢？</p>
<p>首先，我们要选择一个框架的设计方案，现在主流框架均采用MVC模式</p>
<p>好了，我们来规划下目录</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><pre tabindex="0"><code>———— Framework
| |———— Storage
| | |———— Database
| | |———— Cache
| |———— Factory
| |———— Inters
| |———— Model
| |———— View
| |———— Controller
| |———— Collection
|—— Logs
|—— config.ini
|—— index.php</code></pre></div>
<p>下面我来详细介绍这个目录结构</p>
<ul>
<li>Framework 框架的目录，存储框架内所有文件</li>
<li>Logs 存储系统的日志</li>
<li>config.ini 框架的配置文件</li>
<li>index.php 框架的入口文件</li>
<li>Storage 存储目录，里面为框架所有存储服务，里面包含Cache存储和Database存储</li>
<li>Factory 存储框架内构件各种服务的工厂类</li>
<li>Inters 存储框架内所有interface接口定义</li>
<li>Model 存储所有的模型</li>
<li>View 存储所有的视图</li>
<li>Controller 存储所有的控制器</li>
<li>Collection 存储所有的集合（此处到说集合的时候会详细说明）</li>
</ul>
<p>以上这些规划后，我们就可以开始进行编程了。下一章开始进入系统底层搭建</p>]]></description>
</item>
<item>
    <title>百万级日志型数据另类分表方式</title>
    <link>https://www.developerhome.net/archives/47/</link>
    <pubDate>Mon, 17 Apr 2017 09:20:26 &#43;0000</pubDate>
    <author>Jarod</author>
    <guid>https://www.developerhome.net/archives/47/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/uploads/2026/06/cover-47.jpg" referrerpolicy="no-referrer">
            </div><p>对于时间性比较强的数据，比如日志类型、登录日志这样的数据，一般我们会建立一个日志表来存储，而当日志量超过百万级，则一个表来存储，将会造成很大的查询问题，而且对于日志数据，我们查询常常使用的是倒序查询，每页也仅仅查询几十条到几百条，查询效率会很差，因此必然会分表，那如何分表？在分表后又如何解决多表查询的问题呢？下面我就来推荐一种另类的分表方式</p>
<p>假设有这样一个日志类：</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-php">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-php" data-lang="php"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">Logs</span>
</span></span><span class="line"><span class="cl"><span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">private</span> <span class="nv">$id</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">private</span> <span class="nv">$contents</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">private</span> <span class="nv">$datetime</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="fm">__construct</span><span class="p">(</span><span class="nv">$contents</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">contents</span> <span class="o">=</span> <span class="nv">$contents</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">datetime</span> <span class="o">=</span> <span class="nx">date</span><span class="p">(</span><span class="s1">&#39;Y-m-d H:i:s&#39;</span><span class="p">,</span> <span class="nx">time</span><span class="p">());</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">    <span class="k">public</span> <span class="k">function</span> <span class="nf">save</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="nv">$sql</span> <span class="o">=</span> <span class="s2">&#34;INSERT INTO `logs`(`contents`, `datetime`) VALUES(&#39;</span><span class="si">{</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">contents</span><span class="si">}</span><span class="s2">&#39;, &#39;</span><span class="si">{</span><span class="nv">$this</span><span class="o">-&gt;</span><span class="na">datetime</span><span class="si">}</span><span class="s2">&#39;)&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="c1"># 执行sql，插入到数据库中，并返回插入的日志id, 此处省略过程
</span></span></span><span class="line"><span class="cl">        <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">id</span> <span class="o">=</span> <span class="nv">$insert_id</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">id</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span></span></span></code></pre></div></div>
<p>通过日志类的结构，我们建立一个数据表</p>
<div class="code-block code-line-numbers open" style="counter-reset: code-block 0">
    <div class="code-header language-sql">
        <span class="code-title"><i class="arrow fas fa-angle-right" aria-hidden="true"></i></span>
        <span class="ellipses"><i class="fas fa-ellipsis-h" aria-hidden="true"></i></span>
        <span class="copy" title="复制到剪贴板"><i class="far fa-copy" aria-hidden="true"></i></span>
    </div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="k">CREATE</span><span class="w"> </span><span class="k">TABLE</span><span class="w"> </span><span class="o">`</span><span class="n">logs</span><span class="o">`</span><span class="w"> </span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="o">`</span><span class="n">id</span><span class="o">`</span><span class="w"> </span><span class="nb">int</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span><span class="w"> </span><span class="n">UNSIGNED</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="w"> </span><span class="n">AUTO_INCREMENT</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="o">`</span><span class="n">contents</span><span class="o">`</span><span class="w"> </span><span class="nb">text</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="o">`</span><span class="n">datetime</span><span class="o">`</span><span class="w"> </span><span class="n">datetime</span><span class="w"> </span><span class="k">NOT</span><span class="w"> </span><span class="k">NULL</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">	</span><span class="k">PRIMARY</span><span class="w"> </span><span class="k">KEY</span><span class="w"> </span><span class="p">(</span><span class="o">`</span><span class="n">id</span><span class="o">`</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="p">)</span><span class="w"> </span><span class="n">ENGINE</span><span class="o">=`</span><span class="n">MyISAM</span><span class="o">`</span><span class="w"> </span><span class="k">DEFAULT</span><span class="w"> </span><span class="nb">CHARACTER</span><span class="w"> </span><span class="k">SET</span><span class="w"> </span><span class="n">utf8</span><span class="w"> </span><span class="k">COLLATE</span><span class="w"> </span><span class="n">utf8_general_ci</span><span class="p">;</span></span></span></code></pre></div></div>
<p>一般来说，单表情况下，我们的id为自增。现在我们来分析这个日志类的特点：</p>]]></description>
</item>
</channel>
</rss>
