Jekyll2020-03-05T14:32:37+00:00/feed.xml记仇的小本本用来记仇的小本本KK测试快速插入100W条数据2020-03-04T16:00:00+00:002020-03-04T16:00:00+00:00/mysql/2020/03/04/%E5%BF%AB%E9%80%9F%E6%8F%92%E5%85%A5100W%E6%9D%A1%E6%95%B0%E6%8D%AE<h1 id="测试快速插入100w条数据">测试快速插入100W条数据</h1>
<h2 id="表结构">表结构</h2>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">CREATE</span> <span class="k">TABLE</span> <span class="nv">`test_kk`</span> <span class="p">(</span>
<span class="nv">`id`</span> <span class="nb">int</span><span class="p">(</span><span class="mi">11</span><span class="p">)</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="n">AUTO_INCREMENT</span><span class="p">,</span>
<span class="nv">`name`</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span> <span class="k">COLLATE</span> <span class="n">utf8mb4_bin</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="k">DEFAULT</span> <span class="s1">''</span><span class="p">,</span>
<span class="k">PRIMARY</span> <span class="k">KEY</span> <span class="p">(</span><span class="nv">`id`</span><span class="p">)</span>
<span class="p">)</span> <span class="n">ENGINE</span><span class="o">=</span><span class="n">InnoDB</span> <span class="n">AUTO_INCREMENT</span><span class="o">=</span><span class="mi">1</span> <span class="k">DEFAULT</span> <span class="n">CHARSET</span><span class="o">=</span><span class="n">utf8mb4</span> <span class="k">COLLATE</span><span class="o">=</span><span class="n">utf8mb4_bin</span>
</code></pre></div></div>
<h2 id="几种方式">几种方式</h2>
<p>任何情况下,单条循环插入效率都是极低的,所以就不详细描述了。</p>
<h3 id="存储过程拼接字符串插入">存储过程拼接字符串插入</h3>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">delimiter</span> <span class="err">$$</span>
<span class="k">create</span> <span class="k">PROCEDURE</span> <span class="n">pro1</span><span class="p">()</span>
<span class="k">BEGIN</span>
<span class="k">DECLARE</span> <span class="n">i</span> <span class="nb">int</span><span class="p">;</span>
<span class="k">set</span> <span class="n">i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span>
<span class="k">set</span> <span class="o">@</span><span class="n">strsql</span><span class="o">=</span><span class="s1">'INSERT INTO test_kk (name) values '</span><span class="p">;</span>
<span class="n">while</span> <span class="n">i</span><span class="o">>=</span><span class="mi">1</span> <span class="o">&&</span> <span class="n">i</span><span class="o"><=</span><span class="mi">10000</span> <span class="k">DO</span>
<span class="n">IF</span> <span class="n">i</span><span class="o">=</span><span class="mi">10000</span> <span class="k">then</span>
<span class="k">set</span> <span class="o">@</span><span class="n">strsql</span><span class="o">=</span><span class="n">CONCAT</span><span class="p">(</span><span class="o">@</span><span class="n">strsql</span><span class="p">,</span><span class="s1">'('</span><span class="p">,</span><span class="n">i</span><span class="p">,</span><span class="s1">');'</span><span class="p">);</span>
<span class="k">ELSE</span>
<span class="k">set</span> <span class="o">@</span><span class="n">strsql</span><span class="o">=</span><span class="n">CONCAT</span><span class="p">(</span><span class="o">@</span><span class="n">strsql</span><span class="p">,</span><span class="s1">'('</span><span class="p">,</span><span class="n">i</span><span class="p">,</span><span class="s1">'),'</span><span class="p">);</span>
<span class="k">end</span> <span class="n">if</span><span class="p">;</span>
<span class="k">set</span> <span class="n">i</span><span class="o">=</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span>
<span class="k">end</span> <span class="n">while</span><span class="p">;</span>
<span class="k">PREPARE</span> <span class="n">stmt</span> <span class="k">FROM</span> <span class="o">@</span><span class="n">strsql</span><span class="p">;</span>
<span class="k">EXECUTE</span> <span class="n">stmt</span><span class="p">;</span>
<span class="k">DEALLOCATE</span> <span class="k">PREPARE</span> <span class="n">stmt</span><span class="p">;</span>
<span class="k">END</span><span class="err">$$</span>
<span class="k">delimiter</span> <span class="p">;</span>
<span class="k">call</span> <span class="n">pro1</span><span class="p">();</span>
</code></pre></div></div>
<p>在测试之前,我认为这种方式速度是最快的,由于不确定100W条到底需要多久,先尝试了1W条。<br />
执行时间:0.2s</p>
<p>显然,速度非常快,照这个速度来说,一百万条大概是20s左右。<br />
将上面的数字调整为100W,悲剧来了。没有记录具体的时间,大概过了一万年(1900s)左右,执行完毕,我枯了。<br />
然后我又将数字调整为10W,执行时间是15.57s,于是我又尝试将数字调整为1000,执行时间是0.01s。<br />
如此看来,sql拼接字符串越多,时间呈指数型增长。<br />
什么原因,没有深入探究。<br />
另外也尝试了一次循环100W次插入的存储过程,执行时间:2916.67s,看来是可以不用考虑。</p>
<p>如此看来,将数字设为1000,使用代码调用循环调用1000次,执行时间:10.41s,这样是最快的。</p>
<h3 id="代码拼接字符串插入">代码拼接字符串插入</h3>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$sql</span> <span class="o">=</span> <span class="s1">'insert into test_kk (name) values '</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="nv">$i</span><span class="o">=</span><span class="mi">1</span><span class="p">;</span> <span class="nv">$i</span> <span class="o"><=</span> <span class="mi">1000000</span><span class="p">;</span> <span class="nv">$i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="nv">$sql</span> <span class="o">.=</span> <span class="nv">$i</span> <span class="o">==</span> <span class="mi">1000000</span> <span class="o">?</span> <span class="s1">'('</span><span class="o">.</span><span class="nv">$i</span><span class="o">.</span><span class="s1">');'</span> <span class="o">:</span> <span class="s1">'('</span><span class="o">.</span><span class="nv">$i</span><span class="o">.</span><span class="s1">'),'</span><span class="p">;</span>
<span class="p">}</span>
<span class="nv">$res</span> <span class="o">=</span> <span class="nx">DB</span><span class="o">::</span><span class="na">select</span><span class="p">(</span><span class="nv">$sql</span><span class="p">);</span>
</code></pre></div></div>
<p>100W条数据。<br />
执行时间:2.65s。<br />
我惊了。<br />
PHP不愧是世界上最好的语言。<br />
然后尝试拼接1000W条,结果内存不足,作罢。</p>
<p>以上仅供参考,插入速度和很多东西相关,比如硬盘速度,CPU等硬件水平,插入数据的复杂度,不能一概而论。</p>
<p>然而写测试数据用什么方法,心中似乎有了点B数。</p>KK测试快速插入100W条数据PHP坑爹手册 - 等等党永远不亏?2019-12-02T16:00:00+00:002019-12-02T16:00:00+00:00/php/2019/12/02/Holy%20PHP%201<h2 id="php坑爹手册---等等党永远不亏">PHP坑爹手册 - 等等党永远不亏?</h2>
<p>众所周知,在PHP的世界里,</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s1">'123456'</span> <span class="o">!=</span> <span class="s1">'123456a'</span>
</code></pre></div></div>
<p>此判断为真。</p>
<p>但在某种机缘巧合之下,我们可以实现</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s1">'123456'</span> <span class="o">==</span> <span class="s1">'123456a'</span>
</code></pre></div></div>
<p>此判断为真的效果。</p>
<p>请参考以下代码:</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp"><?php</span>
<span class="nv">$a</span> <span class="o">=</span> <span class="s1">'123456'</span><span class="p">;</span>
<span class="nv">$b</span> <span class="o">=</span> <span class="s1">'123456a'</span><span class="p">;</span>
<span class="nv">$a1</span><span class="p">[</span><span class="nv">$a</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$a</span><span class="p">;</span>
<span class="nv">$b1</span><span class="p">[</span><span class="nv">$b</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$b</span><span class="p">;</span>
<span class="k">foreach</span> <span class="p">(</span><span class="nv">$a1</span> <span class="k">as</span> <span class="nv">$k</span> <span class="o">=></span> <span class="nv">$v</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">foreach</span> <span class="p">(</span><span class="nv">$b1</span> <span class="k">as</span> <span class="nv">$k1</span> <span class="o">=></span> <span class="nv">$v1</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">echo</span> <span class="nv">$k</span> <span class="o">==</span> <span class="nv">$k1</span> <span class="o">?</span> <span class="s1">'excellence!'</span> <span class="o">:</span> <span class="s1">''</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>解决方案:<br />
修改代码并一个电话把提交代码的同学安排到非洲。</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp"><?php</span>
<span class="nv">$a</span> <span class="o">=</span> <span class="s1">'123456'</span><span class="p">;</span>
<span class="nv">$b</span> <span class="o">=</span> <span class="s1">'123456a'</span><span class="p">;</span>
<span class="nv">$a1</span><span class="p">[</span><span class="nv">$a</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$a</span><span class="p">;</span>
<span class="nv">$b1</span><span class="p">[</span><span class="nv">$b</span><span class="p">]</span> <span class="o">=</span> <span class="nv">$b</span><span class="p">;</span>
<span class="k">foreach</span> <span class="p">(</span><span class="nv">$a1</span> <span class="k">as</span> <span class="nv">$k</span> <span class="o">=></span> <span class="nv">$v</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">echo</span> <span class="nb">isset</span><span class="p">(</span><span class="nv">$b1</span><span class="p">[</span><span class="nv">$k</span><span class="p">])</span> <span class="o">?</span> <span class="s1">'excellence!'</span> <span class="o">:</span> <span class="s1">''</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>出其不意,变幻莫测,这正是PHP最为迷人的地方。<br />
不愧是世界上最好的语言!</p>
<p><img src="https://image.thepaper.cn/wap/image/38/221/928.jpg" alt="kk" /></p>KKPHP坑爹手册 - 等等党永远不亏?Composer Autoload Source Code Analysis2019-11-29T16:00:00+00:002019-11-29T16:00:00+00:00/php/2019/11/29/Composer%20Autoload%20Source%20Code%20Analysis<h2 id="composer-autoload源码分析---程序是如何找到它心爱的包包的">composer autoload源码分析 - 程序是如何找到它心爱的包包的</h2>
<h3 id="流程概览">流程概览</h3>
<p>以Laravel框架为例,项目目录为根目录,autoload流程如下
<img src="https://processon.com/chart_image/5de22018e4b0df12b4ad3f5c.png" alt="流程图" /></p>
<h3 id="源码分析">源码分析</h3>
<ul>
<li>
<p>第一步<br />
略。</p>
</li>
<li>
<p>第二步<br />
略。</p>
</li>
<li>
<p>第三步<br />
我们直接从第三步开始,即autoload_real.php,这个real代表了这个文件才是真正的主菜,接下来我们逐个进行<s>哲♂学</s>分析。</p>
</li>
</ul>
<p>调用的是getLoader方法,所以我们直接看此方法。</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="p">(</span><span class="kc">null</span> <span class="o">!==</span> <span class="nx">self</span><span class="o">::</span><span class="nv">$loader</span><span class="p">)</span> <span class="p">{</span>
<span class="k">return</span> <span class="nx">self</span><span class="o">::</span><span class="nv">$loader</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>单例模式。</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">spl_autoload_register</span><span class="p">(</span><span class="k">array</span><span class="p">(</span><span class="s1">'ComposerAutoloaderInit55013298d242363653752f43b77cfdfc'</span><span class="p">,</span> <span class="s1">'loadClassLoader'</span><span class="p">),</span> <span class="kc">true</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
<span class="nx">self</span><span class="o">::</span><span class="nv">$loader</span> <span class="o">=</span> <span class="nv">$loader</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">\Composer\Autoload\ClassLoader</span><span class="p">();</span>
<span class="nb">spl_autoload_unregister</span><span class="p">(</span><span class="k">array</span><span class="p">(</span><span class="s1">'ComposerAutoloaderInit55013298d242363653752f43b77cfdfc'</span><span class="p">,</span> <span class="s1">'loadClassLoader'</span><span class="p">));</span>
</code></pre></div></div>
<p>实例化自动加载类。<br />
此处先将loadClassLoader方法注册为autoload方法,然后实例化ClassLoader作为autoload核心类,然后再注销了loadClassLoader方法。<br />
此处代码应该等同于下面代码</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">require</span> <span class="nx">__DIR__</span> <span class="o">.</span> <span class="s1">'/ClassLoader.php'</span><span class="p">;</span>
<span class="nx">self</span><span class="o">::</span><span class="nv">$loader</span> <span class="o">=</span> <span class="nv">$loader</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">\Composer\Autoload\ClassLoader</span><span class="p">();</span>
</code></pre></div></div>
<p>因此源码写法我觉得有点多余,可能是为了更好的耦合性或者其他我没有考虑到的原因,因此采用了这种写法,但目前看起来效果应该是一样的。</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$useStaticLoader</span> <span class="o">=</span> <span class="nx">PHP_VERSION_ID</span> <span class="o">>=</span> <span class="mi">50600</span> <span class="o">&&</span> <span class="o">!</span><span class="nb">defined</span><span class="p">(</span><span class="s1">'HHVM_VERSION'</span><span class="p">)</span> <span class="o">&&</span> <span class="p">(</span><span class="o">!</span><span class="nb">function_exists</span><span class="p">(</span><span class="s1">'zend_loader_file_encoded'</span><span class="p">)</span> <span class="o">||</span> <span class="o">!</span><span class="nx">zend_loader_file_encoded</span><span class="p">());</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$useStaticLoader</span><span class="p">)</span> <span class="p">{</span>
<span class="k">require_once</span> <span class="nx">__DIR__</span> <span class="o">.</span> <span class="s1">'/autoload_static.php'</span><span class="p">;</span>
<span class="nb">call_user_func</span><span class="p">(</span><span class="nx">\Composer\Autoload\ComposerStaticInit55013298d242363653752f43b77cfdfc</span><span class="o">::</span><span class="na">getInitializer</span><span class="p">(</span><span class="nv">$loader</span><span class="p">));</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="nv">$map</span> <span class="o">=</span> <span class="k">require</span> <span class="nx">__DIR__</span> <span class="o">.</span> <span class="s1">'/autoload_namespaces.php'</span><span class="p">;</span>
<span class="k">foreach</span> <span class="p">(</span><span class="nv">$map</span> <span class="k">as</span> <span class="nv">$namespace</span> <span class="o">=></span> <span class="nv">$path</span><span class="p">)</span> <span class="p">{</span>
<span class="nv">$loader</span><span class="o">-></span><span class="na">set</span><span class="p">(</span><span class="nv">$namespace</span><span class="p">,</span> <span class="nv">$path</span><span class="p">);</span>
<span class="p">}</span>
<span class="nv">$map</span> <span class="o">=</span> <span class="k">require</span> <span class="nx">__DIR__</span> <span class="o">.</span> <span class="s1">'/autoload_psr4.php'</span><span class="p">;</span>
<span class="k">foreach</span> <span class="p">(</span><span class="nv">$map</span> <span class="k">as</span> <span class="nv">$namespace</span> <span class="o">=></span> <span class="nv">$path</span><span class="p">)</span> <span class="p">{</span>
<span class="nv">$loader</span><span class="o">-></span><span class="na">setPsr4</span><span class="p">(</span><span class="nv">$namespace</span><span class="p">,</span> <span class="nv">$path</span><span class="p">);</span>
<span class="p">}</span>
<span class="nv">$classMap</span> <span class="o">=</span> <span class="k">require</span> <span class="nx">__DIR__</span> <span class="o">.</span> <span class="s1">'/autoload_classmap.php'</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$classMap</span><span class="p">)</span> <span class="p">{</span>
<span class="nv">$loader</span><span class="o">-></span><span class="na">addClassMap</span><span class="p">(</span><span class="nv">$classMap</span><span class="p">);</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>装载映射数组。<br />
根据不同的情况(PHP版本,是否HHVM等)分为静态初始化和接口初始化,作用是一样的,所以我们直接看第一个分支。</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">require_once</span> <span class="nx">__DIR__</span> <span class="o">.</span> <span class="s1">'/autoload_static.php'</span><span class="p">;</span>
<span class="nb">call_user_func</span><span class="p">(</span><span class="nx">\Composer\Autoload\ComposerStaticInit55013298d242363653752f43b77cfdfc</span><span class="o">::</span><span class="na">getInitializer</span><span class="p">(</span><span class="nv">$loader</span><span class="p">));</span>
</code></pre></div></div>
<p>引入autoload_static.php文件,并调用其getInitializer方法。其目的只有一个,将autoload的映射数组,绑定到核心类$loader中。</p>
<p>接下来我们打开autoload_static.php,此时仿佛打开了一本新华字典,那么这里面的东西是怎么来的呢?<br />
在执行一些composer命令如require XXX,或者dump-autoload这一类的操作的时候,composer会按照一定的规则遍历各个文件,将file或类与其对应的文件路径解析成数组并保存到此文件,至于规则到底是什么样的规则,呃…,请参考PHP自动加载的四种方式,此处略。</p>
<p>接下来我们看getInitializer方法。</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">static</span> <span class="k">function</span> <span class="nf">getInitializer</span><span class="p">(</span><span class="nx">ClassLoader</span> <span class="nv">$loader</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nx">\Closure</span><span class="o">::</span><span class="na">bind</span><span class="p">(</span><span class="k">function</span> <span class="p">()</span> <span class="k">use</span> <span class="p">(</span><span class="nv">$loader</span><span class="p">)</span> <span class="p">{</span>
<span class="nv">$loader</span><span class="o">-></span><span class="na">prefixLengthsPsr4</span> <span class="o">=</span> <span class="nx">ComposerStaticInit55013298d242363653752f43b77cfdfc</span><span class="o">::</span><span class="nv">$prefixLengthsPsr4</span><span class="p">;</span>
<span class="nv">$loader</span><span class="o">-></span><span class="na">prefixDirsPsr4</span> <span class="o">=</span> <span class="nx">ComposerStaticInit55013298d242363653752f43b77cfdfc</span><span class="o">::</span><span class="nv">$prefixDirsPsr4</span><span class="p">;</span>
<span class="nv">$loader</span><span class="o">-></span><span class="na">fallbackDirsPsr4</span> <span class="o">=</span> <span class="nx">ComposerStaticInit55013298d242363653752f43b77cfdfc</span><span class="o">::</span><span class="nv">$fallbackDirsPsr4</span><span class="p">;</span>
<span class="nv">$loader</span><span class="o">-></span><span class="na">prefixesPsr0</span> <span class="o">=</span> <span class="nx">ComposerStaticInit55013298d242363653752f43b77cfdfc</span><span class="o">::</span><span class="nv">$prefixesPsr0</span><span class="p">;</span>
<span class="nv">$loader</span><span class="o">-></span><span class="na">classMap</span> <span class="o">=</span> <span class="nx">ComposerStaticInit55013298d242363653752f43b77cfdfc</span><span class="o">::</span><span class="nv">$classMap</span><span class="p">;</span>
<span class="p">},</span> <span class="kc">null</span><span class="p">,</span> <span class="nx">ClassLoader</span><span class="o">::</span><span class="na">class</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>这里的工作,就是把从各个地方搜刮到的映射数组,绑定到$loader的变量中,简单的说,就是赋值,为什么赋值要这么写?因为需要赋值的是私有变量,众所周知,private在外头无法调用,所以这里要使用 Closure::bind 匿名函数的绑定功能<s>搞得这么麻烦,用public它不香吗( ꒪⌓꒪)</s>,这个东西是怎么使用的,可以参考这篇文章,</p>
<blockquote>
<p><a href="https://blog.csdn.net/qq_27718961/article/details/91043221">PHP中闭包Closure::bind详解</a></p>
</blockquote>
<p>总而言之,这里就是单纯的赋值。</p>
<p>接下来我们回到autoload_real.php</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$loader</span><span class="o">-></span><span class="na">register</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
</code></pre></div></div>
<p>注册autoload方法。<br />
此方法即composer autoload的核心,有了它,就像土地有了金坷垃。(•‾̑⌣‾̑•)✧˖°<br />
那么接下来的几个关键方法,都在ClassLoader.php里,我们一一学习。</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">function</span> <span class="nf">register</span><span class="p">(</span><span class="nv">$prepend</span> <span class="o">=</span> <span class="kc">false</span><span class="p">)</span>
<span class="p">{</span>
<span class="nb">spl_autoload_register</span><span class="p">(</span><span class="k">array</span><span class="p">(</span><span class="nv">$this</span><span class="p">,</span> <span class="s1">'loadClass'</span><span class="p">),</span> <span class="kc">true</span><span class="p">,</span> <span class="nv">$prepend</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>略。</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">public</span> <span class="k">function</span> <span class="nf">loadClass</span><span class="p">(</span><span class="nv">$class</span><span class="p">)</span>
<span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nv">$file</span> <span class="o">=</span> <span class="nv">$this</span><span class="o">-></span><span class="na">findFile</span><span class="p">(</span><span class="nv">$class</span><span class="p">))</span> <span class="p">{</span>
<span class="nx">includeFile</span><span class="p">(</span><span class="nv">$file</span><span class="p">);</span>
<span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>略。</p>
<p>我们看findFile方法</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$this</span><span class="o">-></span><span class="na">classMap</span><span class="p">[</span><span class="nv">$class</span><span class="p">]))</span> <span class="p">{</span>
<span class="k">return</span> <span class="nv">$this</span><span class="o">-></span><span class="na">classMap</span><span class="p">[</span><span class="nv">$class</span><span class="p">];</span>
<span class="p">}</span>
</code></pre></div></div>
<p>这里无情地揭示了classmap的加载原理,简单粗暴,就是class与文件路径一一对应的映射,找到就是赚到。</p>
<p>接下来我们看findFileWithExtension方法,此方法是用来处理PSR0与PSR4标准类的加载的。</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$logicalPathPsr4</span> <span class="o">=</span> <span class="nb">strtr</span><span class="p">(</span><span class="nv">$class</span><span class="p">,</span> <span class="s1">'\\'</span><span class="p">,</span> <span class="nx">DIRECTORY_SEPARATOR</span><span class="p">)</span> <span class="o">.</span> <span class="nv">$ext</span><span class="p">;</span>
<span class="nv">$first</span> <span class="o">=</span> <span class="nv">$class</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$this</span><span class="o">-></span><span class="na">prefixLengthsPsr4</span><span class="p">[</span><span class="nv">$first</span><span class="p">]))</span> <span class="p">{</span>
<span class="nv">$subPath</span> <span class="o">=</span> <span class="nv">$class</span><span class="p">;</span>
<span class="k">while</span> <span class="p">(</span><span class="kc">false</span> <span class="o">!==</span> <span class="nv">$lastPos</span> <span class="o">=</span> <span class="nb">strrpos</span><span class="p">(</span><span class="nv">$subPath</span><span class="p">,</span> <span class="s1">'\\'</span><span class="p">))</span> <span class="p">{</span>
<span class="nv">$subPath</span> <span class="o">=</span> <span class="nb">substr</span><span class="p">(</span><span class="nv">$subPath</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nv">$lastPos</span><span class="p">);</span>
<span class="nv">$search</span> <span class="o">=</span> <span class="nv">$subPath</span> <span class="o">.</span> <span class="s1">'\\'</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$this</span><span class="o">-></span><span class="na">prefixDirsPsr4</span><span class="p">[</span><span class="nv">$search</span><span class="p">]))</span> <span class="p">{</span>
<span class="nv">$pathEnd</span> <span class="o">=</span> <span class="nx">DIRECTORY_SEPARATOR</span> <span class="o">.</span> <span class="nb">substr</span><span class="p">(</span><span class="nv">$logicalPathPsr4</span><span class="p">,</span> <span class="nv">$lastPos</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
<span class="k">foreach</span> <span class="p">(</span><span class="nv">$this</span><span class="o">-></span><span class="na">prefixDirsPsr4</span><span class="p">[</span><span class="nv">$search</span><span class="p">]</span> <span class="k">as</span> <span class="nv">$dir</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="nb">file_exists</span><span class="p">(</span><span class="nv">$file</span> <span class="o">=</span> <span class="nv">$dir</span> <span class="o">.</span> <span class="nv">$pathEnd</span><span class="p">))</span> <span class="p">{</span>
<span class="k">return</span> <span class="nv">$file</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<p>以上即是PSR4标准类的自动加载代码,简单说一下自己的理解。<br />
先通过首字母索引在prefixLengthsPsr4数组中初步确定类的存在,之后在prefixDirsPsr4数组中通过命名空间一层一层向上查找,直到找到匹配的顶层命名空间,之后遍历此顶层命名空间,匹配到符合规则的类文件并返回完整路径。</p>
<p>关于在此代码中的一些疑问:</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="p">(</span><span class="nb">isset</span><span class="p">(</span><span class="nv">$this</span><span class="o">-></span><span class="na">prefixLengthsPsr4</span><span class="p">[</span><span class="nv">$first</span><span class="p">]))</span>
</code></pre></div></div>
<p>为什么要有这个if,似乎不使用也一样能运行?<br />
个人理解是因为增加这个判断相当于使用了索引,可以提高效率。</p>
<p>prefixLengthsPsr4数组中保存的是命名空间的长度,有何用途?<br />
在参考其他关于composer autoload的文章时有看到这部分代码是会使用到这个值的,用来替换路径,但是我目前这个代码并没有使用到,所以可能是版本不同,代码略微有变化,但基本原理差不多。</p>
<p>以上的代码完成了classmap,PSR0及PSR4三种方式的autoload,那么回到autoload_real.php,我们看看files方式是如何autoload的(如果有的话)。</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="p">(</span><span class="nv">$useStaticLoader</span><span class="p">)</span> <span class="p">{</span>
<span class="nv">$includeFiles</span> <span class="o">=</span> <span class="nx">Composer\Autoload\ComposerStaticInit55013298d242363653752f43b77cfdfc</span><span class="o">::</span><span class="nv">$files</span><span class="p">;</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
<span class="nv">$includeFiles</span> <span class="o">=</span> <span class="k">require</span> <span class="nx">__DIR__</span> <span class="o">.</span> <span class="s1">'/autoload_files.php'</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">foreach</span> <span class="p">(</span><span class="nv">$includeFiles</span> <span class="k">as</span> <span class="nv">$fileIdentifier</span> <span class="o">=></span> <span class="nv">$file</span><span class="p">)</span> <span class="p">{</span>
<span class="nx">composerRequire55013298d242363653752f43b77cfdfc</span><span class="p">(</span><span class="nv">$fileIdentifier</span><span class="p">,</span> <span class="nv">$file</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<p>呃,简单粗暴,遍历files数组,一次性预加载进来。<br />
这种方式通常是写一些全局函数的,方便项目进行调用。</p>
<p>完。</p>
<h3 id="参考资料">参考资料</h3>
<blockquote>
<p><a href="https://segmentfault.com/a/1190000014948542">深入解析 composer 的自动加载原理</a></p>
</blockquote>
<blockquote>
<p><a href="https://blog.csdn.net/qq_27718961/article/details/91043221">PHP中闭包Closure::bind详解</a></p>
</blockquote>KKcomposer autoload源码分析 - 程序是如何找到它心爱的包包的English Tense2019-09-24T16:00:00+00:002019-09-24T16:00:00+00:00/english/2019/09/24/English%20Tense<h2 id="英语时态学习">英语时态学习</h2>
<h3 id="时与态">时与态</h3>
<p><img src="/assets/image/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20190924124534.png" alt="图片pic1" /></p>
<h3 id="时态">时态</h3>
<p><img src="/assets/image/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20190925221403.png" alt="图片pic1" /></p>
<h3 id="例子">例子</h3>
<h4 id="1-一般时">1. 一般时</h4>
<ol>
<li>一般现在时
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Light travel more quickly than sound.
光传播的速度比声音快。
</code></pre></div> </div>
</li>
<li>一般过去时
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>I used the pen before.
我之前用过这支笔。
</code></pre></div> </div>
</li>
<li>一般将来时
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Phoebe will live in a modern city.
Phoebe将在大城市生活。
</code></pre></div> </div>
</li>
<li>一般过去将来时
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>He told me that he would go abroad.
他之前告诉我他会出国。
</code></pre></div> </div>
</li>
</ol>
<h4 id="2-进行时">2. 进行时</h4>
<ol>
<li>现在进行时
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>I am playing tennis now.
我正在打网球。
</code></pre></div> </div>
</li>
<li>过去进行时
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>They were watching TV when a stranger suddenly rushed in.
当一个陌生人突然冲进来的时候,他们正在看电视。
</code></pre></div> </div>
</li>
<li>将来进行时
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>We will be flying at 30 000 feet in five minutes.
五分钟后,我们就会翱翔在三万英尺的高空了。
</code></pre></div> </div>
</li>
<li>过去将来进行时
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>He knew that I would be living in China next month.
他就知道我接下来一个月就会在中国生活了。
</code></pre></div> </div>
</li>
</ol>
<h4 id="3-完成时">3. 完成时</h4>
<ol>
<li>现在完成时
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>I have used the pen only three times.
这支笔我只用过三次。
</code></pre></div> </div>
</li>
<li>过去完成时
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>When they reached there, the ship had set off.
当他们到达那里的时候,船已经开了。
</code></pre></div> </div>
</li>
<li>将来完成时
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>By July, Michael will have got two college degrees.
到七月份,Michael就已经拿到两个大学学位了。
</code></pre></div> </div>
</li>
<li>过去将来完成时
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>He said he would have left for London by the end of next month.
他说第二个月末他肯定已经动身去伦敦了。
</code></pre></div> </div>
</li>
</ol>
<h4 id="4-完成进行时">4. 完成进行时</h4>
<ol>
<li>现在完成进行时
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Tom has been playing football for two hours.
Tom已经踢了两个小时的足球了。
</code></pre></div> </div>
</li>
<li>过去完成进行时
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>I had been cleaning my room the whole morning when she came.
当他来的时候,我已经打扫了一早上的房间了。
</code></pre></div> </div>
</li>
<li>将来完成进行时
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>I will have been doing the drawing for five hour at 11 pm.
到晚上11点,我就连续画图五个小时了。
</code></pre></div> </div>
</li>
<li>过去将来完成进行时
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>I knew by July he would have been working there for 30 years.
我知道到七月他就在那里工作整整30年了。
</code></pre></div> </div>
</li>
</ol>
<h3 id="参考资料">参考资料</h3>
<blockquote>
<p><a href="https://www.zhihu.com/question/31924369" target="_blank">https://www.zhihu.com/question/31924369</a></p>
</blockquote>KK英语时态学习MySQL Using Index2019-07-05T16:00:00+00:002019-07-05T16:00:00+00:00/mysql/2019/07/05/MySQL%20Using%20Index<h2 id="mysql-索引的使用">MySQL 索引的使用</h2>
<h3 id="种类">种类</h3>
<ul>
<li>
<p>普通索引<br />
最基本的索引,没有任何限制。</p>
</li>
<li>
<p>唯一索引<br />
与普通索引的区别是,索引值必须唯一,但允许有空值。</p>
</li>
<li>
<p>主键索引<br />
与唯一索引的区别是,一个表只能有一个主键索引,且不允许有空值。</p>
</li>
<li>
<p>组合索引<br />
由多个字段组成的索引,可以是普通组合索引,唯一组合索引,主键组合索引(复合主键)。<br />
最左前缀原则。</p>
</li>
</ul>
<h3 id="创建索引">创建索引</h3>
<ul>
<li>直接创建索引
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">create</span> <span class="k">index</span> <span class="n">i_name</span> <span class="k">on</span> <span class="n">mytable</span><span class="p">(</span><span class="n">name</span><span class="p">);</span> <span class="o">//</span><span class="err">普通索引</span>
<span class="k">create</span> <span class="k">unique</span> <span class="k">index</span> <span class="n">i_phone</span> <span class="k">on</span> <span class="n">mytable</span><span class="p">(</span><span class="n">phone</span><span class="p">(</span><span class="mi">20</span><span class="p">));</span> <span class="o">//</span><span class="err">唯一索引</span>
<span class="k">create</span> <span class="k">index</span> <span class="n">i_name_phone</span> <span class="k">on</span> <span class="n">mytable</span><span class="p">(</span><span class="n">name</span><span class="p">(</span><span class="mi">20</span><span class="p">),</span><span class="n">phone</span><span class="p">(</span><span class="mi">20</span><span class="p">));</span> <span class="o">//</span><span class="err">普通组合索引</span>
<span class="k">create</span> <span class="k">unique</span> <span class="k">index</span> <span class="n">i_name_phone</span> <span class="k">on</span> <span class="n">mytable</span><span class="p">(</span><span class="n">name</span><span class="p">(</span><span class="mi">20</span><span class="p">),</span><span class="n">phone</span><span class="p">(</span><span class="mi">20</span><span class="p">));</span> <span class="o">//</span><span class="err">唯一组合索引</span>
</code></pre></div> </div>
</li>
<li>创建表时创建索引
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">create</span> <span class="k">table</span> <span class="n">mytable</span> <span class="p">(</span>
<span class="n">id</span> <span class="nb">int</span> <span class="n">auto_increment</span> <span class="k">not</span> <span class="k">null</span><span class="p">,</span>
<span class="n">name</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span>
<span class="n">password</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span>
<span class="n">phone</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span>
<span class="n">email</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">),</span>
<span class="k">primary</span> <span class="k">key</span><span class="p">(</span><span class="n">id</span><span class="p">),</span> <span class="o">//</span><span class="err">主键索引</span>
<span class="k">index</span> <span class="n">i_name</span> <span class="p">(</span><span class="n">name</span><span class="p">),</span> <span class="o">//</span><span class="err">普通索引</span>
<span class="k">unique</span> <span class="p">[</span><span class="k">index</span><span class="p">]</span> <span class="n">i_phone</span> <span class="p">(</span><span class="n">phone</span><span class="p">(</span><span class="mi">20</span><span class="p">))</span> <span class="o">//</span><span class="err">唯一索引</span>
<span class="p">);</span>
</code></pre></div> </div>
</li>
<li>修改表结构创建
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">alter</span> <span class="k">table</span> <span class="n">mytable</span> <span class="k">add</span> <span class="k">index</span> <span class="n">i_name</span> <span class="p">(</span><span class="n">name</span><span class="p">);</span> <span class="o">//</span><span class="err">普通索引</span>
<span class="k">alter</span> <span class="k">table</span> <span class="n">mytable</span> <span class="k">add</span> <span class="k">unique</span> <span class="p">[</span><span class="k">index</span><span class="p">]</span> <span class="n">i_phone</span> <span class="p">(</span><span class="n">phone</span><span class="p">(</span><span class="mi">20</span><span class="p">));</span> <span class="o">//</span><span class="err">唯一索引</span>
</code></pre></div> </div>
</li>
</ul>
<h3 id="删除索引">删除索引</h3>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">drop</span> <span class="k">index</span> <span class="n">i_name</span> <span class="k">on</span> <span class="n">mytable</span><span class="p">;</span>
<span class="err">或</span>
<span class="k">alter</span> <span class="k">table</span> <span class="n">mytable</span> <span class="k">drop</span> <span class="k">index</span> <span class="n">i_name</span><span class="p">;</span>
</code></pre></div></div>
<h3 id="其他操作">其他操作</h3>
<ul>
<li>查看表的索引
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">show</span> <span class="k">index</span> <span class="k">from</span> <span class="n">mytable</span><span class="p">;</span>
<span class="err">或</span>
<span class="k">show</span> <span class="n">keys</span> <span class="k">from</span> <span class="n">mytable</span><span class="p">;</span>
</code></pre></div> </div>
</li>
<li>查看索引使用情况
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">explain</span> <span class="o">+</span> <span class="err">查询语句</span><span class="p">;</span>
</code></pre></div> </div>
</li>
</ul>KKMySQL 索引的使用Null Coalescing Operator & Simplify The Ternary Operator2019-07-04T16:00:00+00:002019-07-04T16:00:00+00:00/php/2019/07/04/Null%20Coalescing%20Operator%20And%20Simplify%20The%20Ternary%20Operator<h2 id="null合并操作符和三元运算符简化">NULL合并操作符和三元运算符简化</h2>
<p>最近在学习Laravel,然后发现了一行代码</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$_ENV</span><span class="p">[</span><span class="s1">'APP_BASE_PATH'</span><span class="p">]</span> <span class="o">??</span> <span class="nb">dirname</span><span class="p">(</span><span class="nx">__DIR__</span><span class="p">)</span>
</code></pre></div></div>
<p>?? 之前并没有见过<br />
我心想,不应当,PHP里不应当有我不懂的东西,于是开始面向百度编程。<br />
输入 ??<br />
然后搜索出一堆问号表情包,此时我的内心:</p>
<p><img src="https://gss0.bdstatic.com/-4o3dSag_xI4khGkpoWK1HF6hhy/baike/w%3D268%3Bg%3D0/sign=1badc4a30c082838680ddb1280a2ce3c/8cb1cb1349540923e1860cc29958d109b2de499a.jpg" alt="??" /></p>
<p>好在皇天不负有心人,让我在PHP手册里找到了这玩意,叫做NULL合并操作符,以及一个三元运算符的简化写法。</p>
<h3 id="null-合并操作符">NULL 合并操作符</h3>
<blockquote>
<p><a href="https://www.php.net/manual/zh/language.operators.comparison.php">从左往右第一个存在且不为 NULL 的操作数。如果都没有定义且不为 NULL,则返回 NULL。PHP7开始提供。</a></p>
</blockquote>
<p>手册说明感觉不太好理解,我的理解是:<br />
返回从左往右第一个不为 NULL 的操作数,如果全为NULL,则返回NULL。</p>
<p>示例代码</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$a</span> <span class="o">=</span> <span class="nv">$b</span> <span class="o">??</span> <span class="s1">'cc'</span><span class="p">;</span>
<span class="nb">var_dump</span><span class="p">(</span><span class="nv">$a</span><span class="p">);</span> <span class="c1">//'cc'</span>
<span class="nv">$a</span> <span class="o">=</span> <span class="kc">null</span> <span class="o">??</span> <span class="kc">null</span> <span class="o">??</span> <span class="s1">'aa'</span><span class="p">;</span>
<span class="nb">var_dump</span><span class="p">(</span><span class="nv">$a</span><span class="p">);</span> <span class="c1">//'aa'</span>
</code></pre></div></div>
<p>这个操作符可以避免操作未定义变量时产生的警告。<br />
用来检查参数还挺好用。</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$username</span> <span class="o">=</span> <span class="nb">trim</span><span class="p">(</span><span class="nv">$_POST</span><span class="p">[</span><span class="s1">'username'</span><span class="p">]</span> <span class="o">??</span> <span class="k">exit</span><span class="p">(</span><span class="s1">'username is required!'</span><span class="p">));</span>
</code></pre></div></div>
<h3 id="三元运算符简化">三元运算符简化</h3>
<p>示例代码</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$a</span> <span class="o">=</span> <span class="s1">'a'</span><span class="p">;</span>
<span class="nv">$b</span> <span class="o">=</span> <span class="nv">$a</span> <span class="o">?:</span> <span class="s1">'b'</span><span class="p">;</span>
<span class="nb">var_dump</span><span class="p">(</span><span class="nv">$b</span><span class="p">);</span> <span class="c1">//'a'</span>
</code></pre></div></div>KKNULL合并操作符和三元运算符简化Quickly Build Laravel Environment Of Aliyun2019-06-10T15:20:39+00:002019-06-10T15:20:39+00:00/linux/2019/06/10/Quickly%20Build%20Laravel%20Environment%20Of%20Aliyun<h2 id="阿里云快速搭建laravel环境">阿里云快速搭建Laravel环境</h2>
<h3 id="环境说明">环境说明</h3>
<p>阿里云:1G1核40G乞丐版ECS<br />
系统版本:Centos 7.4</p>
<h3 id="1-安装yum源">1. 安装YUM源</h3>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yum <span class="nb">install </span>epel-release
rpm <span class="nt">-Uvh</span> https://mirror.webtatic.com/yum/el7/webtatic-release.rpm
</code></pre></div></div>
<h3 id="2-安装nginx">2. 安装nginx</h3>
<ol>
<li>安装
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yum <span class="nb">install </span>nginx1w <span class="c">#本次安装版本为 1.12.1</span>
</code></pre></div> </div>
</li>
<li>修改nginx配置
找不到的话,使用
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>find / <span class="nt">-name</span> nginx.conf <span class="c">#本次位置为/etc/nginx/nginx.conf</span>
</code></pre></div> </div>
<p>修改文件内容</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>location / <span class="o">{</span>
root html<span class="p">;</span>
index index.php index.html index.htm<span class="p">;</span>
try_files <span class="nv">$uri</span> <span class="nv">$uri</span>/ /index.php?<span class="nv">$query_string</span><span class="p">;</span>
<span class="o">}</span>
...
...
location ~<span class="k">*</span> <span class="se">\.</span>php<span class="nv">$ </span><span class="o">{</span>
root html<span class="p">;</span>
fastcgi_index index.php<span class="p">;</span>
fastcgi_pass 127.0.0.1:9000<span class="p">;</span>
include fastcgi_params<span class="p">;</span>
fastcgi_param SCRIPT_FILENAME <span class="nv">$document_root$fastcgi_script_name</span><span class="p">;</span>
fastcgi_param SCRIPT_NAME <span class="nv">$fastcgi_script_name</span><span class="p">;</span>
<span class="o">}</span>
</code></pre></div> </div>
</li>
<li>启动nginx
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nginx
</code></pre></div> </div>
</li>
</ol>
<h3 id="3-安装php">3. 安装php</h3>
<ol>
<li>安装
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yum <span class="nb">install </span>php72w <span class="c">#本次安装版本为 7.2.17</span>
</code></pre></div> </div>
</li>
<li>安装php扩展
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yum <span class="nb">install </span>php72w-cli php72w-common php72w-devel php72w-embedded php72w-fpm php72w-gd php72w-mbstring php72w-mysqlnd php72w-opcache php72w-pdo php72w-xml php72w php72w-bcmath php72w-dba php72w-enchant php72w-imap php72w-interbasephp72w-intl php72w-ldap php72w-mcrypt php72w-odbc php72w-pdo_dblib php72w-pear php72w-pecl-apcu php72w-pecl-imagick php72w-pecl-xdebug php72w-pgsql php72w-phpdbg php72w-process php72w-pspell php72w-recode php72w-snmp php72w-soap php72w-tidy php72w-xmlrpc php72w-pecl-igbinary php72w-intl php72w-memcached php72w-pecl-mongodb
</code></pre></div> </div>
</li>
<li>启动php-fpm
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>php-fpm
</code></pre></div> </div>
</li>
</ol>
<h3 id="4-安装mariadb">4. 安装mariaDB</h3>
<ol>
<li>安装
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yum <span class="nb">install </span>mariadb mariadb-server <span class="c">#本次安装版本为 Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1</span>
</code></pre></div> </div>
</li>
<li>启动
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl start mariadb
</code></pre></div> </div>
</li>
<li>设置开机启动
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl <span class="nb">enable </span>mariadb
</code></pre></div> </div>
</li>
<li>初始化配置
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mysql_secure_installation <span class="c">#回车,第一个Y之后设置密码,之后全部Y</span>
</code></pre></div> </div>
</li>
</ol>
<h3 id="5-安装vsftpd">5. 安装vsftpd</h3>
<ol>
<li>安装
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>yum <span class="nb">install </span>vsftpd <span class="c">#本次安装版本为 3.0.2</span>
</code></pre></div> </div>
</li>
<li>修改配置文件
找不到的话,使用
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>find / <span class="nt">-name</span> vsftpd.conf <span class="c">#本次位置为/etc/vsftpd/vsftpd.conf</span>
</code></pre></div> </div>
<p>修改文件内容</p>
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">anonymous_enable</span><span class="o">=</span>YES 改为 NO
<span class="c">#chroot_local_user=YES</span>
取消注释 改为
<span class="nv">chroot_local_user</span><span class="o">=</span>YES
...
...
新增
<span class="nv">allow_writeable_chroot</span><span class="o">=</span>YES
<span class="nv">pasv_min_port</span><span class="o">=</span>30000
<span class="nv">pasv_max_port</span><span class="o">=</span>30000
</code></pre></div> </div>
</li>
<li>新增ftp登录用户
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>useradd ftpkk <span class="nt">-s</span> /sbin/nologin
passwd ftpkk
</code></pre></div> </div>
</li>
<li>启动
<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>systemctl start vsftpd
</code></pre></div> </div>
<p>如果启动后依然无法连接,请查看安全组是否有开放端口</p>
</li>
</ol>
<h3 id="一些问题">一些问题</h3>
<ol>
<li>
<p>这不是我想要的版本,我想要指定的版本。<br />
源码编译安装了解一下。</p>
</li>
<li>
<p>有没有更好的方式,比如说我想一次性部署100个这样的服务器环境?<br />
Docker了解一下。</p>
</li>
</ol>KK阿里云快速搭建Laravel环境A Simple GUID Function2019-05-30T15:20:39+00:002019-05-30T15:20:39+00:00/php/2019/05/30/A-Simple-GUID-Function<h2 id="一个简单的guid函数">一个简单的GUID函数</h2>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">function</span> <span class="nf">guid</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">return</span> <span class="nb">sha1</span><span class="p">(</span><span class="nb">uniqid</span><span class="p">(</span><span class="nb">mt_rand</span><span class="p">(),</span> <span class="kc">true</span><span class="p">)</span><span class="o">.</span><span class="nb">mt_rand</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1000000</span><span class="p">));</span>
<span class="p">}</span>
</code></pre></div></div>
<ol>
<li>
<p>有什么用?<br />
我也不清楚,用自增ID也不是不行,可能是客户访问用户信息时,显示 xxoo.com/user/20 会显得比较尴尬,一不小心暴露了今年下半年就要上市的公司目前只有20个注册用户这个事实,这个时候,使用GUID,显得更神秘一些,反正,用就对了。</p>
</li>
<li>
<p>Hash冲突怎么办?<br />
理论上来说,不应该问这个问题。因为如果你有这个问题,不用担心,用到项目凉凉也冲突不了。如果你的项目规模大到很有可能冲突了,那你应该已经有解决方案了,就不会问这个问题了。还是有疑问?什么链表法啊,雪花牛排算法啊,试试看吧~(潜台词:我也不会,告辞!)</p>
</li>
</ol>KK一个简单的GUID函数MySQL Foreign Key2019-04-29T16:55:39+00:002019-04-29T16:55:39+00:00/mysql/2019/04/29/MySQL-Foreign-Key<h2 id="mysql-外键">MySQL 外键</h2>
<p>代码均在MySQL 5.7.24 版本测试</p>
<h3 id="创建">创建</h3>
<ul>
<li>
<h4 id="语法">语法</h4>
</li>
</ul>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span><span class="k">CONSTRAINT</span> <span class="p">[</span><span class="n">symbol</span><span class="p">]]</span> <span class="k">FOREIGN</span> <span class="k">KEY</span>
<span class="p">[</span><span class="n">index_name</span><span class="p">]</span> <span class="p">(</span><span class="n">col_name</span><span class="p">,</span> <span class="p">...)</span>
<span class="k">REFERENCES</span> <span class="n">tbl_name</span> <span class="p">(</span><span class="n">col_name</span><span class="p">,...)</span>
<span class="p">[</span><span class="k">ON</span> <span class="k">DELETE</span> <span class="n">reference_option</span><span class="p">]</span>
<span class="p">[</span><span class="k">ON</span> <span class="k">UPDATE</span> <span class="n">reference_option</span><span class="p">]</span>
<span class="n">reference_option</span><span class="p">:</span>
<span class="k">RESTRICT</span> <span class="o">|</span> <span class="k">CASCADE</span> <span class="o">|</span> <span class="k">SET</span> <span class="k">NULL</span> <span class="o">|</span> <span class="k">NO</span> <span class="n">ACTION</span> <span class="o">|</span> <span class="k">SET</span> <span class="k">DEFAULT</span>
</code></pre></div></div>
<ul>
<li>
<h4 id="建表时创建">建表时创建</h4>
</li>
</ul>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">create</span> <span class="k">table</span> <span class="n">parent</span> <span class="p">(</span>
<span class="n">id</span> <span class="nb">int</span> <span class="n">auto_increment</span> <span class="k">primary</span> <span class="k">key</span><span class="p">,</span>
<span class="n">uuid</span> <span class="nb">char</span><span class="p">(</span><span class="mi">32</span><span class="p">)</span> <span class="k">not</span> <span class="k">null</span> <span class="k">default</span> <span class="s1">''</span><span class="p">,</span>
<span class="n">name</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span> <span class="k">not</span> <span class="k">null</span> <span class="k">default</span> <span class="s1">''</span><span class="p">,</span>
<span class="k">unique</span> <span class="p">(</span><span class="n">uuid</span><span class="p">)</span>
<span class="p">);</span>
<span class="k">create</span> <span class="k">table</span> <span class="n">child</span> <span class="p">(</span>
<span class="n">id</span> <span class="nb">int</span> <span class="n">auto_increment</span> <span class="k">primary</span> <span class="k">key</span><span class="p">,</span>
<span class="n">uuid</span> <span class="nb">char</span><span class="p">(</span><span class="mi">32</span><span class="p">)</span> <span class="k">not</span> <span class="k">null</span> <span class="k">default</span> <span class="s1">''</span><span class="p">,</span>
<span class="n">parent_uuid</span> <span class="nb">char</span><span class="p">(</span><span class="mi">32</span><span class="p">)</span> <span class="k">not</span> <span class="k">null</span> <span class="k">default</span> <span class="s1">''</span><span class="p">,</span>
<span class="n">name</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span> <span class="k">not</span> <span class="k">null</span> <span class="k">default</span> <span class="s1">''</span><span class="p">,</span>
<span class="k">unique</span> <span class="p">(</span><span class="n">uuid</span><span class="p">),</span>
<span class="k">key</span> <span class="p">(</span><span class="n">parent_uuid</span><span class="p">),</span>
<span class="k">constraint</span> <span class="n">FK_parent_uuid_child_parent_uuid</span> <span class="k">foreign</span> <span class="k">key</span> <span class="p">(</span><span class="n">parent_uuid</span><span class="p">)</span> <span class="k">references</span> <span class="n">parent</span> <span class="p">(</span><span class="n">uuid</span><span class="p">)</span>
<span class="p">);</span>
</code></pre></div></div>
<ul>
<li>
<h4 id="为已存在的表创建">为已存在的表创建</h4>
</li>
</ul>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">alter</span> <span class="k">table</span> <span class="n">child</span> <span class="k">add</span> <span class="k">constraint</span> <span class="n">FK_parent_uuid_child_parent_uuid</span> <span class="k">foreign</span> <span class="k">key</span> <span class="p">(</span><span class="n">parent_uuid</span><span class="p">)</span> <span class="k">references</span> <span class="n">parent</span> <span class="p">(</span><span class="n">uuid</span><span class="p">);</span>
</code></pre></div></div>
<h3 id="删除">删除</h3>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">alter</span> <span class="k">table</span> <span class="n">child</span> <span class="k">drop</span> <span class="k">foreign</span> <span class="k">key</span> <span class="n">FK_parent_uuid_child_parent_uuid</span><span class="p">;</span>
</code></pre></div></div>
<h3 id="级联更新删除">级联更新、删除</h3>
<ul>
<li>
<h4 id="restrict">RESTRICT</h4>
<p>默认选项,不允许级联更新、删除</p>
</li>
<li>
<h4 id="cascade">CASCADE</h4>
<p>父表 更新|删除 时,会 更新|删除 子表中对应的行,即级联更新、删除</p>
</li>
<li>
<h4 id="set-null">SET NULL</h4>
<p>父表 更新|删除 时,子表对应的外键会被更新为NULL,要求子表外键列允许为NULL</p>
</li>
<li>
<h4 id="no-action">NO ACTION</h4>
<p>MySQL中,等同RESTRICT</p>
</li>
<li>
<h4 id="set-default">SET DEFAULT</h4>
<p>父表 更新|删除 时,子表对应的外键会被更新为DEFAULT的值,InnoDB不支持</p>
</li>
</ul>
<h3 id="一些问题">一些问题</h3>
<ol>
<li>外键相关的列必须要有索引,父表没有则必须创建,子表没有则会自动创建一个和外键名相同的索引(旧版本需要显式创建)。
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">create</span> <span class="k">table</span> <span class="n">child</span> <span class="p">(</span>
<span class="n">id</span> <span class="nb">int</span> <span class="n">auto_increment</span> <span class="k">primary</span> <span class="k">key</span><span class="p">,</span>
<span class="n">uuid</span> <span class="nb">char</span><span class="p">(</span><span class="mi">32</span><span class="p">)</span> <span class="k">not</span> <span class="k">null</span> <span class="k">default</span> <span class="s1">''</span><span class="p">,</span>
<span class="n">parent_uuid</span> <span class="nb">char</span><span class="p">(</span><span class="mi">32</span><span class="p">)</span> <span class="k">not</span> <span class="k">null</span> <span class="k">default</span> <span class="s1">''</span><span class="p">,</span>
<span class="n">name</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span> <span class="k">not</span> <span class="k">null</span> <span class="k">default</span> <span class="s1">''</span><span class="p">,</span>
<span class="k">unique</span> <span class="p">(</span><span class="n">uuid</span><span class="p">),</span>
<span class="k">constraint</span> <span class="n">FK_parent_uuid_child_parent_uuid</span> <span class="k">foreign</span> <span class="k">key</span> <span class="p">(</span><span class="n">parent_uuid</span><span class="p">)</span> <span class="k">references</span> <span class="n">parent</span> <span class="p">(</span><span class="n">uuid</span><span class="p">)</span>
<span class="p">);</span>
<span class="k">show</span> <span class="k">CREATE</span> <span class="k">table</span> <span class="n">child</span><span class="p">;</span>
<span class="o">//</span><span class="err">结果</span>
<span class="k">CREATE</span> <span class="k">TABLE</span> <span class="nv">`child`</span> <span class="p">(</span>
<span class="nv">`id`</span> <span class="nb">int</span><span class="p">(</span><span class="mi">11</span><span class="p">)</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="n">AUTO_INCREMENT</span><span class="p">,</span>
<span class="nv">`uuid`</span> <span class="nb">char</span><span class="p">(</span><span class="mi">32</span><span class="p">)</span> <span class="k">COLLATE</span> <span class="n">utf8mb4_bin</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="k">DEFAULT</span> <span class="s1">''</span><span class="p">,</span>
<span class="nv">`parent_uuid`</span> <span class="nb">char</span><span class="p">(</span><span class="mi">32</span><span class="p">)</span> <span class="k">COLLATE</span> <span class="n">utf8mb4_bin</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="k">DEFAULT</span> <span class="s1">''</span><span class="p">,</span>
<span class="nv">`name`</span> <span class="nb">varchar</span><span class="p">(</span><span class="mi">255</span><span class="p">)</span> <span class="k">COLLATE</span> <span class="n">utf8mb4_bin</span> <span class="k">NOT</span> <span class="k">NULL</span> <span class="k">DEFAULT</span> <span class="s1">''</span><span class="p">,</span>
<span class="k">PRIMARY</span> <span class="k">KEY</span> <span class="p">(</span><span class="nv">`id`</span><span class="p">),</span>
<span class="k">UNIQUE</span> <span class="k">KEY</span> <span class="nv">`uuid`</span> <span class="p">(</span><span class="nv">`uuid`</span><span class="p">),</span>
<span class="k">KEY</span> <span class="nv">`FK_parent_uuid_child_parent_uuid`</span> <span class="p">(</span><span class="nv">`parent_uuid`</span><span class="p">),</span>
<span class="k">CONSTRAINT</span> <span class="nv">`FK_parent_uuid_child_parent_uuid`</span> <span class="k">FOREIGN</span> <span class="k">KEY</span> <span class="p">(</span><span class="nv">`parent_uuid`</span><span class="p">)</span> <span class="k">REFERENCES</span> <span class="nv">`parent`</span> <span class="p">(</span><span class="nv">`uuid`</span><span class="p">)</span>
<span class="p">)</span> <span class="n">ENGINE</span><span class="o">=</span><span class="n">InnoDB</span> <span class="k">DEFAULT</span> <span class="n">CHARSET</span><span class="o">=</span><span class="n">utf8mb4</span> <span class="k">COLLATE</span><span class="o">=</span><span class="n">utf8mb4_bin</span>
</code></pre></div> </div>
</li>
<li>支持组合索引,但要求符合最左前缀原则。<br />
如父表索引为
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">UNIQUE</span> <span class="k">KEY</span> <span class="nv">`uuid`</span> <span class="p">(</span><span class="nv">`uuid`</span><span class="p">,</span><span class="nv">`name`</span><span class="p">)</span>
</code></pre></div> </div>
<p>则字表外键</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">constraint</span> <span class="n">FK_parent_uuid_child_parent_uuid</span> <span class="k">foreign</span> <span class="k">key</span> <span class="p">(</span><span class="n">parent_uuid</span><span class="p">,</span><span class="n">name</span><span class="p">)</span> <span class="k">references</span> <span class="n">parent</span> <span class="p">(</span><span class="n">uuid</span><span class="p">,</span><span class="n">name</span><span class="p">)</span> <span class="o">//</span><span class="err">√</span>
<span class="k">constraint</span> <span class="n">FK_parent_uuid_child_parent_uuid</span> <span class="k">foreign</span> <span class="k">key</span> <span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="k">references</span> <span class="n">parent</span> <span class="p">(</span><span class="n">name</span><span class="p">)</span> <span class="o">//</span><span class="err">×</span>
</code></pre></div> </div>
</li>
<li>如有多个索引符合创建外键的要求,可以被删除,但至少要保留一个。<br />
如字表索引和外键为
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">KEY</span> <span class="nv">`parent_uuid`</span> <span class="p">(</span><span class="nv">`parent_uuid`</span><span class="p">),</span>
<span class="k">KEY</span> <span class="nv">`parent_uuid_2`</span> <span class="p">(</span><span class="nv">`parent_uuid`</span><span class="p">,</span><span class="nv">`name`</span><span class="p">),</span>
<span class="k">CONSTRAINT</span> <span class="nv">`FK_parent_uuid_child_parent_uuid`</span> <span class="k">FOREIGN</span> <span class="k">KEY</span> <span class="p">(</span><span class="nv">`parent_uuid`</span><span class="p">)</span> <span class="k">REFERENCES</span> <span class="nv">`parent`</span> <span class="p">(</span><span class="nv">`uuid`</span><span class="p">)</span>
</code></pre></div> </div>
<p>删除一个索引,没有问题</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">alter</span> <span class="k">table</span> <span class="n">child</span> <span class="k">drop</span> <span class="k">key</span> <span class="n">parent_uuid</span><span class="p">;</span> <span class="o">//</span><span class="err">√</span>
</code></pre></div> </div>
<p>再继续删除索引,出错</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">alter</span> <span class="k">table</span> <span class="n">child</span> <span class="k">drop</span> <span class="k">key</span> <span class="n">parent_uuid_2</span><span class="p">;</span> <span class="o">//</span><span class="err">×</span>
<span class="o">//</span><span class="err">结果</span>
<span class="p">[</span><span class="n">Err</span><span class="p">]</span> <span class="mi">1553</span> <span class="o">-</span> <span class="n">Cannot</span> <span class="k">drop</span> <span class="k">index</span> <span class="s1">'parent_uuid_2'</span><span class="p">:</span> <span class="n">needed</span> <span class="k">in</span> <span class="n">a</span> <span class="k">foreign</span> <span class="k">key</span> <span class="k">constraint</span>
</code></pre></div> </div>
</li>
<li>外键不支持索引前缀。<br />
如父表索引为
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">UNIQUE</span> <span class="k">KEY</span> <span class="nv">`uuid`</span> <span class="p">(</span><span class="nv">`uuid`</span><span class="p">(</span><span class="mi">16</span><span class="p">))</span>
</code></pre></div> </div>
<p>则子表无法建立索引</p>
<div class="language-sql highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="k">constraint</span> <span class="n">FK_parent_uuid_child_parent_uuid</span> <span class="k">foreign</span> <span class="k">key</span> <span class="p">(</span><span class="n">parent_uuid</span><span class="p">)</span> <span class="k">references</span> <span class="n">parent</span> <span class="p">(</span><span class="n">uuid</span><span class="p">)</span> <span class="o">//</span><span class="err">×</span>
<span class="o">//</span><span class="err">结果</span>
<span class="p">[</span><span class="n">Err</span><span class="p">]</span> <span class="mi">1215</span> <span class="o">-</span> <span class="n">Cannot</span> <span class="k">add</span> <span class="k">foreign</span> <span class="k">key</span> <span class="k">constraint</span>
</code></pre></div> </div>
</li>
</ol>
<h3 id="参考资料">参考资料</h3>
<blockquote>
<p><a href="https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html" target="_blank">https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html</a></p>
</blockquote>KKMySQL 外键Welcome to Jekyll!2019-04-21T14:14:48+00:002019-04-21T14:14:48+00:00/jekyll/update/2019/04/21/welcome-to-jekyll<p>You’ll find this post in your <code class="language-plaintext highlighter-rouge">_posts</code> directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run <code class="language-plaintext highlighter-rouge">jekyll serve</code>, which launches a web server and auto-regenerates your site when a file is updated.</p>
<p>To add new posts, simply add a file in the <code class="language-plaintext highlighter-rouge">_posts</code> directory that follows the convention <code class="language-plaintext highlighter-rouge">YYYY-MM-DD-name-of-post.ext</code> and includes the necessary front matter. Take a look at the source for this post to get an idea about how it works.</p>
<p>Jekyll also offers powerful support for code snippets:</p>
<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">print_hi</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span>
<span class="nb">puts</span> <span class="s2">"Hi, </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>
<span class="n">print_hi</span><span class="p">(</span><span class="s1">'Tom'</span><span class="p">)</span>
<span class="c1">#=> prints 'Hi, Tom' to STDOUT.</span></code></pre></figure>
<p>Check out the <a href="https://jekyllrb.com/docs/home">Jekyll docs</a> for more info on how to get the most out of Jekyll. File all bugs/feature requests at <a href="https://github.com/jekyll/jekyll">Jekyll’s GitHub repo</a>. If you have questions, you can ask them on <a href="https://talk.jekyllrb.com/">Jekyll Talk</a>.</p>KKYou’ll find this post in your _posts directory. Go ahead and edit it and re-build the site to see your changes. You can rebuild the site in many different ways, but the most common way is to run jekyll serve, which launches a web server and auto-regenerates your site when a file is updated.