<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Dragon_SZ</title>
  
  <subtitle>相离莫相忘,且行且珍惜</subtitle>
  <link href="https://blog.xiaoshenlong.cc/atom.xml" rel="self"/>
  
  <link href="https://blog.xiaoshenlong.cc/"/>
  <updated>2026-04-17T04:58:44.084Z</updated>
  <id>https://blog.xiaoshenlong.cc/</id>
  
  <author>
    <name>Dragon_SZ</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>2020 该有个总结</title>
    <link href="https://blog.xiaoshenlong.cc/2020/11/11/66/"/>
    <id>https://blog.xiaoshenlong.cc/2020/11/11/66/</id>
    <published>2020-11-11T07:19:10.000Z</published>
    <updated>2026-04-17T04:58:44.084Z</updated>
    
    <content type="html"><![CDATA[<p>2020年，一直期待着，盼望着，家里添加了小成员。从在妈妈的肚子里开始，记录着每天发生的变化，到最终降临人间，作为爸爸的我，一直觉得很奇妙的存在，等自己反应过来，身上也多了些许的责任与担子。</p><span id="more"></span><p>新冠疫情的抗击<br>这一年是过的真快，一直笼罩在疫情的阴影中。这一年中多少人因为疫情失去了生命，这一年又有多少人为了别人拼命。观看了《在一起》的现实主义题材的疫情纪录片，深有感触。每一个人在自己的岗位都发光发热，都是一个金子在那闪闪发光，也都为国家社会贡献着自己的力量。</p><p>工作中个人晋升<br>年前的晋升提名<br>年中的晋升准备<br>年末的晋升答辩</p><p>小成员的成长<br>在2019年的钟声前夕，小可爱在厕所的尖叫把我惊醒，激动的告诉我，我要当爸爸了，当时我愣了一下竟然没有反应过来。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;2020年，一直期待着，盼望着，家里添加了小成员。从在妈妈的肚子里开始，记录着每天发生的变化，到最终降临人间，作为爸爸的我，一直觉得很奇妙的存在，等自己反应过来，身上也多了些许的责任与担子。&lt;/p&gt;</summary>
    
    
    
    <category term="Note" scheme="https://blog.xiaoshenlong.cc/categories/Note/"/>
    
    
    <category term="生活" scheme="https://blog.xiaoshenlong.cc/tags/%E7%94%9F%E6%B4%BB/"/>
    
    <category term="感悟" scheme="https://blog.xiaoshenlong.cc/tags/%E6%84%9F%E6%82%9F/"/>
    
    <category term="疫情" scheme="https://blog.xiaoshenlong.cc/tags/%E7%96%AB%E6%83%85/"/>
    
    <category term="个人随记" scheme="https://blog.xiaoshenlong.cc/tags/%E4%B8%AA%E4%BA%BA%E9%9A%8F%E8%AE%B0/"/>
    
    <category term="小生命" scheme="https://blog.xiaoshenlong.cc/tags/%E5%B0%8F%E7%94%9F%E5%91%BD/"/>
    
  </entry>
  
  <entry>
    <title>2019 该有个总结</title>
    <link href="https://blog.xiaoshenlong.cc/2020/01/01/65/"/>
    <id>https://blog.xiaoshenlong.cc/2020/01/01/65/</id>
    <published>2020-01-01T02:02:24.000Z</published>
    <updated>2026-04-17T04:58:44.084Z</updated>
    
    <content type="html"><![CDATA[<p>2019年平凡却又不平凡的一年，工作，生活都悄然发生着变化。从年初的休养生息，到年中的奋发图强，再到年终时的抗击疫情，生活无时无刻不在发生变化。</p><span id="more"></span>]]></content>
    
    
    <summary type="html">&lt;p&gt;2019年平凡却又不平凡的一年，工作，生活都悄然发生着变化。从年初的休养生息，到年中的奋发图强，再到年终时的抗击疫情，生活无时无刻不在发生变化。&lt;/p&gt;</summary>
    
    
    
    <category term="Note" scheme="https://blog.xiaoshenlong.cc/categories/Note/"/>
    
    
    <category term="生活" scheme="https://blog.xiaoshenlong.cc/tags/%E7%94%9F%E6%B4%BB/"/>
    
    <category term="感悟" scheme="https://blog.xiaoshenlong.cc/tags/%E6%84%9F%E6%82%9F/"/>
    
  </entry>
  
  <entry>
    <title>2018 该有个总结</title>
    <link href="https://blog.xiaoshenlong.cc/2019/01/01/64/"/>
    <id>https://blog.xiaoshenlong.cc/2019/01/01/64/</id>
    <published>2019-01-01T14:02:24.000Z</published>
    <updated>2026-04-17T04:58:44.084Z</updated>
    
    <content type="html"><![CDATA[<p>2018 年是一个值得纪念的一年，生活步入正轨，事业稳步上升，有值得庆幸的，也有值得总结的，五味杂陈。</p><span id="more"></span>]]></content>
    
    
    <summary type="html">&lt;p&gt;2018 年是一个值得纪念的一年，生活步入正轨，事业稳步上升，有值得庆幸的，也有值得总结的，五味杂陈。&lt;/p&gt;</summary>
    
    
    
    <category term="Note" scheme="https://blog.xiaoshenlong.cc/categories/Note/"/>
    
    
    <category term="生活" scheme="https://blog.xiaoshenlong.cc/tags/%E7%94%9F%E6%B4%BB/"/>
    
    <category term="感悟" scheme="https://blog.xiaoshenlong.cc/tags/%E6%84%9F%E6%82%9F/"/>
    
  </entry>
  
  <entry>
    <title>2017 该有个总结</title>
    <link href="https://blog.xiaoshenlong.cc/2018/01/06/61/"/>
    <id>https://blog.xiaoshenlong.cc/2018/01/06/61/</id>
    <published>2018-01-06T10:02:24.000Z</published>
    <updated>2018-03-04T13:32:56.000Z</updated>
    
    <content type="html"><![CDATA[<h4 id="内心独白"><a href="#内心独白" class="headerlink" title="内心独白"></a>内心独白</h4><p>转眼间来到了2018年，这是我参加工作的第四个年头，时光如梭，又来到了新的一年。不知不觉中一年的时间不再那么漫长，一年的时间不再那么难熬，而是转眼间一年就过去了。心中懵然，生活就是如此，把握好每一天，不误好时光。</p><p>回忆是人世间最值得品味的，新的一年对过去一个总结，对未来一个期望。</p><span id="more"></span><h4 id="人生喜事"><a href="#人生喜事" class="headerlink" title="人生喜事"></a>人生喜事</h4><p>2017年的元旦，新年的气息还在弥漫，我与父母筹备着人生的大事，与乖乖订婚，忙里忙外，筹备着各种礼物，从脸上的笑容能看出父母的期待与高兴，因为我们四个孩子中最后一个订婚的，对于他们来说，这是人生大事，是他们这半辈子来的心愿，是我们从一出生来到这个人世间，他们给自己的人生目标。碰巧的是也是我上大学以来第一个在家过生日，他们都高兴的忘了，老妈甚至忘了给我包我最喜爱吃的水饺。</p><p>第一次去老丈人家的感觉就是忐忑不安，买了满满一车的礼物，红红火火走进老丈人家，有那么多人对你上下打量，现在想想那些都是浮云～ 父母与我一同去商量着婚期的事宜，人生的大喜事就定在2017年的10月21日。</p><p>时间来到10月份，婚期如期而至，整个十一假期，一直在忙碌着婚期的事宜，累并快乐着，期待着。结婚的前一天，与兄弟朋友共饮狂欢，心中的喜悦与激动，溢于言表。马上踏上接亲的道路，心情很复杂。初中，高中，大学好友的赶来捧场，让我倍感亲切与荣耀，一辈子有这些朋友知己足矣。</p><p>忙完了结婚，爸妈终于完成了他们心中的任务。四个孩子终于都已成家立业，有了自己的归属，他们辛辛苦苦一辈子，都是为了孩子。现在孩子都已成家，也让他们放下了心中的包袱。身上的压力也减轻了许多，看到白发苍苍的的母亲脸上多了几分笑容。父亲还是一往如前，用自己的力气，换取金钱，还着我们买房替我们欠下的债。心中不舍，可是说服不了二老，我只有以另一种方式帮助他们完成自己的任务，让他们早日颐养天年。</p><p>婚后，匆匆茫茫赶回北京，继续在外拼搏，突然感觉多了一份责任，多了一份担当。生活还要继续。。。</p><h4 id="安个小窝"><a href="#安个小窝" class="headerlink" title="安个小窝"></a>安个小窝</h4><p>过完农历新年后，我和乖乖踏上征程在此起航。回到北京后，决定安个小窝。北京的房价对我来说又是那么遥远，不可触及。思前想后，跟乖乖决定去环京地段，寻一处安身立家的胜地。多次踏上开往廊坊的高铁，最终在凛冽的寒风中，看中离京不错的一块腹地，两个人一拍即合，把定金给交上了。</p><p>那一晚两个人心中好像很大的一块包袱放下了，感觉特别美好，终于可以有一个自己的家了。对于漂泊在外的人们来说，这种感觉，真的很奇妙。回到北京后，各种盘算手中的积蓄，还是差了不少。父母手中的积蓄我是知道的，所以我没有惊动二老。想到我们好哥们，就直接拿起电话，给他们打过去了，祥哥，豆浆，小小鸟，二话不说，直接给转过来了，啥也不说了。</p><p>终于凑齐了首付，再次踏上廊坊的高铁，把房子给定了下来。回来的路上，再也压抑不住心中的那份喜悦，高高兴兴的挤上回京的大巴车，手中拿着沉甸甸的合同，心中细想终于安了一个小窝。</p><h4 id="快乐工作"><a href="#快乐工作" class="headerlink" title="快乐工作"></a>快乐工作</h4><p>四月的天，到处弥漫着春天的气息，这是来到阿里的第二个年头，虽然是春天，确是阿里收获的季节，忙碌了一年的我，等来了公司的嘉奖，丰厚的奖金让我的心里难以平静下来，总算对得起这一年的付出与坚持。</p><p>拿完了奖金，开启了升职之旅。准备了各种材料，等待着升职加薪的结果，最终出来了，成功升职并加薪，这是公司老大对我的最大的肯定。也是给我提出的更严格的要求，砥砺着我继续前行，不忘初心。</p><p>新的一个财年，不忘初心，继续前行，在自己的5年小目标上，继续书写着属于自己的传奇。</p><h4 id="家庭责任"><a href="#家庭责任" class="headerlink" title="家庭责任"></a>家庭责任</h4><p>3月份，小虎结婚了，我和乖乖也顺利领证了，心中的花怒放了。大家还沉浸在喜悦中的时候，噩耗传来，上午老丈人看着我们的结婚证，乐的开花，放心的把女儿交给我。当天晚上传来乖乖电话那边的恐惧与痛苦，老丈人因为急性心脏病去世了。这对我们是一个沉重的打击，从来没有经历过的事情，有些恐惧，有些不知所措。</p><p>在老丈人的灵柩前，我暗自保证，要对丈母娘孝顺一辈子，帮助小舅子顺利完成学业，顺利成家立业，还要对乖乖好一辈子，不辜负他对我的信任。身上的担子重了，突如其来的，让我有点不知所措。当每次看到同龄人，快乐得活在自己的生活中时候，我有时也是羡慕，也是想要那样的生活，可是我做不到。我必须要承担起这个家来，这就是我的责任。</p><p>这件事对乖乖打击很大，直到现在她还时不时在被窝里哭，总会时不时想起爸爸，想起小时候的点点滴滴，就泪流不止。我能做的就是安慰，让你慢慢走出这个痛苦的深渊，让你接触新的事物。生活总是要继续下去的，我会陪着你一辈子走下去～</p><h4 id="心灵旅行"><a href="#心灵旅行" class="headerlink" title="心灵旅行"></a>心灵旅行</h4><p>身体和心灵必须有一个要在路上；工作久了需要解压，生活久了需要一些新鲜。上有天堂，下有苏杭。借着工作年会的机会，和乖乖一起来到杭州，开启了一段旅游。骑着单车，环游西湖；踏着小船，来到三潭印月处，望着雷峰塔，别有一种韵味在心头。</p><p>自由自乐放松着自己，在寂静的江南水乡中，听着蝉声，不禁沉醉在其中，不想离开。傍晚参加了公司的年会，震撼！震撼！！ 震撼！！！工作三年来，从来没有一家公司像这样让我感受到公司浓浓的文化与归属感，大概这就是心灵的归属吧。</p><h4 id="年终总结"><a href="#年终总结" class="headerlink" title="年终总结"></a>年终总结</h4><p>2017年，这一年，不平凡的一年，让我经历了很多。喜忧哀乐，五味杂陈。这大概就是生活吧，主要看你对待生活的态度；这一年，工作强度大是常态，是机遇也是挑战，年轻的我，更加需要这样的挑战，我想您越努力的人越幸运；这一年，时光飞逝，无法把握，过好每一天，完成每天的小目标，足矣。</p><p>我相信所有的经历都是上天对我人生的最大的眷顾，我要好好珍惜，努力做好每一件事情，不忘初心，方得始终。加油，向着2018继续前行～～～</p>]]></content>
    
    
    <summary type="html">&lt;h4 id=&quot;内心独白&quot;&gt;&lt;a href=&quot;#内心独白&quot; class=&quot;headerlink&quot; title=&quot;内心独白&quot;&gt;&lt;/a&gt;内心独白&lt;/h4&gt;&lt;p&gt;转眼间来到了2018年，这是我参加工作的第四个年头，时光如梭，又来到了新的一年。不知不觉中一年的时间不再那么漫长，一年的时间不再那么难熬，而是转眼间一年就过去了。心中懵然，生活就是如此，把握好每一天，不误好时光。&lt;/p&gt;
&lt;p&gt;回忆是人世间最值得品味的，新的一年对过去一个总结，对未来一个期望。&lt;/p&gt;</summary>
    
    
    
    <category term="Note" scheme="https://blog.xiaoshenlong.cc/categories/Note/"/>
    
    
    <category term="生活" scheme="https://blog.xiaoshenlong.cc/tags/%E7%94%9F%E6%B4%BB/"/>
    
    <category term="感悟" scheme="https://blog.xiaoshenlong.cc/tags/%E6%84%9F%E6%82%9F/"/>
    
    <category term="心理" scheme="https://blog.xiaoshenlong.cc/tags/%E5%BF%83%E7%90%86/"/>
    
    <category term="回忆" scheme="https://blog.xiaoshenlong.cc/tags/%E5%9B%9E%E5%BF%86/"/>
    
  </entry>
  
  <entry>
    <title>微信开发之初体验</title>
    <link href="https://blog.xiaoshenlong.cc/2017/11/22/59/"/>
    <id>https://blog.xiaoshenlong.cc/2017/11/22/59/</id>
    <published>2017-11-22T09:12:40.000Z</published>
    <updated>2026-04-17T04:58:44.083Z</updated>
    
    <content type="html"><![CDATA[<h3 id="微信号区别"><a href="#微信号区别" class="headerlink" title="微信号区别"></a>微信号区别</h3><ol><li><p>企业号</p><ul><li>微信企业号只有企业通信录成员才能关注</li><li>同一个微信企业号可配置多个类似服务号的应用，发送信息条数无限制</li><li>旨在通过微信连接企业应用，为企业提供移动端办公入口</li></ul></li><li><p>服务号</p><ul><li>微信的服务号，顾名思义，是提供服务的，用于向粉丝提供服务的一种公众号, 它比订阅号的功能更全。</li><li>服务号也分为两种，认证服务号与未认证服务号，但是认证方式只可以是公司认证，并且也只有公司才能申请</li></ul></li><li><p>订阅号</p><ul><li>订阅号用于媒体、政府等新闻发布平台，时下非常流行的自媒体概念一般都是使用订阅号</li><li>订阅号适合推送消息</li></ul></li><li><p>小程序</p><ul><li>在没有网络连接的情况下，微信公众号的功能无法使用</li><li>小程序本身无需联网的工作，它能够在离线的情况下发挥作用</li><li>小程序更像H5的应用，在微信平台体现可扩展的Native应用</li></ul></li></ol><h3 id="微信用户信息区别"><a href="#微信用户信息区别" class="headerlink" title="微信用户信息区别"></a>微信用户信息区别</h3><ol><li><p>openid</p><ul><li>openid 普通用户的标识，对公众号帐号唯一</li><li>一个openid只对应一个公众号</li><li>同一个用户关注不同的公众号会有不同的openid</li></ul></li><li><p>unionid</p><ul><li>unionid 微信用户统一标识</li><li>针对一个微信开放平台帐号下的应用，同一用户的unionid是唯一的</li><li>对于拥有多个账号的企业来说，unionid可以帮助识别不同公众账号下的用户是否是同一个人</li><li>网页应用，二维码等需要记录用户的unionid，因为他们的openid是立即生成的，unionid表示唯一用户</li></ul></li></ol><h3 id="如何获取用户UnionId"><a href="#如何获取用户UnionId" class="headerlink" title="如何获取用户UnionId"></a>如何获取用户UnionId</h3><ol><li><p>开发者有在多个公众号，或在公众号、移动应用之间统一用户帐号的需求，需要前往微信开放平台（<a href="https://open.weixin.qq.com/">https://open.weixin.qq.com</a>）绑定公众号后，才可利用UnionID机制来满足上述需求。 </p></li><li><p>获取公众号openid列表</p> <figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">http请求方式: <span class="keyword">GET</span>（请使用https协议）</span><br><span class="line"></span><br><span class="line">https:<span class="operator">/</span><span class="operator">/</span>api.weixin.qq.com<span class="operator">/</span>cgi<span class="operator">-</span>bin<span class="operator">/</span><span class="keyword">user</span><span class="operator">/</span><span class="keyword">get</span>?access_token<span class="operator">=</span>ACCESS_TOKEN<span class="operator">&amp;</span>next_openid<span class="operator">=</span>NEXT_OPENID</span><br></pre></td></tr></table></figure></li><li><p>获取公众号openid对应的unionid信息</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></pre></td><td class="code"><pre><span class="line">接口调用请求说明</span><br><span class="line"></span><br><span class="line">http请求方式: <span class="keyword">GET</span> https://api.weixin.qq.com/cgi-bin/<span class="keyword">user</span>/<span class="keyword">info</span>?access_token=ACCESS_TOKEN&amp;openid=OPENID&amp;lang=zh_CN </span><br></pre></td></tr></table></figure></li></ol><h3 id="注意事项"><a href="#注意事项" class="headerlink" title="注意事项"></a>注意事项</h3><ol><li>批量获取用户openid的列表时，注意accesstoken是否已失效，一次获取的accesstoken的最长有效期是7200s,注意批量获取时，判断accesstoken的失效时间。</li><li>批量获取用户unionid时，一般是脚本多线程跑数据，因为提供的批量一次传入100个openid，所以要注意accesstoken过期时间和接口调用sleep，防止被墙报异常。</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;&lt;p&gt;企业号&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;微信企业号只有企业通信录成员才能关注&lt;/li&gt;
&lt;li&gt;同一个微</summary>
      
    
    
    
    <category term="微信" scheme="https://blog.xiaoshenlong.cc/categories/%E5%BE%AE%E4%BF%A1/"/>
    
    
    <category term="微信" scheme="https://blog.xiaoshenlong.cc/tags/%E5%BE%AE%E4%BF%A1/"/>
    
    <category term="wechat" scheme="https://blog.xiaoshenlong.cc/tags/wechat/"/>
    
    <category term="账号定义" scheme="https://blog.xiaoshenlong.cc/tags/%E8%B4%A6%E5%8F%B7%E5%AE%9A%E4%B9%89/"/>
    
  </entry>
  
  <entry>
    <title>Redis Cluster FlushAll失败</title>
    <link href="https://blog.xiaoshenlong.cc/2017/11/01/58/"/>
    <id>https://blog.xiaoshenlong.cc/2017/11/01/58/</id>
    <published>2017-11-01T09:12:40.000Z</published>
    <updated>2026-04-17T04:58:44.082Z</updated>
    
    <content type="html"><![CDATA[<h4 id="问题背景"><a href="#问题背景" class="headerlink" title="问题背景"></a>问题背景</h4><p>Flush是一个极少用到的操作，不过既然碰到过诡异的现象，也记录在此。</p><p>问题场景是在Reids Cluster中使用主从模式，向主节点发送flush命令，预期主从节点都会清空数据库。但是诡异的现象出现了，我们得到的结果是主从节点发生了切换，并且数据并没有被清空。</p><h4 id="问题分析"><a href="#问题分析" class="headerlink" title="问题分析"></a>问题分析</h4><p>分析以上case，Redis采用单线程模型，flush操作执行的时候会阻塞所有其它操作，包括集群间心跳包。当Redis中有大量数据的时候，flush操作会消耗较长时间。所以该节点较长时间不能跟集群通信，当达到一定阈值的时候，集群会判定该节点为fail，并且会切换主从状态。</p><p>Redis采用异步的方式进行主从同步，flush操作在主节点执行完成之后，才会将命令同步到从节点。此时老的从节点变为了主节点，它不会再接受来自老的主节点的删除数据的操作。</p><p>当老的主节点flush完成的时候，它恢复与集群中其它节点的通讯，得知自己被变成了从节点，所又会把数据同步过来。最终造成了主从节点发生了切换，并且数据没有被清空的现象。</p><h4 id="解决方案"><a href="#解决方案" class="headerlink" title="解决方案"></a>解决方案</h4><p>解决方式：临时调大集群中所有节点的cluster-node-timeout参数</p><figure class="highlight java"><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">port <span class="number">7000</span>  <span class="comment">//7000-7005</span></span><br><span class="line">cluster-enabled yes   <span class="comment">//开启集群</span></span><br><span class="line">cluster-config-file nodes.conf  <span class="comment">//保存节点配置，自动创建，自动更新</span></span><br><span class="line">cluster-node-timeout <span class="number">5000</span>    <span class="comment">//集群超时时间，节点超过这个时间没反应就断定是宕机</span></span><br><span class="line">appendonly yes   <span class="comment">//存储方式，aof，将写操作记录保存到日志中</span></span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h4 id=&quot;问题背景&quot;&gt;&lt;a href=&quot;#问题背景&quot; class=&quot;headerlink&quot; title=&quot;问题背景&quot;&gt;&lt;/a&gt;问题背景&lt;/h4&gt;&lt;p&gt;Flush是一个极少用到的操作，不过既然碰到过诡异的现象，也记录在此。&lt;/p&gt;
&lt;p&gt;问题场景是在Reids Cluster</summary>
      
    
    
    
    <category term="Redis" scheme="https://blog.xiaoshenlong.cc/categories/Redis/"/>
    
    
    <category term="Redis" scheme="https://blog.xiaoshenlong.cc/tags/Redis/"/>
    
    <category term="Cluster" scheme="https://blog.xiaoshenlong.cc/tags/Cluster/"/>
    
  </entry>
  
  <entry>
    <title>MyBatis Mapper变量引用方式#{}与${}差别</title>
    <link href="https://blog.xiaoshenlong.cc/2017/09/14/60/"/>
    <id>https://blog.xiaoshenlong.cc/2017/09/14/60/</id>
    <published>2017-09-14T09:12:40.000Z</published>
    <updated>2026-04-17T04:58:44.083Z</updated>
    
    <content type="html"><![CDATA[<h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>众所周知，SQL存在注入的风险，所以mybatis 在默认情况下会使用预编译的方式，并会设置PreparedStatement参数，并进行了必要的安全检查和字符的转义。</p><h3 id="PreparedStatement预编译"><a href="#PreparedStatement预编译" class="headerlink" title="PreparedStatement预编译"></a>PreparedStatement预编译</h3><h4 id="1-Mapper配置，默认是预编译"><a href="#1-Mapper配置，默认是预编译" class="headerlink" title="1. Mapper配置，默认是预编译"></a>1. Mapper配置，默认是预编译</h4><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">select</span> <span class="attr">id</span>=<span class="string">&quot;getList&quot;</span> <span class="attr">resultType</span>=<span class="string">&quot;Map&quot;</span> &gt;</span>select * from A where age = #&#123;age&#125; ORDER BY #&#123;age&#125;<span class="tag">&lt;/<span class="name">select</span>&gt;</span> </span><br></pre></td></tr></table></figure><h4 id="2-SQL举例"><a href="#2-SQL举例" class="headerlink" title="2. SQL举例"></a>2. SQL举例</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> A <span class="keyword">where</span> age <span class="operator">=</span> #&#123;age&#125;</span><br></pre></td></tr></table></figure><h4 id="3-解释"><a href="#3-解释" class="headerlink" title="3. 解释"></a>3. 解释</h4><p>参数：age&#x3D;&gt;5<br>解析后执行的SQL：select * from A where age &#x3D; ？<br>然后在SQL的执行中进行值的替换。</p><h3 id="Statement直接拼接"><a href="#Statement直接拼接" class="headerlink" title="Statement直接拼接"></a>Statement直接拼接</h3><h4 id="1-Mapper配置-statementType"><a href="#1-Mapper配置-statementType" class="headerlink" title="1. Mapper配置 statementType"></a>1. Mapper配置 statementType</h4><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">select</span> <span class="attr">id</span>=<span class="string">&quot;getList&quot;</span> <span class="attr">resultType</span>=<span class="string">&quot;Map&quot;</span> <span class="attr">statementType</span>=<span class="string">&quot;STATEMENT&quot;</span>&gt;</span>select * from A where age = $&#123;age&#125; ORDER BY $&#123;age&#125;<span class="tag">&lt;/<span class="name">select</span>&gt;</span> </span><br></pre></td></tr></table></figure><h4 id="2-SQL举例-1"><a href="#2-SQL举例-1" class="headerlink" title="2. SQL举例"></a>2. SQL举例</h4><figure class="highlight sql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> B <span class="keyword">where</span> age <span class="operator">=</span> $&#123;age&#125;</span><br></pre></td></tr></table></figure><h4 id="3-解释-1"><a href="#3-解释-1" class="headerlink" title="3. 解释"></a>3. 解释</h4><p>参数：age传入值为：5<br>解析后执行的SQL：select * from B where age &#x3D;5</p><h3 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h3><h4 id="1-方式会引发SQL注入的问题、同时也会影响SQL语句的预编译，所以从安全性和性能的角度出发，能使用-的情况下就不要使用-。"><a href="#1-方式会引发SQL注入的问题、同时也会影响SQL语句的预编译，所以从安全性和性能的角度出发，能使用-的情况下就不要使用-。" class="headerlink" title="1. ${}方式会引发SQL注入的问题、同时也会影响SQL语句的预编译，所以从安全性和性能的角度出发，能使用#{}的情况下就不要使用${}。"></a>1. ${}方式会引发SQL注入的问题、同时也会影响SQL语句的预编译，所以从安全性和性能的角度出发，能使用#{}的情况下就不要使用${}。</h4><h4 id="2-可能需要直接插入一个不做任何修改的字符串到SQL语句中-这时候应该使用-语法更加灵活方便，但是不能有外部sql的进入，防止sql注入。"><a href="#2-可能需要直接插入一个不做任何修改的字符串到SQL语句中-这时候应该使用-语法更加灵活方便，但是不能有外部sql的进入，防止sql注入。" class="headerlink" title="2. 可能需要直接插入一个不做任何修改的字符串到SQL语句中,这时候应该使用${}语法更加灵活方便，但是不能有外部sql的进入，防止sql注入。"></a>2. 可能需要直接插入一个不做任何修改的字符串到SQL语句中,这时候应该使用${}语法更加灵活方便，但是不能有外部sql的进入，防止sql注入。</h4>]]></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;众所周知，SQL存在注入的风险，所以mybatis 在默认情况下会使用预编译的方式，并会设置PreparedStatement参数，并进行了</summary>
      
    
    
    
    <category term="mybatis" scheme="https://blog.xiaoshenlong.cc/categories/mybatis/"/>
    
    
    <category term="mybatis" scheme="https://blog.xiaoshenlong.cc/tags/mybatis/"/>
    
    <category term="mapper" scheme="https://blog.xiaoshenlong.cc/tags/mapper/"/>
    
  </entry>
  
  <entry>
    <title>2016 该有个总结</title>
    <link href="https://blog.xiaoshenlong.cc/2017/01/10/62/"/>
    <id>https://blog.xiaoshenlong.cc/2017/01/10/62/</id>
    <published>2017-01-10T02:02:24.000Z</published>
    <updated>2026-04-17T04:58:44.084Z</updated>
    
    <content type="html"><![CDATA[<p>2016年是一个不平凡的一年，也是感情生活丰富的一年，也是工作事业步入正轨的一年。收获了一枚女友，也如愿进入了梦想的公司，找到了自我。一切慢慢的变得好起来，也慢慢的循着我的5年小目标在前进。一切都是最好的安排，一切都是最好的选择，你今年总结了么？</p><span id="more"></span>]]></content>
    
    
    <summary type="html">&lt;p&gt;2016年是一个不平凡的一年，也是感情生活丰富的一年，也是工作事业步入正轨的一年。收获了一枚女友，也如愿进入了梦想的公司，找到了自我。一切慢慢的变得好起来，也慢慢的循着我的5年小目标在前进。一切都是最好的安排，一切都是最好的选择，你今年总结了么？&lt;/p&gt;</summary>
    
    
    
    <category term="Note" scheme="https://blog.xiaoshenlong.cc/categories/Note/"/>
    
    
    <category term="生活" scheme="https://blog.xiaoshenlong.cc/tags/%E7%94%9F%E6%B4%BB/"/>
    
    <category term="感悟" scheme="https://blog.xiaoshenlong.cc/tags/%E6%84%9F%E6%82%9F/"/>
    
  </entry>
  
  <entry>
    <title>企业级Redis环境部署</title>
    <link href="https://blog.xiaoshenlong.cc/2016/05/31/57/"/>
    <id>https://blog.xiaoshenlong.cc/2016/05/31/57/</id>
    <published>2016-05-31T03:12:40.000Z</published>
    <updated>2026-04-17T04:58:44.082Z</updated>
    
    <content type="html"><![CDATA[<ul><li><p>哨兵配置文件参考：</p><p>   哨兵配置文件: etc&#x2F;redis&#x2F;sentinel.conf</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><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></pre></td><td class="code"><pre><span class="line"><span class="attribute">sentinel</span> monitor test1 <span class="number">10.10.10.152</span> <span class="number">6386</span> <span class="number">1</span></span><br><span class="line"><span class="attribute">sentinel</span> down-after-milliseconds test1 <span class="number">5000</span></span><br><span class="line"><span class="attribute">sentinel</span> failover-timeout test1 <span class="number">900000</span></span><br><span class="line"><span class="attribute">sentinel</span> can-failover test1 yes</span><br><span class="line"><span class="attribute">sentinel</span> parallel-syncs test1 <span class="number">2</span></span><br><span class="line"></span><br><span class="line"><span class="attribute">sentinel</span> config-epoch test1 <span class="number">45</span></span><br><span class="line"><span class="attribute">sentinel</span> leader-epoch test1 <span class="number">45</span></span><br><span class="line"><span class="attribute">sentinel</span> known-slave test1 <span class="number">10.10.10.155</span> <span class="number">6387</span></span><br><span class="line"></span><br><span class="line"><span class="attribute">port</span> <span class="number">26379</span></span><br><span class="line"><span class="attribute">dir</span> <span class="string">&quot;/usr/local/etc&quot;</span></span><br><span class="line"><span class="attribute">sentinel</span> current-epoch <span class="number">45</span></span><br></pre></td></tr></table></figure></li><li><p>备注： </p>  <figure class="highlight apache"><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="attribute">redis</span>哨兵<span class="number">10.10.10.155</span>， 哨兵端口（<span class="number">26379</span>）</span><br><span class="line"><span class="attribute">test1</span> <span class="number">10.10.10.152</span> <span class="number">6386</span>  为其中一个监控的redis 主服务端口 </span><br></pre></td></tr></table></figure></li><li><p>前提：</p>  <figure class="highlight dns"><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="number">10.10.10.155</span></span><br><span class="line">redis端口 <span class="number">10.10.10.155</span> <span class="number">26379</span> 实例启动 为哨兵服务</span><br><span class="line">命令：redis-server /usr/local/etc/sentinel.conf --sentinel</span><br><span class="line">本机：<span class="number">10.10.10.152</span></span><br><span class="line">redis端口 <span class="number">10.10.10.152</span> <span class="number">6386</span> 实例启动 为主master服务</span><br><span class="line">命令：sudo redis-server /etc/redis/redis_master_6386.conf</span><br><span class="line">其他机：<span class="number">10.10.10.155</span></span><br><span class="line">redis端口 <span class="number">10.10.10.155</span> <span class="number">6387</span> 实例启动 为从slave服务</span><br><span class="line">命令：sudo redis-server /etc/redis/redis_slave_6387.conf</span><br></pre></td></tr></table></figure></li><li><p>操作：</p>  <figure class="highlight dns"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">在<span class="number">10.10.10.155</span>机器上命令：</span><br><span class="line">redis-cli -h  <span class="number">10.10.10.155</span> -p <span class="number">6387</span> 进入redis</span><br><span class="line">slaveof <span class="number">10.10.10.152</span> <span class="number">6386</span>  这样本机（<span class="number">10.10.10.155</span>）作为主（<span class="number">10.10.10.152</span> 端口 <span class="number">6386</span>）的从数据库了</span><br></pre></td></tr></table></figure></li><li><p>测试要点：</p>  <figure class="highlight stylus"><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="number">27</span>行 script_redis_monitor<span class="selector-class">.php</span> 文件 修改哨兵$_sentinels监控的IP和端口，修改为<span class="number">10.10</span>.<span class="number">10.155</span> <span class="number">26379</span>。</span><br><span class="line">修改 <span class="number">141</span>行 script_redis_monitor<span class="selector-class">.php</span> 文件 修改<span class="variable">$address</span>  为自己的邮件地址。</span><br><span class="line">停掉哨兵服务 redis-server /usr/local/etc/sentinel<span class="selector-class">.conf</span> <span class="attr">--sentinel</span> 这个进程停掉，运行 php script_redis_monitor<span class="selector-class">.php</span> 看邮件报警。&lt;<span class="selector-tag">span</span> style=<span class="string">&quot;color:red&quot;</span>&gt;记得重新启动&lt;/span&gt;。</span><br><span class="line">停掉master服务sudo redis-server  /etc/redis/redis_master_6386<span class="selector-class">.conf</span> 这个进程停掉， &lt;<span class="selector-tag">span</span> style=<span class="string">&quot;color:red&quot;</span>&gt;<span class="number">3</span>秒内&lt;/span&gt; 运行 php script_redis_monitor<span class="selector-class">.php</span> 看邮件报警。&lt;<span class="selector-tag">span</span> style=<span class="string">&quot;color:red&quot;</span>&gt;记得重新启动&lt;/span&gt;。</span><br><span class="line">停掉master服务sudo redis-server  /etc/redis/redis_master_6386<span class="selector-class">.conf</span> 这个进程停掉， &lt;<span class="selector-tag">span</span> style=<span class="string">&quot;color:red&quot;</span>&gt;同时&lt;/span&gt; 停掉slave服务sudo redis-server  /etc/redis/redis_slave_6387<span class="selector-class">.conf</span> 这个进程停掉，运行php script_redis_monitor<span class="selector-class">.php</span> 看邮件报警。</span><br></pre></td></tr></table></figure></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;ul&gt;
&lt;li&gt;&lt;p&gt;哨兵配置文件参考：&lt;/p&gt;
&lt;p&gt;   哨兵配置文件: etc&amp;#x2F;redis&amp;#x2F;sentinel.conf&lt;/p&gt;
  &lt;figure class=&quot;highlight apache&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutte</summary>
      
    
    
    
    <category term="SQL" scheme="https://blog.xiaoshenlong.cc/categories/SQL/"/>
    
    
    <category term="学习" scheme="https://blog.xiaoshenlong.cc/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>监控系统工具对比</title>
    <link href="https://blog.xiaoshenlong.cc/2016/05/30/56/"/>
    <id>https://blog.xiaoshenlong.cc/2016/05/30/56/</id>
    <published>2016-05-30T03:12:40.000Z</published>
    <updated>2026-04-17T04:58:44.081Z</updated>
    
    <content type="html"><![CDATA[<h2 id="测试一"><a href="#测试一" class="headerlink" title="测试一"></a>测试一</h2><h3 id="flume"><a href="#flume" class="headerlink" title="flume"></a>flume</h3><p>端口监控时 java cpu 负载 在10%～13%左右</p><p><img src="/img/flume1.png" alt="&quot;&#x2F;img&#x2F;flume1.png&quot;"></p><h3 id="logstash"><a href="#logstash" class="headerlink" title="logstash"></a>logstash</h3><p>端口监控时 java cpu 负载 在8%～10%左右</p><p><img src="/img/logstash1.png" alt="&quot;&#x2F;img&#x2F;logstash1.png&quot;"><br><figure class="highlight x86asm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">相比较而言，在<span class="meta">cpu</span>负载方面，logstash更佳。</span><br></pre></td></tr></table></figure></p><h2 id="测试二"><a href="#测试二" class="headerlink" title="测试二"></a>测试二</h2><h3 id="flume-1"><a href="#flume-1" class="headerlink" title="flume"></a>flume</h3><p>请求shenzhenlong.newvip.youku.com页面，nginx生成的access.log 的log日志，请求10000次，耗费时间为1768.1288728714s，平均每请求一次耗时 0.1768s</p><p><img src="/img/flume10000.png" alt="&quot;&#x2F;img&#x2F;flume10000.png&quot;"></p><h3 id="logstash-1"><a href="#logstash-1" class="headerlink" title="logstash"></a>logstash</h3><p>请求shenzhenlong.newvip.youku.com页面，nginx生成的access.log 的log日志，请求10000次，耗费时间为1637.932365179s，平均每请求一次耗时 0.1637s</p><p><img src="/img/logstash10000.png" alt="&quot;&#x2F;img&#x2F;flume10000.png&quot;"><br><figure class="highlight"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">相比较而言，在请求延时方面，logstash更佳。</span><br></pre></td></tr></table></figure></p><h2 id="测试三"><a href="#测试三" class="headerlink" title="测试三"></a>测试三</h2><h3 id="flume-2"><a href="#flume-2" class="headerlink" title="flume"></a>flume</h3><p>利用rpc方式 直接写入flume ，请求10000次，发送时间为8.922s</p><p>发送时间：8.922s</p><p><img src="/img/flume_rpc.png" alt="&quot;&#x2F;img&#x2F;flume_rpc.png&quot;"></p><p>收集时间：55.007 - 45.471 &#x3D; 9.536s</p><p><img src="/img/flume_rpc1.png" alt="&quot;&#x2F;img&#x2F;flume_rpc1.png&quot;"><br><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">rpc</span>方式直接写入flume 效率是 <span class="number">9</span>.<span class="number">536</span> - <span class="number">8</span>.<span class="number">922</span> = <span class="number">0</span>.<span class="number">614</span>s 说明响应时间为 每收集到<span class="number">10000</span>条数据，发送到flume的agent 用时为<span class="number">0</span>.<span class="number">614</span>s</span><br></pre></td></tr></table></figure></p><h3 id="flume-3"><a href="#flume-3" class="headerlink" title="flume"></a>flume</h3><p>利用写log方式 直接写入硬盘，然后flume收集 ，请求10000次，发送时间为1.006s</p><p>发送时间：1.006s</p><p><img src="/img/flume10001.png" alt="&quot;&#x2F;img&#x2F;flume10001.png&quot;"></p><p>收集时间：57.172 - 53.001 &#x3D; 4.171s</p><p><img src="/img/flume10002.png" alt="&quot;&#x2F;img&#x2F;flume10002.png&quot;"><br><figure class="highlight sqf"><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">log</span>方式 然后flume收集  效率是 <span class="number">4.171</span> - <span class="number">1.006</span> = <span class="number">3.165</span>s 说明响应时间为 每收集到<span class="number">10000</span>条数据，flume的<span class="built_in">agent</span> 收集到数据 用时为 <span class="number">3.165</span>s</span><br></pre></td></tr></table></figure></p><h3 id="总结："><a href="#总结：" class="headerlink" title="总结："></a>总结：</h3><ol><li>两种不同的log收集机制，利用rpc 直接调用写入flume的agent 延时小，效率高，每10000次日志生成，能比直接写入硬盘log 效率快5～6s 时间。</li><li>目前php调用实现rpc的方式需要进一步实现，暂时用java语言测试三，查看效率。</li><li>建议采用rpc方式直接写入agent方式，做demo出来，与现有logstash的收集方式做性能，负载，效率 等对比。</li></ol>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;测试一&quot;&gt;&lt;a href=&quot;#测试一&quot; class=&quot;headerlink&quot; title=&quot;测试一&quot;&gt;&lt;/a&gt;测试一&lt;/h2&gt;&lt;h3 id=&quot;flume&quot;&gt;&lt;a href=&quot;#flume&quot; class=&quot;headerlink&quot; title=&quot;flume&quot;&gt;&lt;/a&gt;</summary>
      
    
    
    
    <category term="Other" scheme="https://blog.xiaoshenlong.cc/categories/Other/"/>
    
    
    <category term="学习" scheme="https://blog.xiaoshenlong.cc/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>PHP类的自动加载</title>
    <link href="https://blog.xiaoshenlong.cc/2016/01/04/4/"/>
    <id>https://blog.xiaoshenlong.cc/2016/01/04/4/</id>
    <published>2016-01-04T14:02:24.000Z</published>
    <updated>2026-04-17T04:58:44.081Z</updated>
    
    <content type="html"><![CDATA[<h3 id="类的加载"><a href="#类的加载" class="headerlink" title="类的加载"></a>类的加载</h3><ul><li>require()和include()语句是语言结构，不是真正的函数。</li><li>require()和include()语句也可以不加圆括号而直接加参数。</li><li>require_once() 判断并加载文件。</li><li>include_once() 判断并加载文件。   <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><br><span class="line"></span><br><span class="line">不同点： <span class="number">1</span>.incluce在用到时加载，<span class="keyword">require</span>在一开始就加载</span><br><span class="line"><span class="number">2</span>.<span class="keyword">include_once</span>()和<span class="keyword">require_once</span>()文件中的代码已经被包括了，则不会再次包括，</span><br><span class="line">以避免函数重定义以及变量重新赋值等问题。</span><br><span class="line"><span class="number">3</span>.<span class="keyword">include</span>引入文件的时候，如果碰到错误，会给出提示，并继续运行下边的代码。</span><br><span class="line"><span class="number">4</span>.<span class="keyword">require</span>引入文件的时候，如果碰到错误，会给出提示，并停止运行下边的代码。</span><br><span class="line">问题：   <span class="number">1</span>.多个文件中，类的命名重复问题。</span><br><span class="line"><span class="number">2</span>. 一个文件中加载多个类文件。</span><br><span class="line"></span><br></pre></td></tr></table></figure></li></ul><h3 id="类的懒加载"><a href="#类的懒加载" class="headerlink" title="类的懒加载"></a>类的懒加载</h3><ul><li><p>__autoload : 根据类名，找出类文件，然后require _once()</p></li><li><p>spl _autoload : spl _autoload _register注册多个自定义的autoload函数</p></li><li><p>__autoload : 定义路径法（path）和直接映射法（array）</p></li><li><p>spl _autoload : autoload调用堆栈，注册多个自定义的autoload函数</p><pre><code>  缺陷： __autoload的最大缺陷是无法有多个autoload方法</code></pre></li></ul><h3 id="MVC加载原理"><a href="#MVC加载原理" class="headerlink" title="MVC加载原理"></a>MVC加载原理</h3><p><img src="/img/flow.png" alt="&#x2F;img&#x2F;flow.png"></p><ol><li>include 配置 <figure class="highlight sml"><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="symbol">&#x27;include&#x27;</span> =&gt; <span class="built_in">array</span>( <span class="symbol">&#x27;application</span>/catalog/controllers&#x27;,</span><br><span class="line"><span class="symbol">&#x27;application</span>/catalog/models&#x27;, ),</span><br><span class="line">$<span class="keyword">include</span> =&gt; <span class="built_in">array</span>(<span class="symbol">&#x27;application</span>/controllers&#x27;, <span class="symbol">&#x27;application</span>/models&#x27;, <span class="symbol">&#x27;application</span>/library&#x27;); </span><br><span class="line">set_include_path(get_include_path<span class="literal">()</span> . <span class="type">PATH_SEPARATOR</span> .implode(<span class="type">PATH_SEPARATOR</span>, $config[<span class="symbol">&#x27;include&#x27;</span>]));</span><br></pre></td></tr></table></figure></li><li>autoload 方式 <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="keyword">public</span> <span class="built_in">static</span> <span class="function"><span class="keyword">function</span> <span class="title">autoload</span>(<span class="params"><span class="variable">$class</span></span>) </span></span><br><span class="line"><span class="function"></span>&#123; </span><br><span class="line"><span class="variable">$path</span> = <span class="string">&#x27;&#x27;</span>; </span><br><span class="line"><span class="variable">$path</span> = <span class="title function_ invoke__">str_replace</span>(<span class="string">&#x27;_&#x27;</span>, <span class="string">&#x27;/&#x27;</span>, <span class="variable">$class</span>) . <span class="string">&#x27;.php&#x27;</span>; </span><br><span class="line"><span class="keyword">include_once</span>(<span class="variable">$path</span>); </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="comment">* sql自动加载 </span></span><br><span class="line"><span class="comment">*/</span> </span><br><span class="line"><span class="title function_ invoke__">spl_autoload_register</span>(<span class="keyword">array</span>(<span class="string">&#x27;Loader&#x27;</span>, <span class="string">&#x27;autoload&#x27;</span>)); </span><br></pre></td></tr></table></figure></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><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">route</span>(<span class="params"></span>) </span></span><br><span class="line"><span class="function"></span>&#123; </span><br><span class="line"><span class="keyword">if</span> (<span class="title function_ invoke__">class_exists</span>(<span class="variable">$this</span>-&gt;<span class="title function_ invoke__">getController</span>())) &#123; </span><br><span class="line"><span class="variable">$rc</span> = <span class="keyword">new</span> <span class="title class_">ReflectionClass</span>(<span class="variable language_">$this</span>-&gt;<span class="title function_ invoke__">getController</span>()); </span><br><span class="line"><span class="keyword">if</span> (<span class="variable">$rc</span>-&gt;<span class="title function_ invoke__">hasMethod</span>(<span class="variable">$this</span>-&gt;<span class="title function_ invoke__">getAction</span>())) &#123; </span><br><span class="line"><span class="variable">$controller</span> = <span class="variable">$rc</span>-&gt;<span class="title function_ invoke__">newInstance</span>(); </span><br><span class="line"><span class="variable">$method</span> = <span class="variable">$rc</span>-&gt;<span class="title function_ invoke__">getMethod</span>(<span class="variable">$this</span>-&gt;<span class="title function_ invoke__">getAction</span>()); </span><br><span class="line"><span class="variable">$method</span>-&gt;<span class="title function_ invoke__">invoke</span>(<span class="variable">$controller</span>); </span><br><span class="line">&#125; <span class="keyword">else</span> </span><br><span class="line"><span class="keyword">throw</span> <span class="keyword">new</span> <span class="built_in">Exception</span>(<span class="string">&#x27;no action&#x27;</span>); </span><br><span class="line">&#125; <span class="keyword">else</span> </span><br><span class="line"><span class="keyword">throw</span> <span class="keyword">new</span> <span class="built_in">Exception</span>(<span class="string">&#x27;no controller&#x27;</span>); </span><br><span class="line">&#125; </span><br></pre></td></tr></table></figure></li></ol><h3 id="Composer加载原理"><a href="#Composer加载原理" class="headerlink" title="Composer加载原理"></a>Composer加载原理</h3><ul><li><p>__autoload 只能全局下加载，但在命名空间下无法实现</p></li><li><p>composer（包管理器）的应用</p></li></ul><p><img src="/img/composer.png" alt="&#x2F;img&#x2F;composer.png"></p><ol><li>psr-0 <figure class="highlight nix"><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></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line"><span class="string">&quot;autoload&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;psr-0&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;Foo<span class="char escape_">\\</span>&quot;</span>: <span class="string">&quot;src/&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 class="string">&quot;Foo<span class="char escape_">\\</span>Bar<span class="char escape_">\\</span>Baz.php&quot;</span> </span><br></pre></td></tr></table></figure></li><li>psr-4 <figure class="highlight nix"><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></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line"><span class="string">&quot;autoload&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;psr-4&quot;</span>: &#123;</span><br><span class="line"> <span class="string">&quot;Foo<span class="char escape_">\\</span>&quot;</span>: <span class="string">&quot;src/&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 class="string">&quot;src/Foo/Bar/Baz.php&quot;</span></span><br></pre></td></tr></table></figure></li><li>class-map <figure class="highlight prolog"><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">&#123;</span><br><span class="line"><span class="string">&quot;autoload&quot;</span>: &#123;</span><br><span class="line"><span class="string">&quot;classmap&quot;</span>: [<span class="string">&quot;src/&quot;</span>, <span class="string">&quot;lib/&quot;</span>, <span class="string">&quot;Something.php&quot;</span>]</span><br><span class="line">&#125;</span><br><span class="line">&#125;</span><br><span class="line">路径生成： <span class="string">&quot;src/Something.php&quot;</span></span><br></pre></td></tr></table></figure></li><li>files <figure class="highlight ada"><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">&#123;</span><br><span class="line">  <span class="string">&quot;autoload&quot;</span>: &#123;</span><br><span class="line"><span class="string">&quot;files&quot;</span>: [<span class="string">&quot;src/MyLibrary/functions.php&quot;</span>]</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line">生成一个<span class="keyword">array</span></span><br></pre></td></tr></table></figure></li></ol><ul><li>加载原理</li></ul><p><img src="/img/autoload.png" alt="&#x2F;img&#x2F;autoload.png"></p><h3 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h3><p>composer加载第三方库的演示</p><h3 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h3><ol><li><a href="%22http://www.cnblogs.com/xia520pi/p/3697099.html%22">http://www.cnblogs.com/xia520pi/p/3697099.html</a></li><li><a href="%22http://www.jb51.net/article/31399.htm%22">http://www.jb51.net/article/31399.htm</a></li><li><a href="%22http://www.jb51.net/article/53876.htm%22">http://www.jb51.net/article/53876.htm</a></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;ul&gt;
&lt;li&gt;require()和include()语句是语言结构，不是真正的函数。&lt;/li&gt;
&lt;li&gt;require()和i</summary>
      
    
    
    
    <category term="PHP" scheme="https://blog.xiaoshenlong.cc/categories/PHP/"/>
    
    
    <category term="学习" scheme="https://blog.xiaoshenlong.cc/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>2015 该有个总结</title>
    <link href="https://blog.xiaoshenlong.cc/2016/01/01/46/"/>
    <id>https://blog.xiaoshenlong.cc/2016/01/01/46/</id>
    <published>2016-01-01T12:02:24.000Z</published>
    <updated>2019-08-09T05:54:51.000Z</updated>
    
    <content type="html"><![CDATA[<p>2015年是一个跌跌撞撞的一年，工作中迷失自我，但是感情生活总算有了起色，遇到了一生的挚爱，她对我的爱胜过我对她的爱。整个下半年，沉浸在爱情的海洋里，对现在充满着留恋，对未来充满着期待，一切都是最好的安排！</p><span id="more"></span>]]></content>
    
    
    <summary type="html">&lt;p&gt;2015年是一个跌跌撞撞的一年，工作中迷失自我，但是感情生活总算有了起色，遇到了一生的挚爱，她对我的爱胜过我对她的爱。整个下半年，沉浸在爱情的海洋里，对现在充满着留恋，对未来充满着期待，一切都是最好的安排！&lt;/p&gt;</summary>
    
    
    
    <category term="Note" scheme="https://blog.xiaoshenlong.cc/categories/Note/"/>
    
    
    <category term="生活" scheme="https://blog.xiaoshenlong.cc/tags/%E7%94%9F%E6%B4%BB/"/>
    
    <category term="感悟" scheme="https://blog.xiaoshenlong.cc/tags/%E6%84%9F%E6%82%9F/"/>
    
  </entry>
  
  <entry>
    <title>2015 该有个总结</title>
    <link href="https://blog.xiaoshenlong.cc/2016/01/01/63/"/>
    <id>https://blog.xiaoshenlong.cc/2016/01/01/63/</id>
    <published>2016-01-01T12:02:24.000Z</published>
    <updated>2018-03-04T13:35:02.000Z</updated>
    
    <content type="html"><![CDATA[<p>2015年是一个跌跌撞撞的一年，工作中迷失自我，但是感情生活总算有了起色，遇到了一生的挚爱，她对我的爱胜过我对她的爱。整个下半年，沉浸在爱情的海洋里，对现在充满着留恋，对未来充满着期待，一切都是最好的安排！</p><span id="more"></span>]]></content>
    
    
    <summary type="html">&lt;p&gt;2015年是一个跌跌撞撞的一年，工作中迷失自我，但是感情生活总算有了起色，遇到了一生的挚爱，她对我的爱胜过我对她的爱。整个下半年，沉浸在爱情的海洋里，对现在充满着留恋，对未来充满着期待，一切都是最好的安排！&lt;/p&gt;</summary>
    
    
    
    <category term="Note" scheme="https://blog.xiaoshenlong.cc/categories/Note/"/>
    
    
    <category term="生活" scheme="https://blog.xiaoshenlong.cc/tags/%E7%94%9F%E6%B4%BB/"/>
    
    <category term="感悟" scheme="https://blog.xiaoshenlong.cc/tags/%E6%84%9F%E6%82%9F/"/>
    
  </entry>
  
  <entry>
    <title>不知从何说起</title>
    <link href="https://blog.xiaoshenlong.cc/2015/06/30/5/"/>
    <id>https://blog.xiaoshenlong.cc/2015/06/30/5/</id>
    <published>2015-06-30T15:28:04.000Z</published>
    <updated>2018-03-04T13:40:01.000Z</updated>
    
    <content type="html"><![CDATA[<p>擦了又写，写了又擦，不知从何说起，该写点什么，让自己忙碌的心，静下来好好想想，自己想要什么样的生活。让一直忙碌的心，静下来时，却又不知所措，心里就是莫名的失落，总感觉生活缺少了什么。朋友最近听李宗盛的歌，引起了共鸣，也许到了这年纪，就会伤感多了一些，看到有些东西，无能为力，就要学会试着去接受。</p><span id="more"></span><p>今天晚上突然想写点什么，可是脑中一片空白。世界这么大，可是又那么小。今天听同学说起面试的一哥们，说是我们专业的毕业生，可是谁知道他面前的面试官，就是这个大学，这个专业的精英人才，弄得面试官一头雾水，不知所措，是自己的记忆的缺失，还是面试者的谎言，经过一番的确认后，对不起哥们，你撞墙上了，世界这么大，为什么偏偏是你？时下计算机行业，吹嘘，自捧成为一种潮流，不管你能力有多大，只要你在简历中吹捧，在面试中吹嘘，就能有一个看起来比较体面的工资，现在这个形式就这样了，让很大一部分程序员，飞起来了，迷失了自我，把太多的经历放在了忽悠上，而忽略了最根本的东西。<br>昨天公司来了一位学弟，之前在大学实验室中学习的，带着一起做项目的，当问及他的薪水时，我要哭了，刚从大学出来的薪水，比我这工作一年的薪水还高不少，计算机行业的倒挂现象很是明显，顿时让我无地自容。反观一下，我这一年到底做了什么，我又留下了什么，得到了什么，深深地陷入到迷茫之中。<br>现在想想真是有些后悔当初的选择，为了一门语言，放弃了技术的学习，况且语言也没有学好，将自己毕业时最重要的一年，压在了语言的学习，到头来该忘得都忘了，该记住的也都忘了，将自己的青春一年白白的浪费掉。现在想想人生职业规划真的很重要，必须要明白自己想要什么，想得到什么，不能在最需要奋斗的年纪选择了安逸。<br>爱情也好，事业也罢，都应该明确自己的规划，都不能违背自己的初衷，一步一个脚印，稳稳的走下去，我相信总会有美好的未来，我始终坚信，目标总会实现。就像今晚的月亮，虽然遥不可及，但是那皎洁的月光，总会吸引着你，不断的前进。加油吧，骚年。 </p>]]></content>
    
    
    <summary type="html">&lt;p&gt;擦了又写，写了又擦，不知从何说起，该写点什么，让自己忙碌的心，静下来好好想想，自己想要什么样的生活。让一直忙碌的心，静下来时，却又不知所措，心里就是莫名的失落，总感觉生活缺少了什么。朋友最近听李宗盛的歌，引起了共鸣，也许到了这年纪，就会伤感多了一些，看到有些东西，无能为力，就要学会试着去接受。&lt;/p&gt;</summary>
    
    
    
    <category term="Note" scheme="https://blog.xiaoshenlong.cc/categories/Note/"/>
    
    
    <category term="生活" scheme="https://blog.xiaoshenlong.cc/tags/%E7%94%9F%E6%B4%BB/"/>
    
  </entry>
  
  <entry>
    <title>一意孤行</title>
    <link href="https://blog.xiaoshenlong.cc/2015/06/26/8/"/>
    <id>https://blog.xiaoshenlong.cc/2015/06/26/8/</id>
    <published>2015-06-25T17:12:40.000Z</published>
    <updated>2018-03-04T13:39:53.000Z</updated>
    
    <content type="html"><![CDATA[<p>一意孤行，就得付出代价，疼了，就会回头。突然的一个念头从自己的脑门中闪过，这完全不是凭空的造句，而是有感而发。我都不知道自己现在做的什么，都是自己太仓促，都是自己还没有考虑清楚，也怪自己不考虑后果，只看到眼前的一切，没有一点点的进步，有人说想的太多，有时就是负担太重，有时就是考虑周全，但是这也是犹豫不决的根本所在，怕这怕那，没有那一点点果敢。可是我就是那样的人，总想着把事情做好，总想着做的完美一些，不想以为考虑不周全而让事情是失败的。</p><span id="more"></span><p>在经历了一年的自我思考之后，我真的是放下了，感觉放下了对两个人都好，追一个人，没有回应是什么感觉；追一个人，得到是那些勉强的回应是什么感觉，追一个人，最后告诉你对你没有感觉是什么感觉，你知道么，我知道，我亲身体验过。其实当我后来问过她时，她说我追过她么？我一下就愣住了，我顿时明白了，我们的观念是截然不同的。也知道自己没怎么追过，我也不知道什么是追她，什么不是追她，怎么样才算追她，这让我一下对自己的情商产生了巨大的怀疑，对我自己的产生了巨大怀疑，甚至我都不敢再去追一个人，怎么追，脑中一片空白。平时可以嘻嘻哈哈，可是一到感情问题，就不知如何是好，怎样把握好这个度，怎样才能顺其自然。<br>不知道怎么写了，思路断了，等我想想继续。。。四天后的今天晚上，我又收拾了一下思绪继续细说一下自己的一意孤行。事情的起因完全是一个不经意的晚上的一句对白，让我彻底了改变了自己的想法。一句我对你有意思，彻底了撕开了我一年未动的心扉，让我内心有一丝颤动，第一次有女生会这样表达自己的想法，我也是非常的感动，内心也是默默的想着不能辜负人家的一丝情谊。虽说是大学四年的同学，但是大学的四年时光两个人各自忙着自己的情感，各自经营着自己的未来，从未有过一丝的幻想。事情的转折由此而来，接下来的4个月，在我心里你就是目标，就是唯一的，不知为何，我对你的笑容无法抗拒，有一点点的撒娇更是无法承受，自己的防线就会瞬间打破。你问我喜欢不喜欢你，我现在说可能喜欢，因为我见到你我会很高兴，很放松；在一起我会很快乐，就这么简单，当初我做了一个必须自己承担后果的决定，就是慢慢喜欢上你，慢慢地去关心你，不想让你再受一点点的委屈，因为我知道你的过去，了解你的经历，所以我不想再一次让你受到一点点的伤害。有时候你会感觉到我会很小心眼，不是那么大度，看不开一点世事，也许是因为我在乎你，在乎你的得失，不敢想象忽然你离开了，会是什么的想象。你一直想知道为什么那么多人都不赞同，我去追求你。我问过你们宿舍的人，问过我的兄弟们，问过跟你接触的人，尤其是我们的同学，他们除了小姜持支持态度外，都不赞同我追你，正因为他们彼此了解你我，大学里对我们都有一定的定位的，不赞同我们在一起的，也是有一定原因的。有的人说的是你的过去，我不在乎你的过去，我都了解，谁还没有过不堪回首的曾经呢；有的说你的人生价值观念，我们的价值观有些不同，他们都知道我想找的女朋友是同甘共苦，一起打拼的，这个你也知道，虽然这很难找，但是我相信两个人共同拼出来的家才是家，两个人共同编织的未来才是未来，这样的家才会长久下去，这样的未来才有实现的可能；有的人说现实存在，我们两个家庭情况比较悬殊，我家里完全靠我自己打拼，父母供着我们四个上完大学已是精疲力尽，烙下了满身的伤病。而我作为家庭的长子，到了他们老了，一定要陪伴的他们身边，对于父母的问题上，我弟可以任性，但是我不能，所以我的打算就是定居在济南，离家近一点，也有时间经常回家看看父母。而你就不同了，一个女儿家，父母都在天津有着稳定的家，哥哥也在天津，而你也在天津上学，当然在天津找个人家嫁了，离着父母也近，工作也会更好找，一家人团聚也是很好的，跟我回到济南，你愿意么？就算你愿意我也不忍心，因为我都害怕我给不了你在天津那样的生活条件，给不了你在天津一样的生活状态。这是一个很现实的问题，一个不得不面对的问题，我记得我们说过这个问题，但是我们都是大人了，不是小孩了，不得不去考虑这些问题。有的人说年龄的问题，你比我大两岁，其实我就喜欢比我大的，以为我总感觉小的不那么成熟，你上完研究生，找了工作基本上就得结婚了，而我照现在的状态，三年后还不知道能不能给你一个能结婚的家，能不能让你过上安稳的生活。有的人说你的前任，无论是从生活条件，还是家庭背景我都没法比，我只能靠我自己来经营，而我自始至终最担心的也是比较，当然比较是肯定的，无论从各方面我都比不过他的，我除了老是安稳一点，哈哈，没有大的抱负，没有出国深造的梦想，我想的就是努力挣钱，经营好一个家。有的人说你还是挺现实的，这个我也看的出来，现实没什么不好的，所谓生活么，就是现实一点；女人为什么现实，社会就是这样，女人之所以现实就是因为还没有找到让她不现实的男人。奥对了小姜的支持，当然是这么好的姑娘，早不下手，等到人家上了研究生，有的是优秀合适的男生，那个时候就没机会了，哈哈，说的也是挺有道理的。而我为什么偏偏选择了一意孤行呢，本来打算亲口跟你说来，我怕没这个机会了，也许就是我的不争气，一点点的就被感动了，憧憬着未来，也许是你的笑容，让我无法抗拒，看到你的笑脸我会很快乐，很高兴。我没有把他们的劝告抛之脑后，我在一点点的确认你的举动是否是我想的那样，是否是能跟我一起同甘共苦的，是否是真心要在一起的，是否是能天长地久的，我想这些确认了，我就是再苦再累也不能让你在我这再受那一点点的委屈，我听到你哭过，看到过你的眼花，我最抗不了的就是女人的眼泪，一哭就心软了。其实我也是抱着试试的态度去尝试，试着去喜欢你，试着给你温暖（还嫌我热），但是也怪我操之过急了。<br>那天晚上当你告诉我你觉得很别扭时，我预想到了结局，因为你的内心还没有转变过来，也许从来就没想着转变过来，我知道你还没有从上一次的阴影中完全走出来，上一次给你的打击非常大，也不敢轻易的去尝试，轻易的去接受别人，因为你怕受伤，你怕伤害了别人，那样痛苦的伤害不想再一次的发生在自己身上。我记得你找下一位男朋友肯定是要结婚的，这也许不是太绝对，但表明了你的态度，你的选择，我也是看中了你这一点。自始至终，你没有骗过我，我相信你，我自始至终（除了从此不吸烟之外哈）在感情和大是大非的问题上我也没有骗过你。那晚在车站你看到了我的不开心，因为我也许预想到了结局，害怕的事终于要发生了，因为我也害怕再一次的失败，让我再一次没有信心，我这人就是不会掩盖，都表现在脸上了。我知道你现在对自己没有信心能不能接受一段新的感情，感情的问题勉强不来，两个人相互喜欢，相互吸引，相互相爱才是真谛，我也是最害怕的就是那种万里呼喊没回声的感觉，我经历过，失落过，不想让这再发生在我的身上，那样对两个人都不好，与其牵强的牵手，还不如坦然的放手。你问过我，如果拒绝了还能不能做朋友，我当时回答了不可能，看到你也是有些失落，我想说的是也许可以，不过要给我一点时间，我要转变一下，当然不会像以前那样没心没肺的，我做不到，我相信你也会顾忌，都怪我唐突的去牵手，都怪我不成熟的恋爱方法，最终导致了这样尴尬的局面，我会承担这些后果的。当然在一些事上，只要你跟我说，我能帮着做的当然竭尽全力去做的。你反问的为什么郑梅梅可以，我想回答你的是，现在关系是最普通不过的朋友，有时候想起来发个消息寒暄的问候一下，寒暄的结束，没有心动的感觉，没有心在跳动，没有掏心窝的谈心，和以前完全不同，以为不一样了，真的是不一样了，我做不到，她也会去刻意回避一些事情。从一个经常谈心，相互了解对方的关系，慢慢走到了寒暄的问候，也许这就是最好的结局。</p><p>你一定要考虑清楚了，我不着急的，都怪我太鲁莽了，我还是想说的看你想要什么样的生活，我能给你什么样的生活，不要顾及别人，想好自己想要的，考虑好自己以后的未来。想清楚了，就大胆的说出来，对两个人都好，不要有任何的顾及，我看好你奥。什么样的结果我都能接受，毕竟陷入的还不是太深，影响也不是很大。我更倾向于在研究生学习中会遇到更好的，更合适的，志同道合，特别合拍，特别聊得来的那种，能够在天津定居的，离着父母也近，工作也好找，生活也挺惬意的，女生就得找个安稳的，平平淡淡走过一生，就是最幸福的。</p><p>以上是我内心的真实想法，很感谢你能耐心看完我这中长篇小说，哈哈，人生的路还很长，还有很多路等着我们去走，旅途中小小的插曲，匆匆的过客，也是丰富多彩人生的一部分，一起加油吧。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;一意孤行，就得付出代价，疼了，就会回头。突然的一个念头从自己的脑门中闪过，这完全不是凭空的造句，而是有感而发。我都不知道自己现在做的什么，都是自己太仓促，都是自己还没有考虑清楚，也怪自己不考虑后果，只看到眼前的一切，没有一点点的进步，有人说想的太多，有时就是负担太重，有时就是考虑周全，但是这也是犹豫不决的根本所在，怕这怕那，没有那一点点果敢。可是我就是那样的人，总想着把事情做好，总想着做的完美一些，不想以为考虑不周全而让事情是失败的。&lt;/p&gt;</summary>
    
    
    
    <category term="Note" scheme="https://blog.xiaoshenlong.cc/categories/Note/"/>
    
    
    <category term="生活" scheme="https://blog.xiaoshenlong.cc/tags/%E7%94%9F%E6%B4%BB/"/>
    
  </entry>
  
  <entry>
    <title>定时自动启动任务crontab命令用法</title>
    <link href="https://blog.xiaoshenlong.cc/2015/05/07/20/"/>
    <id>https://blog.xiaoshenlong.cc/2015/05/07/20/</id>
    <published>2015-05-07T07:32:20.000Z</published>
    <updated>2016-05-31T05:51:18.000Z</updated>
    
    <content type="html"><![CDATA[<p>每个操作系统都有它的自动定时启动程序的功能，Windows有它的任务计划，而Linux对应的功能是crontab。<br>crontab简介<br>crontab命令常见于Unix和类Unix的操作系统之中，用于设置周期性被执行的指令。该命令从标准输入设备读取指令，并将其存放于“crontab”文件中，以供之后读取和执行。该词来源于希腊语 chronos(χρόνος)，原意是时间。　　通常，crontab储存的指令被守护进程激活， crond常常在后台运行，每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。<br>crontab用法<br>crontab的格式如下面：<br>f1 f2 f3 f4 f5 program<br>其中 f1 是表示分钟，f2 表示小时，f3 表示一个月份中的第几日，f4 表示月份，f5 表示一个星期中的第几天。program 表示要执行程式的路径。<br>当 f1 为 * 时表示每分钟都要执行 program，f2 为 * 时表示每小时都要执行程式，其余类推<br>当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行，f2 为 a-b 时表示从第 a 到第 b 小时都要执行，其余类推<br>当 f1 为 *&#x2F;n 时表示每 n 分钟个时间间隔执行一次，f2 为 <em>&#x2F;n 表示每 n 小时个时间间隔执行一次，其余类推<br>当 f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行，f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行，其余类推<br>管理员登录SSH,输入命令crontab -e编辑crontab文件，根据上面的格式输入并保存。<br>crontab例子<br>每月每天每小时的第 0 分钟执行一次 &#x2F;bin&#x2F;ls :<br><figure class="highlight basic"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">0 </span>* * * * /bin/ls</span><br></pre></td></tr></table></figure><br>在 12 月内, 每天的早上 6 点到 12 点中，每隔 20 分钟执行一次 &#x2F;usr&#x2F;bin&#x2F;backup :<br>    <figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">*<span class="regexp">/20 6-12 * 12 * /u</span>sr<span class="regexp">/bin/</span>backup</span><br></pre></td></tr></table></figure><br>周一到周五每天下午 5:00 寄一封信给 <a href="mailto:&#x61;&#108;&#x65;&#120;&#x40;&#x64;&#x6f;&#x6d;&#x61;&#x69;&#110;&#46;&#110;&#x61;&#109;&#101;">alex@domain.name</a> :<br>    <figure class="highlight basic"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">0 </span><span class="number">17</span> * * <span class="number">1</span>-<span class="number">5</span> mail -s <span class="string">&quot;hi&quot;</span> alex@domain.<span class="keyword">name</span> &lt; /tmp/maildata</span><br></pre></td></tr></table></figure><br>每月每天的午夜 0 点 20 分, 2 点 20 分, 4 点 20 分….执行 echo “haha”<br><figure class="highlight basic"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">20 </span><span class="number">0</span>-<span class="number">23</span>/<span class="number">2</span> * * * echo <span class="string">&quot;haha&quot;</span></span><br></pre></td></tr></table></figure><br>晚上11点到早上8点之间每两个小时，早上8点<br>    <figure class="highlight basic"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">0 </span><span class="number">23</span>-<span class="number">7</span>/<span class="number">2</span>，<span class="number">8</span> * * * date</span><br></pre></td></tr></table></figure><br>在hp unix,中，每20分钟执行一次，表示为：0,20,40 * * * * 而不能采用</em>&#x2F;n方式，否则出现语法错误<br>crontab用法其实很容易掌握，懂得使用crontab，对网站和服务器维护起到很大的帮助，比如定时备份，定时优化服务器等。</p><p>转载来源:<a href="https://www.centos.bz/2011/03/auto-run-task-crontab/" target="_blank">https://www.centos.bz/2011/03/auto-run-task-crontab/</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;每个操作系统都有它的自动定时启动程序的功能，Windows有它的任务计划，而Linux对应的功能是crontab。&lt;br&gt;crontab简介&lt;br&gt;crontab命令常见于Unix和类Unix的操作系统之中，用于设置周期性被执行的指令。该命令从标准输入设备读取指令，并将其存</summary>
      
    
    
    
    <category term="Linux" scheme="https://blog.xiaoshenlong.cc/categories/Linux/"/>
    
    
    <category term="学习" scheme="https://blog.xiaoshenlong.cc/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>PHP的魔术方法</title>
    <link href="https://blog.xiaoshenlong.cc/2015/05/06/49/"/>
    <id>https://blog.xiaoshenlong.cc/2015/05/06/49/</id>
    <published>2015-05-06T06:15:06.000Z</published>
    <updated>2016-05-31T06:01:48.000Z</updated>
    
    <content type="html"><![CDATA[<p>PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, __clone and __autoload</p><p>1、__get、__set</p><p>这两个方法是为在类和他们的父类中没有声明的属性而设计的<br>__get( $property ) 当调用一个未定义的属性时访问此方法<br>__set( $property, $value ) 给一个未定义的属性赋值时调用<br>这里的没有声明包括当使用对象调用时，访问控制为proteced,private的属性（即没有权限访问的属性）</p><p>2、__isset、__unset</p><p>__isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法<br>__unset( $property ) 当在一个未定义的属性上调用unset()函数时调用此方法<br>与__get方法和__set方法相同，这里的没有声明包括当使用对象调用时，访问控制为proteced,private的属性（即没有权限访问的属性）</p><p>3、__call<br>__call( $method, $arg_array ) 当调用一个未定义的方法是调用此访求<br>这里的未定义的方法包括没有权限访问的方法</p><p>4、__autoload<br>__autoload 函数，它会在试图使用尚未被定义的类时自动调用。通过调用此函数，脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。<br>注意: 在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误。</p><p>5、__construct、__destruct<br>__construct 构造方法，当一个对象创建时调用此方法，使用此方法的好处是：可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么.这样你在改变类的名称时,就不需要改变构造方法的名称<br>__destruct 析构方法，PHP将在对象被销毁前（即从内存中清除前）调用这个方法<br>默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.<br>析构函数允许你在使用一个对象之后执行任意代码来清除内存.<br>当PHP决定你的脚本不再与对象相关时,析构函数将被调用.<br>在一个函数的命名空间内,这会发生在函数return的时候.<br>对于全局变量,这发生于脚本结束的时候.如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为NULL或者调用unset.</p><p>6、__clone<br>PHP5中的对象赋值是使用的引用赋值，如果想复制一个对象则需要使用clone方法，在调用此方法是对象会自动调用__clone魔术方法<br>如果在对象复制需要执行某些初始化操作，可以在__clone方法实现</p><p>7、__toString<br>__toString方法在将一个对象转化成字符串时自动调用，比如使用echo打印对象时<br>如果类没有实现此方法，则无法通过echo打印对象，否则会显示：Catchable fatal error: Object of class test could not be converted to string in<br>此方法必须返回一个字符串<br>在PHP 5.2.0之前，__toString方法只有结合使用echo() 或 print()时 才能生效。PHP 5.2.0之后，则可以在任何字符串环境生效（例如通过printf()，使用%s修饰符），但 不能用于非字符串环境（如使用%d修饰符）。从PHP 5.2.0，如果将一个未定义__toString方法的对象 转换为字符串，会报出一个E_RECOVERABLE_ERROR错误。</p><p>8、__sleep、__wakeup<br>__sleep 串行化的时候用<br>__wakeup 反串行化的时候调用<br>serialize() 检查类中是否有魔术名称 __sleep 的函数。如果这样，该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。<br>使用 __sleep 的目的是关闭对象可能具有的任何数据库连接，提交等待中的数据或进行类似的清除任务。此外，如果有非常大的对象而并不需要完全储存下来时此函数也很有用。<br>相反地，unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存在，此函数可以重建对象可能具有的任何资源。<br>使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。</p><p>9、__set_state<br>当调用var_export()时，这个静态 方法会被调用（自PHP 5.1.0起有效）。<br>本方法的唯一参数是一个数组，其中包含按array(’property’ &#x3D;&gt; value, …)格式排列的类属性。</p><p>10、__invoke<br>当尝试以调用函数的方式调用一个对象时，__invoke 方法会被自动调用。<br>PHP5.3.0以上版本有效</p><p>11、__callStatic<br>它的工作方式类似于 __call() 魔术方法，__callStatic() 是为了处理静态方法调用，<br>PHP5.3.0以上版本有效<br>PHP 确实加强了对 __callStatic() 方法的定义；它必须是公共的，并且必须被声明为静态的。同样，__call() 魔术方法必须被定义为公共的，所有其他魔术方法都必须如此。</p><p>原文出处：<a href="http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/09/22/2185034.html" title="http:&#x2F;&#x2F;www.cnblogs.com&#x2F;xiaochaohuashengmi&#x2F;archive&#x2F;2011&#x2F;09&#x2F;22&#x2F;2185034.html">http://www.cnblogs.com/xiaochaohuashengmi/archive/2011/09/22/2185034.html</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, __toString, __set_state, </summary>
      
    
    
    
    <category term="PHP" scheme="https://blog.xiaoshenlong.cc/categories/PHP/"/>
    
    
    <category term="学习" scheme="https://blog.xiaoshenlong.cc/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>问题 :You can&#39;t specify target table &#39;A&#39; for update in FROM clause</title>
    <link href="https://blog.xiaoshenlong.cc/2015/04/29/42/"/>
    <id>https://blog.xiaoshenlong.cc/2015/04/29/42/</id>
    <published>2015-04-29T08:30:29.000Z</published>
    <updated>2016-05-31T05:56:58.000Z</updated>
    
    <content type="html"><![CDATA[<p>今天在处理一个表的数据时，想直接把某个人对应的数据，对应到另一个人上去，思想很简单，就是把第一个人的对应的ID查出来，然后再用更新语句将所有ID在这里边的做一个更新操作，思路很清晰，操作很简单。好的，代码写好了直接操作数据库，<br><figure class="highlight n1ql"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">UPDATE</span> house h <span class="keyword">SET</span> h.Fuser_id = <span class="number">79063</span> <span class="keyword">WHERE</span> h.Fid <span class="keyword">IN</span> (<span class="keyword">SELECT</span> Fid <span class="keyword">from</span> house <span class="keyword">WHERE</span> Fuser_id = <span class="number">79056</span> <span class="keyword">AND</span> Fdistrict1 = <span class="string">&#x27;&#x27;</span> <span class="keyword">AND</span> Fis_process = <span class="number">0</span>);</span><br></pre></td></tr></table></figure><br>但是在具体操作的过程中，问题出现了，问题是You can’t specify target table ‘A’ for update in FROM clause,问题出在哪了，一查资料原因是在更新这个表和数据时又查询了它，而查询的数据又做了更新的条件。<br>解决方案呢就是先将查出的表作为一个第三方表，然后查询第三方表实现隔离操作。<br><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"><span class="keyword">UPDATE</span> house h <span class="keyword">SET</span> h.Fuser_id = <span class="number">79063</span> <span class="keyword">WHERE</span> h.Fid <span class="keyword">IN</span> (<span class="keyword">SELECT</span> <span class="keyword">temp</span>.Fid <span class="keyword">FROM</span> (<span class="keyword">SELECT</span> Fid <span class="keyword">from</span> house <span class="keyword">WHERE</span> Fuser_id = <span class="number">79056</span> <span class="keyword">AND</span> Fdistrict1 = <span class="string">&#x27;&#x27;</span> <span class="keyword">AND</span> Fis_process = <span class="number">0</span>) <span class="keyword">temp</span> );</span><br></pre></td></tr></table></figure><br>当然这种做法是最佳的选择，还有一个笨方法就是建立一个temp临时表，插入临时表，然后查询临时表，当然该方法的优点是在遇到数据量大的情况下，可以避免数据库内存不够用而导致的宕机。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今天在处理一个表的数据时，想直接把某个人对应的数据，对应到另一个人上去，思想很简单，就是把第一个人的对应的ID查出来，然后再用更新语句将所有ID在这里边的做一个更新操作，思路很清晰，操作很简单。好的，代码写好了直接操作数据库，&lt;br&gt;	&lt;figure class=&quot;high</summary>
      
    
    
    
    <category term="SQL" scheme="https://blog.xiaoshenlong.cc/categories/SQL/"/>
    
    
    <category term="学习" scheme="https://blog.xiaoshenlong.cc/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>浅谈PHP大数据处理</title>
    <link href="https://blog.xiaoshenlong.cc/2015/04/27/30/"/>
    <id>https://blog.xiaoshenlong.cc/2015/04/27/30/</id>
    <published>2015-04-27T10:44:57.000Z</published>
    <updated>2016-05-31T05:54:58.000Z</updated>
    
    <content type="html"><![CDATA[<p>新换的公司，一个表中的数据竟然有29G之大，我顿时就懵了，更让我惊讶的是，还与另一个1G多的表做关联查询，真是让我摸不着头脑，尤其这是mysql数据库，也是惊出了我一身冷汗，好在还有优化的解决方案，下面简单谈一下我的解决方案。</p><ol><li>尽量不要用inner join，内连接查询速度慢，建议为left jion。</li><li>建立索引，两个表中关联的字段都要加上key，可以为主键索引，唯一索引，普通索引等。</li><li>limit 分段处理，每次取2000条，处理完之后再取数据处理。</li><li>mysql数据库优化，将InnoDB的类型改为MyISAM,MyISAM数据引擎更适合大数据的搜索查询。</li><li>优化数据库，使用存储过程式查询，存储过程优势是查询一次后再次查询会很快。</li><li>利用Explain获取的信息来实现mysql优化，参考地址：<a href="http://www.cnblogs.com/promise-7/archive/2012/05/25/2517356.html" title="http:&#x2F;&#x2F;www.cnblogs.com&#x2F;promise-7&#x2F;archive&#x2F;2012&#x2F;05&#x2F;25&#x2F;2517356.html">http://www.cnblogs.com/promise-7/archive/2012/05/25/2517356.html</a></li></ol><p>其实归根结底是数据库方面的优化，当然数据量很大的情况下，要提前预知好，更换数据库是避免查询宕机的关键，如果提前预知用oracle数据库的话，就不会出现现在的情况，现在改数据库，花费的代价很大。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;新换的公司，一个表中的数据竟然有29G之大，我顿时就懵了，更让我惊讶的是，还与另一个1G多的表做关联查询，真是让我摸不着头脑，尤其这是mysql数据库，也是惊出了我一身冷汗，好在还有优化的解决方案，下面简单谈一下我的解决方案。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;尽量不要用inner</summary>
      
    
    
    
    <category term="PHP" scheme="https://blog.xiaoshenlong.cc/categories/PHP/"/>
    
    
    <category term="学习" scheme="https://blog.xiaoshenlong.cc/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
  <entry>
    <title>浅谈Redis与Memcache的异同点</title>
    <link href="https://blog.xiaoshenlong.cc/2015/04/23/31/"/>
    <id>https://blog.xiaoshenlong.cc/2015/04/23/31/</id>
    <published>2015-04-23T04:33:31.000Z</published>
    <updated>2016-05-31T05:55:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>前段时间参加PHP的面试，几乎每个公司都会涉及到Nosql的问题，当前Nosql以高效存储，高效查询等优势迅速成为数据库的辅助工具，最为应用广泛的是Redis，Memcache，Mongodb等，其中Redis与Memcache是key-value型的数据存储，MongoDB是json格式的存储，以下浅谈以下redis与memcache的异同点。<br>1、 Redis和Memcache都是将数据存放在内存中，都是内存数据库。不过memcache还可用于缓存其他东西，例如图片、视频等等。<br>2、 数据类型–Memcache在添加数据时就要指定数据的字节长度，例如：<br><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></pre></td><td class="code"><pre><span class="line"><span class="attribute">set</span> key3 <span class="number">0</span> <span class="number">0</span> <span class="number">8</span></span><br><span class="line"><span class="attribute">lxsymcto</span></span><br><span class="line"><span class="attribute">STORED</span></span><br></pre></td></tr></table></figure><br>而redis不需要，如：<br><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">redis 127.0.0.1:6379&gt;<span class="built_in">set</span> key2 <span class="string">&quot;lxsymblog&quot;</span></span><br><span class="line">OK</span><br><span class="line">redis 127.0.0.1:6379&gt;<span class="built_in">get</span> key2</span><br><span class="line"><span class="string">&quot;lxsymblog&quot;</span></span><br></pre></td></tr></table></figure><br>3、虚拟内存–Redis当物理内存用完时，可以将一些很久没用到的value 交换到磁盘,而memcache不会。<br>4、过期策略–memcache在set时就指定，例如set key1 0 0 8,即永不过期。<br>   Redis可以通过例如expire 设定，例如expire name 10<br>5、分布式–设定memcache集群，利用magent做一主多从;redis可以做一主多从。都可以一主一从。<br>6、存储数据安全–memcache挂掉后，数据没了；redis可以定期保存到磁盘（持久化）。<br>7、灾难恢复–memcache挂掉后，数据不可恢复; redis数据丢失后可以通过aof恢复。</p><p>以上是对该两种数据库的分析，但是不论怎样都有优缺点，根据项目需求具体确定用哪种类型数据库才是最关键的。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;前段时间参加PHP的面试，几乎每个公司都会涉及到Nosql的问题，当前Nosql以高效存储，高效查询等优势迅速成为数据库的辅助工具，最为应用广泛的是Redis，Memcache，Mongodb等，其中Redis与Memcache是key-value型的数据存储，MongoD</summary>
      
    
    
    
    <category term="SQL" scheme="https://blog.xiaoshenlong.cc/categories/SQL/"/>
    
    
    <category term="学习" scheme="https://blog.xiaoshenlong.cc/tags/%E5%AD%A6%E4%B9%A0/"/>
    
  </entry>
  
</feed>
