-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathatom.xml
451 lines (263 loc) · 454 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>一个人住的七年</title>
<subtitle>做自己喜欢的事,会遇见喜欢的人。</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://blog.jybx.me/"/>
<updated>2017-12-05T14:09:38.561Z</updated>
<id>http://blog.jybx.me/</id>
<author>
<name>七年</name>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>https</title>
<link href="http://blog.jybx.me/https.html"/>
<id>http://blog.jybx.me/https.html</id>
<published>2017-07-05T14:08:23.000Z</published>
<updated>2017-12-05T14:09:38.561Z</updated>
<content type="html"><![CDATA[<h1 id="Let’s-Encrypt-简介"><a href="#Let’s-Encrypt-简介" class="headerlink" title="Let’s Encrypt 简介"></a>Let’s Encrypt 简介</h1><blockquote><p>如果要启用 HTTPS,我们就需要从证书授权机构(以下简称 CA) 处获取一个证书,Let’s Encrypt 就是一个 CA。我们可以从 Let’s Encrypt 获得网站域名的免费的证书。这篇文章也主要讲的是通过 Let’s Encrypt + Nginx 来让网站升级到 HTTPS。</p></blockquote><h3 id="配置防火墙"><a href="#配置防火墙" class="headerlink" title="配置防火墙"></a>配置防火墙</h3><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 打开端口443</span></span><br><span class="line">firewall-<span class="keyword">cmd</span><span class="bash"> --zone=public --add-port=443/tcp --permanent</span></span><br><span class="line"><span class="bash">firewall-cmd --complete-reload</span></span><br><span class="line"><span class="bash">firewall-cmd --list-all</span></span><br></pre></td></tr></table></figure><h3 id="安装-certbot-客户端"><a href="#安装-certbot-客户端" class="headerlink" title="安装 certbot 客户端"></a>安装 certbot 客户端</h3><p>在这里<a href="http://rpm.pbone.net/index.php3/stat/4/idpl/31446026/dir/centos_7/com/pyOpenSSL-0.15.1-1.el7.noarch.rpm.html" target="_blank" rel="noopener">获取源</a></p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># CentOS 7 更新源</span></span><br><span class="line">wget ftp:<span class="regexp">//mi</span>rror.switch.ch<span class="regexp">/pool/</span><span class="number">4</span><span class="regexp">/mirror/</span>centos<span class="regexp">/7.3.1611/</span>cloud<span class="regexp">/x86_64/</span>openstack-mitaka<span class="regexp">/common/</span>pyOpenSSL-<span class="number">0.15</span>.<span class="number">1</span>-<span class="number">1</span>.el7.noarch.rpm</span><br><span class="line"></span><br><span class="line">sudo rpm -Uvh pyOpenSSL-<span class="number">0.15</span>.<span class="number">1</span>-<span class="number">1</span>.el7.noarch.rpm</span><br></pre></td></tr></table></figure><figure class="highlight sql"><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">sudo yum <span class="keyword">install</span> certbot</span><br><span class="line">certbot <span class="comment">--version</span></span><br></pre></td></tr></table></figure><h3 id="无法分配内存错误"><a href="#无法分配内存错误" class="headerlink" title="无法分配内存错误"></a>无法分配内存错误</h3><figure class="highlight css"><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><br><span class="line"><span class="selector-tag">certbot-0</span><span class="selector-class">.14</span><span class="selector-class">.1-3</span><span class="selector-class">.el7</span><span class="selector-class">.noarch</span>: <span class="selector-attr">[Errno 5]</span> <span class="selector-attr">[Errno 12]</span> <span class="selector-tag">Cannot</span> <span class="selector-tag">allocate</span> <span class="selector-tag">memory</span></span><br><span class="line"><span class="selector-tag">python-ply-3</span><span class="selector-class">.4-10</span><span class="selector-class">.el7</span><span class="selector-class">.noarch</span>: <span class="selector-attr">[Errno 5]</span> <span class="selector-attr">[Errno 12]</span> <span class="selector-tag">Cannot</span> <span class="selector-tag">allocate</span> <span class="selector-tag">memory</span></span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>要解决此问题,您需要创建交换文件。交换文件的大小取决于你的内存</p><figure class="highlight makefile"><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">M = 以 GB 为单位的 RAM 量</span><br><span class="line">S = 交换量(GB)</span><br><span class="line">如果 M <2,则 S = M * 2 Else S = M + 2</span><br></pre></td></tr></table></figure><figure class="highlight jboss-cli"><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">fallocate -l 2048M <span class="string">/swapfile</span></span><br><span class="line">chmod 600 <span class="string">/swapfile</span></span><br><span class="line">mkswap <span class="string">/swapfile</span></span><br><span class="line">swapon <span class="string">/swapfile</span></span><br></pre></td></tr></table></figure><h3 id="生成-HTTPS-证书"><a href="#生成-HTTPS-证书" class="headerlink" title="生成 HTTPS 证书"></a>生成 HTTPS 证书</h3><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">certbot certonly --standalone -d example<span class="selector-class">.com</span> -d www<span class="selector-class">.example</span><span class="selector-class">.com</span></span><br></pre></td></tr></table></figure><figure class="highlight haml"><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="ruby">d 参数指定域名,是期望开启 https 的域名</span></span><br><span class="line"><span class="ruby">--standalone 表示申请证书时将启动 certbot 内置的 webserver,因此需要先把网站的 Nginx 停掉</span></span><br><span class="line"><span class="ruby">在申请证书时 letsencrypt 会做认证,如果多次认证失败会启动 Rate-limiting,因此在初期调试生成命令的时候,可以在加上 --test-cert 这个参数,表示先在 letsencrypt 的 staging 环境进行调试</span></span><br></pre></td></tr></table></figure><figure class="highlight livescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 会让你输入邮箱</span></span><br><span class="line">certbot certonly --standalone -d adele.top -d www.adele.top</span><br><span class="line">Saving debug log <span class="keyword">to</span> /<span class="keyword">var</span>/log/letsencrypt/letsencrypt.log</span><br><span class="line">Enter email address (used <span class="keyword">for</span> urgent renewal <span class="keyword">and</span> security notices) (Enter <span class="string">'c'</span> <span class="keyword">to</span></span><br><span class="line">cancel):</span><br><span class="line"></span><br><span class="line"><span class="comment"># 输入邮箱后出现</span></span><br><span class="line">-------------------------------------------------------------------------------</span><br><span class="line">Please read the Terms <span class="keyword">of</span> Service at</span><br><span class="line">https:<span class="regexp">//letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree</span></span><br><span class="line"><span class="regexp">in order to register with the ACME server at</span></span><br><span class="line"><span class="regexp">https://</span>acme-v01.api.letsencrypt.org/directory</span><br><span class="line">-------------------------------------------------------------------------------</span><br><span class="line">(A)gree<span class="regexp">/(C)ancel: (A)gree/</span>(C)ancel:</span><br><span class="line"></span><br><span class="line"><span class="comment"># 输入 A 后出现如下提示</span></span><br><span class="line">-------------------------------------------------------------------------------</span><br><span class="line">Would you be willing <span class="keyword">to</span> share your email address <span class="keyword">with</span> the Electronic Frontier</span><br><span class="line">Foundation, a founding partner <span class="keyword">of</span> the Let<span class="string">'s Encrypt project and the non-profit</span></span><br><span class="line"><span class="string">organization that develops Certbot? We'</span>d like <span class="keyword">to</span> send you email about EFF <span class="keyword">and</span></span><br><span class="line">our work <span class="keyword">to</span> encrypt the web, protect its users <span class="keyword">and</span> defend digital rights.</span><br><span class="line">-------------------------------------------------------------------------------</span><br><span class="line">(Y)es/(N)o:</span><br><span class="line"></span><br><span class="line"><span class="comment"># 输入 Y</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 如果一切都成功,您可能会看到一条输出消息,如下所示</span></span><br><span class="line">IMPORTANT NOTES:</span><br><span class="line"> - Congratulations! Your certificate <span class="keyword">and</span> chain have been saved at</span><br><span class="line"> /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will</span><br><span class="line"> expire <span class="literal">on</span> <span class="number">2017</span>-<span class="number">09</span>-<span class="number">24.</span> To obtain a <span class="keyword">new</span> <span class="keyword">or</span> tweaked version <span class="keyword">of</span> <span class="keyword">this</span></span><br><span class="line"> certificate <span class="keyword">in</span> the future, simply run certbot again. To</span><br><span class="line"> non-interactively renew *all* <span class="keyword">of</span> your certificates, run <span class="string">"certbot</span></span><br><span class="line"><span class="string"> renew"</span></span><br><span class="line"> - Your account credentials have been saved <span class="keyword">in</span> your Certbot</span><br><span class="line"> configuration directory at /etc/letsencrypt. You should make a</span><br><span class="line"> secure backup <span class="keyword">of</span> <span class="keyword">this</span> folder now. This configuration directory will</span><br><span class="line"> also contain certificates <span class="keyword">and</span> private keys obtained <span class="keyword">by</span> Certbot so</span><br><span class="line"> making regular backups <span class="keyword">of</span> <span class="keyword">this</span> folder <span class="keyword">is</span> ideal.</span><br><span class="line"> - If you like Certbot, please consider supporting our work by:</span><br><span class="line"></span><br><span class="line"> Donating <span class="keyword">to</span> ISRG / Let<span class="string">'s Encrypt: https://letsencrypt.org/donate</span></span><br><span class="line"><span class="string"> Donating to EFF: https://eff.org/donate-le</span></span><br></pre></td></tr></table></figure><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></pre></td><td class="code"><pre><span class="line">最后,您的 TLS / SSL 证书将以折中的方式生成</span><br><span class="line">cd /etc/letsencrypt/live/example.com</span><br><span class="line">certbot<span class="selector-class">.log</span> cert<span class="selector-class">.pem</span> chain<span class="selector-class">.pem</span> fullchain<span class="selector-class">.pem</span> privkey<span class="selector-class">.pem</span> README</span><br></pre></td></tr></table></figure><h3 id="证书文件"><a href="#证书文件" class="headerlink" title="证书文件"></a>证书文件</h3><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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">cert<span class="selector-class">.pem</span> - 您的域的证书,由Apache使用</span><br><span class="line">chain<span class="selector-class">.pem</span> - 我们加密Apache使用的连锁证书</span><br><span class="line">fullchain<span class="selector-class">.pem</span> - cert.pem和chain.pem组合,由nginx使用</span><br><span class="line">privkey<span class="selector-class">.pem</span> - 您的证书的私钥</span><br><span class="line"></span><br><span class="line">nginx 只需要 fullchain<span class="selector-class">.pem</span> 和 privkey.pem</span><br></pre></td></tr></table></figure><h3 id="在-Nginx-上配置-TLS-SSL"><a href="#在-Nginx-上配置-TLS-SSL" class="headerlink" title="在 Nginx 上配置 TLS / SSL"></a>在 Nginx 上配置 TLS / SSL</h3><p><a href="https://mozilla.github.io/server-side-tls/ssl-config-generator/" target="_blank" rel="noopener">Mozilla SSL Configuration Generator</a> 这是 Mozilla 搞得一个 HTTPS 配置文件自动生成器,支持 Apache,Nginx 等多种服务器。按照这个配置文件,选择 Intermediate 的兼容性。这里生成的配置文件是业界最佳实践和结果</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> {</span><br><span class="line"> <span class="attribute">listen</span> <span class="number">80</span>;</span><br><span class="line"> <span class="attribute">server_name</span> www.example.com example.com;</span><br><span class="line"> <span class="attribute">rewrite</span><span class="regexp"> ^</span> https://<span class="variable">$server_name</span><span class="variable">$request_uri</span> <span class="literal">permanent</span>; </span><br><span class="line">}</span><br><span class="line"> </span><br><span class="line"><span class="section">server</span> {</span><br><span class="line"> <span class="attribute">listen</span> <span class="number">443</span> ssl;</span><br><span class="line"> <span class="attribute">server_name</span> www.example.com example.com;</span><br><span class="line"> <span class="attribute">root</span> /workspace/webapps/obneer/;</span><br><span class="line"> <span class="attribute">index</span> index.php;</span><br><span class="line"> <span class="attribute">charset</span> utf-<span class="number">8</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="attribute">ssl</span> <span class="literal">on</span>;</span><br><span class="line"> <span class="attribute">ssl_certificate</span> /etc/letsencrypt/live/example.com/fullchain.pem;</span><br><span class="line"> <span class="attribute">ssl_certificate_key</span> /etc/letsencrypt/live/example.com/privkey.pem;</span><br><span class="line"> <span class="attribute">ssl_protocols</span> TLSv1 TLSv1.<span class="number">1</span> TLSv1.<span class="number">2</span>;</span><br><span class="line"> <span class="attribute">ssl_ciphers</span> <span class="string">'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'</span>;</span><br><span class="line"> <span class="attribute">ssl_session_cache</span> shared:SSL:<span class="number">10m</span>;</span><br><span class="line"> <span class="attribute">ssl_session_timeout</span> <span class="number">10m</span>;</span><br><span class="line"> <span class="attribute">ssl_session_tickets</span> <span class="literal">off</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 让nginx代理静态文件(如js,css,image等),这样配置会使您的网站更快 </span></span><br><span class="line"> <span class="attribute">location</span> <span class="regexp">~* .*\.(html|htm|gif|jpg|jpeg|bmp|png|ico|txt|js|css|apk|ttf|woff|woff2|svg|flv)$</span> {</span><br><span class="line"> <span class="attribute">add_header</span> Access-Control-Allow-Origin *;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 当有人访问以 .pem 结尾的路径时,他们将被迫重定向到您的主页</span></span><br><span class="line"> <span class="attribute">location</span> <span class="regexp">~* \.pem$</span> {</span><br><span class="line"> <span class="attribute">rewrite</span><span class="regexp"> ^</span> https://<span class="variable">$server_name</span>;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="attribute">location</span> <span class="regexp">~* ^\/(wp-activate|wp-config|wp-config-sample|wp-cron|wp-mail|wp-signup)\.php$</span> {</span><br><span class="line"> <span class="attribute">rewrite</span><span class="regexp"> ^</span> https://<span class="variable">$server_name</span>;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="attribute">location</span> <span class="regexp">~* ^\/wp-admin\/(install|install-helper|setup-config)\.php$</span> {</span><br><span class="line"> <span class="attribute">rewrite</span><span class="regexp"> ^</span> https://<span class="variable">$server_name</span>;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="attribute">location</span> / {</span><br><span class="line"> <span class="attribute">fastcgi_pass</span> <span class="number">127.0.0.1:9000</span>;</span><br><span class="line"> <span class="attribute">fastcgi_index</span> index.php;</span><br><span class="line"> <span class="attribute">fastcgi_param</span> SCRIPT_FILENAME <span class="variable">$document_root</span><span class="variable">$fastcgi_script_name</span>;</span><br><span class="line"> <span class="attribute">include</span> fastcgi_params;</span><br><span class="line"> <span class="attribute">try_files</span> <span class="variable">$uri</span> <span class="variable">$uri</span>/ /index.php?<span class="variable">$args</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight maxima"><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">重启nginx</span><br><span class="line">systemctl <span class="built_in">restart</span> nginx</span><br></pre></td></tr></table></figure><h3 id="证书更新"><a href="#证书更新" class="headerlink" title="证书更新"></a>证书更新</h3><blockquote><p>前面生成的证书有效期为 3 个月,当快要到期时需要使用 certbot renew 命令更新证书。 在更新证书时需要先停止 nginx,然后输入 certbot renew –dry-run 模拟更新,如果模拟更新没有问题使用 certbot renew 更新证书后,再启动 nginx 进行测试。</p></blockquote><p>Linux 服务器上使用 CronTab 定时执行</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">crontab -e</span></span><br></pre></td></tr></table></figure><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">15 </span><span class="number">2</span> * */<span class="number">2</span> * certbot renew --pre-hook <span class="string">"systemctl stop nginx"</span> --post-hook <span class="string">"systemctl restart nginx"</span></span><br></pre></td></tr></table></figure><blockquote><p>–pre-hook 这个参数表示执行更新操作之前要做的事情,因为我有 –standalone 模式的证书,所以需要 停止 nginx 服务,解除端口占用。<br>–post-hook 这个参数表示执行更新操作完成后要做的事情,这里就恢复 nginx 服务的启用</p></blockquote><h3 id="用专业在线工具测试你的服务器-SSL-安全性"><a href="#用专业在线工具测试你的服务器-SSL-安全性" class="headerlink" title="用专业在线工具测试你的服务器 SSL 安全性"></a>用专业在线工具测试你的服务器 SSL 安全性</h3><p><a href="https://www.ssllabs.com/ssltest/index.html" target="_blank" rel="noopener">Qualys SSL Labs</a> 提供了全面的 SSL 安全性测试,填写你的网站域名,给自己的 HTTPS 配置打个分。</p>]]></content>
<summary type="html">
Let's Encrypt 就是一个 CA。我们可以从 Let's Encrypt 获得网站域名的免费的证书。这篇文章也主要讲的是通过 Let's Encrypt + Nginx 来让网站升级到 HTTPS。
</summary>
<category term="https" scheme="http://blog.jybx.me/categories/https/"/>
<category term="Nginx" scheme="http://blog.jybx.me/categories/https/Nginx/"/>
<category term="https" scheme="http://blog.jybx.me/tags/https/"/>
<category term="Nginx" scheme="http://blog.jybx.me/tags/Nginx/"/>
</entry>
<entry>
<title>gitlab</title>
<link href="http://blog.jybx.me/gitlab.html"/>
<id>http://blog.jybx.me/gitlab.html</id>
<published>2017-07-05T12:17:54.000Z</published>
<updated>2017-12-05T14:18:38.965Z</updated>
<content type="html"><![CDATA[<h1 id="安装-GitLab-Community-Edition-CE-社区版"><a href="#安装-GitLab-Community-Edition-CE-社区版" class="headerlink" title="安装 GitLab Community Edition (CE) 社区版"></a>安装 GitLab Community Edition (CE) 社区版</h1><blockquote><p>GitLab 是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的 Git 项目仓库,可通过 Web 界面进行访问公开的或者私人项目.<br><a href="https://www.gitlab.com.cn/" target="_blank" rel="noopener">Gitlab 中文网:</a><a href="https://www.gitlab.com.cn/" target="_blank" rel="noopener">https://www.gitlab.com.cn/</a></p></blockquote><h3 id="安装配置依赖项"><a href="#安装配置依赖项" class="headerlink" title="安装配置依赖项"></a>安装配置依赖项</h3><p>如想使用 Postfix 来发送邮件,在安装期间请选择 ‘Internet Site’. 您也可以用 sendmai 或者 配置 SMTP 服务并使用 SMTP 发送邮件.</p><p>在 Centos 6 和 7 系统上, 下面的命令将在系统防火墙里面开放 HTTP 和 SSH 端口.</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><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="comment"># 安装依赖包</span></span><br><span class="line">sudo yum install curl policycoreutils openssh-server openssh-clients</span><br><span class="line">sudo systemctl <span class="builtin-name">enable</span> sshd</span><br><span class="line">sudo systemctl start sshd</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 postfix 邮件服务</span></span><br><span class="line">sudo yum install postfix</span><br><span class="line">sudo systemctl <span class="builtin-name">enable</span> postfix</span><br><span class="line">sudo systemctl start postfix</span><br><span class="line">systemctl status postfix.service # 查看状态</span><br><span class="line"></span><br><span class="line">sudo firewall-cmd --permanent <span class="attribute">--add-service</span>=http</span><br><span class="line">sudo systemctl reload firewalld</span><br></pre></td></tr></table></figure><h3 id="使用清华大学-TUNA-镜像源"><a href="#使用清华大学-TUNA-镜像源" class="headerlink" title="使用清华大学 TUNA 镜像源"></a>使用清华大学 TUNA 镜像源</h3><p><a href="https://mirror.tuna.tsinghua.edu.cn/help/gitlab-ce/" target="_blank" rel="noopener">镜像使用帮助</a><br>RHEL/CentOS 用户<br>新建 /etc/yum.repos.d/gitlab-ce.repo,内容为</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[gitlab-ce]</span></span><br><span class="line"><span class="attr">name</span>=Gitlab CE Repository</span><br><span class="line"><span class="attr">baseurl</span>=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el<span class="variable">$releasever</span>/</span><br><span class="line"><span class="attr">gpgcheck</span>=<span class="number">0</span></span><br><span class="line"><span class="attr">enabled</span>=<span class="number">1</span></span><br></pre></td></tr></table></figure><p>再执行</p><figure class="highlight cmake"><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="comment"># 更新本地 YUM 缓存</span></span><br><span class="line">sudo yum makecache</span><br><span class="line"></span><br><span class="line"><span class="comment"># 安装 GitLab 社区版</span></span><br><span class="line">sudo yum <span class="keyword">install</span> gitlab-ce <span class="comment">#(自动安装最新版)</span></span><br><span class="line">sudo yum <span class="keyword">install</span> gitlab-ce-<span class="number">8.8</span>.<span class="number">4</span>-ce.<span class="number">0</span>.el6 <span class="comment">#(安装指定版本)</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 初始化 GitLab</span></span><br><span class="line">sudo gitlab-ctl reconfigure</span><br></pre></td></tr></table></figure><h3 id="更改配置"><a href="#更改配置" class="headerlink" title="更改配置"></a>更改配置</h3><p><a href="https://segmentfault.com/a/1190000007661272" target="_blank" rel="noopener">Nginx配置反向代理访问 Gitlab</a></p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">vi</span> /etc/gitlab/gitlab.rb</span><br><span class="line"><span class="comment"># 找到 external_url 'http://******' #(修改成你的地址)</span></span><br><span class="line"><span class="comment"># 设置 gitlab nginx 端口监听修改 </span></span><br><span class="line">nginx[<span class="string">'listen_port'</span>] = 端口号</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line">vi /etc/hosts,添加 host 映射</span><br><span class="line"><span class="number">127.0.0.1</span> git.home.com</span><br><span class="line"></span><br><span class="line">每次修改 /etc/gitlab/gitlab.rb,都要运行以下命令,让配置生效</span><br><span class="line">sudo gitlab-ctl reconfigure</span><br><span class="line">systemctl restart nginx</span><br><span class="line"></span><br><span class="line">配置本机的 host,如:<span class="number">192.168.113.59</span> git.home.com。</span><br></pre></td></tr></table></figure><h3 id="防火墙配置"><a href="#防火墙配置" class="headerlink" title="防火墙配置"></a>防火墙配置</h3><figure class="highlight dockerfile"><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">firewall-<span class="keyword">cmd</span><span class="bash"> --zone=public --add-port=8081/tcp --permanent</span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">firewall-cmd --reload</span></span><br></pre></td></tr></table></figure><p>最后,在浏览器打开网址 <a href="http://git.home.com,修改密码" target="_blank" rel="noopener">http://git.home.com,修改密码</a></p><h3 id="Gitlab-修改备份文件默认目录"><a href="#Gitlab-修改备份文件默认目录" class="headerlink" title="Gitlab 修改备份文件默认目录"></a>Gitlab 修改备份文件默认目录</h3><p>修改 /etc/gitlab/gitlab.rb 来修改默认存放备份文件的目录:</p><figure class="highlight vala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"># 设置备份周期为7天 - 604800秒</span></span><br><span class="line">gitlab_rails[<span class="string">'backup_keep_time'</span>] = <span class="number">604800</span></span><br><span class="line"><span class="meta"># 备份目录</span></span><br><span class="line">gitlab_rails[<span class="string">'backup_path'</span>] = <span class="string">'/mnt/backups'</span></span><br><span class="line"></span><br><span class="line"><span class="meta"># 重载配置文件</span></span><br><span class="line">sudo gitlab-ctl reconfigure</span><br></pre></td></tr></table></figure><p>Linux 服务器上使用 CronTab 定时执行</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">crontab -e</span></span><br></pre></td></tr></table></figure><p>之后就会打开一个文件,并且是非编辑状态,则是 vi 的编辑界面,通过敲键盘上的 i,进入编辑模式,就可以编辑内容。这个文件中的每一行就是一个定时任务,我们新建一行,就是新建一条定时任务(当然是指这一行内按照一定的格式进行书写)。</p><p>时间部分由 5 个时间参数组成,分别是:</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">分 时 日 月 周</span><br></pre></td></tr></table></figure><p>第 1 列表示分钟 1~59 每分钟用 <em>或者 </em>/1表示,<em>/n 表示每 n 分钟,例如 </em>/8 就是每 8 分钟的意思,下面也是类推<br>第 2 列表示小时 1~23(0 表示 0 点)<br>第 3 列表示日期 1~31<br>第 4 列表示月份 1~12<br>第 5 列标识号星期 0~6(0 表示星期天)</p><p>备份</p><figure class="highlight basic"><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="symbol">0 </span><span class="number">2</span> * * * /<span class="keyword">usr</span>/bin/gitlab-rake gitlab:backup:create</span><br><span class="line"><span class="symbol">0 </span><span class="number">2</span> * * * /opt/gitlab/bin/gitlab-rake gitlab:backup:create</span><br></pre></td></tr></table></figure><h3 id="恢复数据文件"><a href="#恢复数据文件" class="headerlink" title="恢复数据文件"></a>恢复数据文件</h3><p>首先进入备份 gitlab 的目录,这个目录是配置文件中的 <code>gitlab_rails['backup_path']</code> ,默认为 <code>/var/opt/gitlab/backups</code></p><figure class="highlight vala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"># 停止连接数据库的进程,保证数据库没有新的连接,不会有写数据情况</span></span><br><span class="line">sudo gitlab-ctl stop unicorn</span><br><span class="line">sudo gitlab-ctl stop sidekiq</span><br><span class="line"></span><br><span class="line"><span class="meta"># 恢复 *********** 这个备份文件,将覆盖 GitLab 数据库!*********** 为备份文件的时间戳</span></span><br><span class="line">sudo gitlab-rake gitlab:backup:restore BACKUP=***********</span><br><span class="line"></span><br><span class="line"><span class="meta"># 启动 GitLab</span></span><br><span class="line">sudo gitlab-ctl start</span><br><span class="line"></span><br><span class="line"><span class="meta"># 检查 GitLab</span></span><br><span class="line">sudo gitlab-rake gitlab:check SANITIZE=<span class="literal">true</span></span><br></pre></td></tr></table></figure><h3 id="设置-smtp-发送邮件服务"><a href="#设置-smtp-发送邮件服务" class="headerlink" title="设置 smtp 发送邮件服务"></a>设置 smtp 发送邮件服务</h3><p><a href="https://docs.gitlab.com.cn/omnibus/settings/smtp.html" target="_blank" rel="noopener">https://docs.gitlab.com.cn/omnibus/settings/smtp.html</a><br>通过修改 /etc/gitlab/gitlab.rb 来设置邮件功能</p><figure class="highlight vala"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"># 通过SMTP来发送邮件</span></span><br><span class="line">gitlab_rails[<span class="string">'smtp_enable'</span>] = <span class="literal">true</span></span><br><span class="line">gitlab_rails[<span class="string">'smtp_address'</span>] = <span class="string">"smtp.163.com"</span></span><br><span class="line">gitlab_rails[<span class="string">'smtp_port'</span>] = <span class="number">465</span></span><br><span class="line"><span class="meta"># 邮箱账号</span></span><br><span class="line">gitlab_rails[<span class="string">'smtp_user_name'</span>] = <span class="string">"[email protected]"</span> </span><br><span class="line"><span class="meta"># 邮箱密码</span></span><br><span class="line">gitlab_rails[<span class="string">'smtp_password'</span>] = <span class="string">"xxpassword"</span>------->注意这里填的是开启smtp的授权码,不是邮箱登录密码</span><br><span class="line"><span class="meta"># 邮箱域:这里填写163.com就好</span></span><br><span class="line">gitlab_rails[<span class="string">'smtp_domain'</span>] = <span class="string">"163.com"</span></span><br><span class="line">gitlab_rails[<span class="string">'smtp_authentication'</span>] = :login</span><br><span class="line">gitlab_rails[<span class="string">'smtp_enable_starttls_auto'</span>] = <span class="literal">true</span></span><br><span class="line">gitlab_rails[<span class="string">'smtp_tls'</span>] = <span class="literal">false</span></span><br><span class="line"><span class="meta">##修改gitlab配置的发信人</span></span><br><span class="line"><span class="meta"># 第一行配置一定要和163邮箱的账户名一样否则可能发送失败</span></span><br><span class="line">gitlab_rails[<span class="string">'gitlab_email_from'</span>] = <span class="string">"[email protected]"</span></span><br><span class="line">gitlab_rails[<span class="string">'gitlab_email_reply_to'</span>] = <span class="string">'[email protected]'</span></span><br><span class="line">user[<span class="string">"git_user_email"</span>] = <span class="string">"[email protected]"</span></span><br></pre></td></tr></table></figure><figure class="highlight nginx"><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="comment"># 重载配置文件</span></span><br><span class="line"><span class="attribute">sudo</span> gitlab-ctl reconfigure</span><br></pre></td></tr></table></figure><p>测试邮件配置是否成功<br>执行 <code>gitlab-rails console</code> 进入控制台。 然后在控制台提示符后输入下面的命令 发送一封测试邮件:</p><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">Notify</span><span class="selector-class">.test_email</span>(<span class="string">'收件人邮箱'</span>, <span class="string">'邮件标题'</span>, <span class="string">'邮件正文'</span>)<span class="selector-class">.deliver_now</span></span><br></pre></td></tr></table></figure><h3 id="运维"><a href="#运维" class="headerlink" title="运维"></a>运维</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 启动所有 gitlab 组件:</span></span><br><span class="line">sudo gitlab-ctl start</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 停止所有 gitlab 组件:</span></span><br><span class="line">sudo gitlab-ctl stop</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 重启所有 gitlab 组件:</span></span><br><span class="line">sudo gitlab-ctl restart</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看服务状态</span></span><br><span class="line">sudo gitlab-ctl status</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 启动服务</span></span><br><span class="line">sudo gitlab-ctl reconfigure</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 修改默认的配置文件</span></span><br><span class="line">sudo vim /etc/gitlab/gitlab.rb</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看版本</span></span><br><span class="line">sudo cat /opt/gitlab/embedded/service/gitlab-rails/VERSION</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> <span class="built_in">echo</span> <span class="string">"vm.overcommit_memory=1"</span> >> /etc/sysctl.conf</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> sysctl -p</span></span><br><span class="line"><span class="meta">#</span><span class="bash"> <span class="built_in">echo</span> never > /sys/kernel/mm/transparent_hugepage/enabled</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 检查gitlab</span></span><br><span class="line">gitlab-rake gitlab:check SANITIZE=true --trace</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 查看日志</span></span><br><span class="line">sudo gitlab-ctl tail</span><br></pre></td></tr></table></figure><h3 id="学习参考"><a href="#学习参考" class="headerlink" title="学习参考"></a>学习参考</h3><p><a href="https://www.gitlab.com.cn/downloads/#centos7" target="_blank" rel="noopener">gitlab</a><br><a href="https://juejin.im/post/57d7c7a979bc44005e594f18" target="_blank" rel="noopener">Centos 6 搭建安装 Gitlab</a></p>]]></content>
<summary type="html">
安装 GitLab Community Edition (CE) 社区版
</summary>
<category term="gitlab" scheme="http://blog.jybx.me/categories/gitlab/"/>
<category term="gitlab" scheme="http://blog.jybx.me/tags/gitlab/"/>
</entry>
<entry>
<title>laravel-repository</title>
<link href="http://blog.jybx.me/laravel-repository.html"/>
<id>http://blog.jybx.me/laravel-repository.html</id>
<published>2017-06-15T05:07:10.000Z</published>
<updated>2017-12-05T14:08:06.631Z</updated>
<content type="html"><![CDATA[<h1 id="laravel-学习-安装-l5-repository-依赖"><a href="#laravel-学习-安装-l5-repository-依赖" class="headerlink" title="laravel 学习-安装 l5-repository 依赖"></a>laravel 学习-安装 l5-repository 依赖</h1><h2 id="MVC-架构-Model-View-Controller"><a href="#MVC-架构-Model-View-Controller" class="headerlink" title="MVC 架构 Model, View, Controller"></a>MVC 架构 Model, View, Controller</h2><blockquote><p>Model<br>模型不仅包含数据,而且包含数据代表的逻辑。</p><p>View<br>View 负责根据 Model 中的数据显示用户界面。</p><p>Controller<br>控制器将用户界面和数据模型关联起来,并充当协调运作的角色。它接收各种用户操作,更新数据模型,并用合适的 view 展示结果给用户。</p></blockquote><h2 id="大型网络-Spring"><a href="#大型网络-Spring" class="headerlink" title="大型网络 Spring"></a>大型网络 Spring</h2><blockquote><p>Service 用于标注业务层组件<br>Controller 用于标注控制层组件<br>Repository 用于标注数据访问组件<br>Presenters 用于标注显示逻辑组件</p><p>Repository 是 MVC 中衔接 Controller 和 Model 之间的一个纽带。从概念上讲,Repository 是把将数据给封装后的集合并提供给 Controller 的操作。</p><p>l5-repository 是一个为 laravel5 提供的数据库抽象层,目的是为了将应用的数据库操作和核心的业务逻辑分离开,保证 controller 的精简。</p></blockquote><p><a href="https://github.com/andersao/l5-repository" target="_blank" rel="noopener">安装包地址</a><br><a href="https://packagist.org/packages/prettus/l5-repository" target="_blank" rel="noopener">packagist</a></p><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>执行以下命令以获取最新版本的软件包:</p><figure class="highlight armasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">composer</span> <span class="meta">require</span> prettus/l5-repository</span><br></pre></td></tr></table></figure><p>在你的 config/app.php 将 Prettus\Repository\Providers\RepositoryServiceProvider::class 添加到 providers 数组的末尾:</p><figure class="highlight moonscript"><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="string">'providers'</span> => [</span><br><span class="line"> Prettus\Repository\Providers\RepositoryServiceProvider::<span class="class"><span class="keyword">class</span>,</span></span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>发布资源文件的服务提供者</p><figure class="highlight taggerscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">php artisan vendor:publish --provider 'Prettus<span class="symbol">\R</span>epository<span class="symbol">\P</span>roviders<span class="symbol">\R</span>epositoryServiceProvider'</span><br></pre></td></tr></table></figure><p>执行结果</p><figure class="highlight groovy"><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">Copied File [<span class="regexp">/vendor/</span>prettus<span class="regexp">/l5-repository/</span>src<span class="regexp">/resources/</span>config<span class="regexp">/repository.php] To [/</span>config/repository.php]</span><br><span class="line">Publishing complete <span class="keyword">for</span> tag []!</span><br></pre></td></tr></table></figure><p>在 <code>config/</code> 下,生成一个 <code>repository.php</code> 的配置文件</p><h2 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h2><p>首先配置存储库文件的存储位置。 默认情况下是 “app” 文件夹和命名空间 “App”。 请注意, paths 数组中的值可以直接用作命名空间和文件路径。</p><figure class="highlight dart"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">'generator'</span> => [</span><br><span class="line"> <span class="string">'basePath'</span> => app_path(),</span><br><span class="line"> <span class="string">'rootNamespace'</span> => <span class="string">'App\\'</span>,</span><br><span class="line"> <span class="string">'paths'</span> => [</span><br><span class="line"> <span class="string">'models'</span> => <span class="string">'Models'</span>, <span class="comment">// 修改模型目录名</span></span><br><span class="line"> <span class="string">'repositories'</span> => <span class="string">'Repositories\\Eloquent'</span>, <span class="comment">// Eloquent 目录用于存放实现 Repository 接口的抽象类和具体类</span></span><br><span class="line"> <span class="string">'interfaces'</span> => <span class="string">'Repositories\\Contracts'</span>, <span class="comment">// 接口</span></span><br><span class="line"> <span class="comment">// Transformer 与 Model 层一一对应的, 主要是对返回数据进行封装</span></span><br><span class="line"> <span class="string">'transformers'</span> => <span class="string">'Repositories\\Transformers'</span>,</span><br><span class="line"> <span class="string">'presenters'</span> => <span class="string">'Presenters'</span>, <span class="comment">// 将相关的显示逻辑封装在不同的 presenter</span></span><br><span class="line"> <span class="string">'validators'</span> => <span class="string">'Repositories\\Validators'</span>, <span class="comment">// 验证器</span></span><br><span class="line"> <span class="string">'controllers'</span> => <span class="string">'Http/Controllers/Admin'</span>,</span><br><span class="line"> <span class="string">'provider'</span> => <span class="string">'RepositoryServiceProvider'</span>,</span><br><span class="line"> <span class="comment">// 将一些可能会在多个接口或者情况下用到的查询条件放到这里</span></span><br><span class="line"> <span class="string">'criteria'</span> => <span class="string">'Repositories\\Criteria'</span>,</span><br><span class="line"> <span class="string">'stubsOverridePath'</span> => app_path()</span><br><span class="line"> ]</span><br><span class="line">]</span><br></pre></td></tr></table></figure><p>生成模型所需的一切,请运行以下命令:</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">php</span> artisan make:entity Article // 有提示,需要生成哪些文件,<span class="literal">yes</span> | <span class="literal">no</span></span><br></pre></td></tr></table></figure><p>这将创建 Controller,Validator,Model,Repository,Presenter 和 Transformer 类。 它还将创建一个新的服务提供程序,用于绑定 Eloquent 存储库及其对应的存储库接口。 要加载它,只需将它添加到您的 AppServiceProvider@register 方法:</p><figure class="highlight clean"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$this->app->register(RepositoryServiceProvider::<span class="keyword">class</span>);</span><br></pre></td></tr></table></figure><h2 id="命令"><a href="#命令" class="headerlink" title="命令"></a>命令</h2><figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// namespace App\Repositories\Contracts\Blog;</span></span><br><span class="line"><span class="comment">// namespace App\Repositories\Eloquent\Blog;</span></span><br><span class="line"><span class="comment">// 生成 2 个文件</span></span><br><span class="line">php artisan <span class="built_in">make</span>:repository <span class="string">"Blog\Post"</span> </span><br><span class="line"></span><br><span class="line"><span class="comment">// 添加验证规则,需要传递 --rules 选项并创建迁移</span></span><br><span class="line"><span class="comment">// 该命令还将创建基本 RESTfull 控制器,所以只需将此行添加到 routes.php 文件</span></span><br><span class="line">php artisan <span class="built_in">make</span>:entity Cat --fillable=<span class="string">"title:string,content:text"</span> --rules=<span class="string">"title=>required|min:2, content=>sometimes|min:10"</span></span><br><span class="line"></span><br><span class="line">Route::resource(<span class="string">'cats'</span>, CatsController::class);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 生成 transformers </span></span><br><span class="line">php artisan <span class="built_in">make</span>:transformer Post</span><br><span class="line"></span><br><span class="line"><span class="comment">// namespace App\Presenters; </span></span><br><span class="line"><span class="comment">// 生成 presenters </span></span><br><span class="line"><span class="comment">// 还会有一个提示: Would you like to create a Transformer?</span></span><br><span class="line">php artisan <span class="built_in">make</span>:presenter Post</span><br><span class="line"></span><br><span class="line"><span class="comment">// namespace App\Providers;</span></span><br><span class="line"><span class="comment">// 会生成 'repositoryProviderServer.php',并绑定一个post相关的服务 </span></span><br><span class="line">php artisan <span class="built_in">make</span>:bindings Post</span><br><span class="line"></span><br><span class="line"><span class="comment">// namespace App\Repositories\Criteria;</span></span><br><span class="line">php artisan <span class="built_in">make</span>:criteria My</span><br></pre></td></tr></table></figure><h2 id="Criteria"><a href="#Criteria" class="headerlink" title="Criteria"></a>Criteria</h2><blockquote><p>Criteria 是一个让你可以根据具体的或者一系列复杂的条件来向你的 repository 发起查询的方式,你可以将一些可能会在多个接口或者情况下用到的查询条件放到这里,到达复用的目的,而且可以将复杂的查询条件从你的 controller 中抽离出来,精简代码的同时,也使得各部分之间的耦合更加松散</p></blockquote><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="php"><span class="meta"><?php</span></span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Repositories</span>\<span class="title">Criteria</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Prettus</span>\<span class="title">Repository</span>\<span class="title">Contracts</span>\<span class="title">CriteriaInterface</span>;</span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Prettus</span>\<span class="title">Repository</span>\<span class="title">Contracts</span>\<span class="title">RepositoryInterface</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line">/**</span><br><span class="line"> * Class MyCriteria</span><br><span class="line"> * @package namespace App\Repositories\Criteria;</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"><span class="class"><span class="keyword">class</span> <span class="title">MyCriteria</span> <span class="keyword">implements</span> <span class="title">CriteriaInterface</span></span></span></span><br><span class="line"><span class="php">{</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"> <span class="keyword">protected</span> $id;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"> /**</span><br><span class="line"> * MyCriteria constructor.</span><br><span class="line"> * @param $id</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span><span class="params">($id)</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> <span class="keyword">$this</span>->id = $id;</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"> /**</span><br><span class="line"> * Apply criteria in query repository</span><br><span class="line"> *</span><br><span class="line"> * @param $model</span><br><span class="line"> * @param RepositoryInterface $repository</span><br><span class="line"> *</span><br><span class="line"> * @return mixed</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">apply</span><span class="params">($model, RepositoryInterface $repository)</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> <span class="keyword">return</span> $model->where(<span class="string">'id'</span>, <span class="keyword">$this</span>->id);</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php">}</span></span><br></pre></td></tr></table></figure><p><strong>在控制器中使用条件</strong></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="php"><span class="meta"><?php</span></span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Http</span>\<span class="title">Controllers</span>\<span class="title">Admin</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Repositories</span>\<span class="title">Criteria</span>\<span class="title">MyCriteria</span>;</span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Repositories</span>\<span class="title">Contracts</span>\<span class="title">ArticleRepository</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="class"><span class="keyword">class</span> <span class="title">ArticlesController</span> <span class="keyword">extends</span> <span class="title">Controller</span></span></span></span><br><span class="line"><span class="php">{</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"> /**</span><br><span class="line"> * @var ArticleRepository</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">protected</span> $repository;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span><span class="params">(ArticleRepository $repository)</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> <span class="keyword">$this</span>->repository = $repository;</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"></span></span><br><span class="line"> /**</span><br><span class="line"> * Display a listing of the resource.</span><br><span class="line"> *</span><br><span class="line"> * @return \Illuminate\Http\Response</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">index</span><span class="params">()</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> <span class="keyword">$this</span>->repository->pushCriteria(MyCriteria::class);</span></span><br><span class="line"><span class="php"> <span class="comment">//$this->repository->pushCriteria(new MyCriteria());</span></span></span><br><span class="line"><span class="php"> $articles = <span class="keyword">$this</span>->repository->all();</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"> <span class="keyword">return</span> view(<span class="string">'articles.index'</span>, compact(<span class="string">'articles'</span>));</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php">}</span></span><br></pre></td></tr></table></figure><h2 id="Transformer"><a href="#Transformer" class="headerlink" title="Transformer"></a>Transformer</h2><blockquote><p>Transformers 的作用是按照接口的需要来包装你从数据库查询出来的结果,你可以在这里方便的设置你需要哪些字段,每一个字段的数据类型,或者你要联查多个表来组成接口所需要的数据时,你可以在这里利用 eloquent 的 relationship 方便的完成<br>这是一个第三方的包,需要你用 composer 引入</p><p>composer require league/fractal</p></blockquote><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="php"><span class="meta"><?php</span></span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Repositories</span>\<span class="title">Transformers</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">League</span>\<span class="title">Fractal</span>\<span class="title">TransformerAbstract</span>;</span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Models</span>\<span class="title">Article</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line">/**</span><br><span class="line"> * Class ArticleTransformer</span><br><span class="line"> * @package namespace App\Repositories\Transformers;</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"><span class="class"><span class="keyword">class</span> <span class="title">ArticleTransformer</span> <span class="keyword">extends</span> <span class="title">TransformerAbstract</span></span></span></span><br><span class="line"><span class="php">{</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"> /**</span><br><span class="line"> * Transform the \Article entity</span><br><span class="line"> * @param Article $model</span><br><span class="line"> *</span><br><span class="line"> * @return array</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">transform</span><span class="params">(Article $model)</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> <span class="keyword">return</span> [</span></span><br><span class="line"><span class="php"> <span class="string">'id'</span> => (int) $model->id,</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"> <span class="comment">/* place your other model properties here */</span></span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"> <span class="string">'created_at'</span> => $model->created_at,</span></span><br><span class="line"><span class="php"> <span class="string">'updated_at'</span> => $model->updated_at</span></span><br><span class="line"><span class="php"> ];</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php">}</span></span><br></pre></td></tr></table></figure><p><strong>在 repository 存储库中设置默认条件</strong></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="php"><span class="meta"><?php</span></span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Repositories</span>\<span class="title">Eloquent</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Repositories</span>\<span class="title">Transformers</span>\<span class="title">ArticleTransformer</span>;</span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Prettus</span>\<span class="title">Repository</span>\<span class="title">Eloquent</span>\<span class="title">BaseRepository</span>;</span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Prettus</span>\<span class="title">Repository</span>\<span class="title">Criteria</span>\<span class="title">RequestCriteria</span>;</span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Repositories</span>\<span class="title">Contracts</span>\<span class="title">ArticleRepository</span>;</span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Models</span>\<span class="title">Article</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line">/**</span><br><span class="line"> * Class ArticleRepositoryEloquent</span><br><span class="line"> * @package namespace App\Repositories\Eloquent;</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"><span class="class"><span class="keyword">class</span> <span class="title">ArticleRepositoryEloquent</span> <span class="keyword">extends</span> <span class="title">BaseRepository</span> <span class="keyword">implements</span> <span class="title">ArticleRepository</span></span></span></span><br><span class="line"><span class="php">{</span></span><br><span class="line"> /**</span><br><span class="line"> * Specify Model class name</span><br><span class="line"> *</span><br><span class="line"> * @return string</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">model</span><span class="params">()</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> <span class="keyword">return</span> Article::class;</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">transfomer</span><span class="params">()</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> <span class="keyword">return</span> ArticleTransformer::class;</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php"> </span></span><br><span class="line"><span class="php"></span></span><br><span class="line"> /**</span><br><span class="line"> * Boot up the repository, pushing criteria</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">boot</span><span class="params">()</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"> /**</span><br><span class="line"> * RequestCriteria 是一个标准的 Criteria 实现。 它使筛选器能够根据请求中发送的参数在存储库中执行。</span><br><span class="line"> * 您可以执行动态搜索,过滤数据和自定义查询。</span><br><span class="line"> * 要在存储库中使用 Criteria,您可以在存储库的引导方法中添加新条件,或直接在控制器中使用,以便只过滤少数几个请求。</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">$this</span>->pushCriteria(app(RequestCriteria::class));</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php">}</span></span><br></pre></td></tr></table></figure><p><strong>你也可以在 controller 中调用 setTransformer 方法来使用</strong></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">$this</span>->repository->setTransformer(<span class="keyword">new</span> ArticleTransformer());</span><br></pre></td></tr></table></figure><p><strong>跳过存储库中定义的条件</strong></p><blockquote><p>当你在对 repository 使用了 transformer 之后,也许在某些场景下你不希望查询结果自动的被 transform 掉,你可以调用 repository 的 skipTransformer() 方法来跳过转换。</p></blockquote><figure class="highlight xl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$<span class="function"><span class="title">this</span>-></span><span class="function"><span class="title">repository</span>-></span><span class="function"><span class="title">skipCriteria</span>()-></span>all();</span><br></pre></td></tr></table></figure><p><strong>使用 popCriteria 删除条件</strong></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">$this</span>->repository->popCriteria(<span class="keyword">new</span> MyCriteria());</span><br></pre></td></tr></table></figure><h2 id="缓存"><a href="#缓存" class="headerlink" title="缓存"></a>缓存</h2><p>更改文件 config / repository.php 中的缓存设置</p><figure class="highlight dart"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">'cache'</span> => [</span><br><span class="line"> <span class="comment">//启用或禁用缓存存储库</span></span><br><span class="line"> <span class="string">'enabled'</span> => <span class="keyword">true</span> ,</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//缓存的生命周期</span></span><br><span class="line"> <span class="string">'minutes'</span> => <span class="number">30</span> ,</span><br><span class="line"> </span><br><span class="line"> <span class="comment">// Repository Cache,implementation Illuminate\Contracts\Cache\Repository</span></span><br><span class="line"> <span class="string">'repository'</span> => <span class="string">'cache'</span> ,</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//设置清除高速缓存</span></span><br><span class="line"> <span class="string">'clean'</span> => [</span><br><span class="line"> <span class="comment">//启用,禁用在更改时清除缓存</span></span><br><span class="line"> <span class="string">'enabled'</span> => <span class="keyword">true</span> ,</span><br><span class="line"> </span><br><span class="line"> <span class="string">'on'</span> => [</span><br><span class="line"> <span class="comment">//启用,在创建项目时禁用清除缓存</span></span><br><span class="line"> <span class="string">'create'</span> => <span class="keyword">true</span> ,</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//启用,在升级项目时禁用清除缓存</span></span><br><span class="line"> <span class="string">'update'</span> => <span class="keyword">true</span> ,</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//启用,在删除项目时禁用清除缓存</span></span><br><span class="line"> <span class="string">'delete'</span> => <span class="keyword">true</span> ,</span><br><span class="line"> ]]</span><br><span class="line"> ],</span><br><span class="line"> <span class="string">'params'</span> => [</span><br><span class="line"> <span class="comment">//将用于绕过缓存存储库的请求参数</span></span><br><span class="line"> <span class="string">'skipCache'</span> => <span class="string">'skipCache'</span></span><br><span class="line"> ],</span><br><span class="line"> <span class="string">'allowed'</span> => [</span><br><span class="line"> <span class="comment">//仅允许对某些方法进行高速缓存</span></span><br><span class="line"> <span class="string">'only'</span> => <span class="keyword">null</span> ,</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//允许缓存所有可用的方法,除了</span></span><br><span class="line"> <span class="string">'except'</span> => <span class="keyword">null</span></span><br><span class="line"> ],</span><br><span class="line"> ],</span><br></pre></td></tr></table></figure><p><strong>可以直接在存储库中覆盖这些设置</strong></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="php"><span class="meta"><?php</span></span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Repositories</span>\<span class="title">Eloquent</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Repositories</span>\<span class="title">Transformers</span>\<span class="title">ArticleTransformer</span>;</span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Prettus</span>\<span class="title">Repository</span>\<span class="title">Eloquent</span>\<span class="title">BaseRepository</span>;</span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Prettus</span>\<span class="title">Repository</span>\<span class="title">Criteria</span>\<span class="title">RequestCriteria</span>;</span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Repositories</span>\<span class="title">Contracts</span>\<span class="title">ArticleRepository</span>;</span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Models</span>\<span class="title">Article</span>;</span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Prettus</span>\<span class="title">Repository</span>\<span class="title">Traits</span>\<span class="title">CacheableRepository</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line">/**</span><br><span class="line"> * Class ArticleRepositoryEloquent</span><br><span class="line"> * @package namespace App\Repositories\Eloquent;</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"><span class="class"><span class="keyword">class</span> <span class="title">ArticleRepositoryEloquent</span> <span class="keyword">extends</span> <span class="title">BaseRepository</span> <span class="keyword">implements</span> <span class="title">ArticleRepository</span></span></span></span><br><span class="line"><span class="php">{</span></span><br><span class="line"><span class="php"> <span class="keyword">use</span> <span class="title">CacheableRepository</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"> <span class="comment">//设置缓存的生命周期到存储库</span></span></span><br><span class="line"><span class="php"> <span class="keyword">protected</span> $cacheMinutes = <span class="number">90</span> ;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"> <span class="comment">// 可缓存的方法是:all,paginate,find,findByField,findWhere,getByCriteria</span></span></span><br><span class="line"><span class="php"> <span class="keyword">protected</span> $cacheOnly = [<span class="string">'all'</span>];</span></span><br><span class="line"><span class="php"> <span class="comment">//或</span></span></span><br><span class="line"><span class="php"> <span class="keyword">protected</span> $cacheExcept = [<span class="string">'find'</span>];</span></span><br><span class="line"><span class="php">}</span></span><br></pre></td></tr></table></figure><h2 id="参考学习"><a href="#参考学习" class="headerlink" title="参考学习"></a>参考学习</h2><p><a href="https://zh.wikipedia.org/wiki/Ruby_on_Rails#Rails.E7.9A.84MVC.E6.9E.B6.E6.9E.84" target="_blank" rel="noopener">ROR</a><br><a href="http://blog.csdn.net/beyond__devil/article/details/54633617" target="_blank" rel="noopener">laravel 学习-安装 entrust 和 l5-repository 2 个基本依赖</a><br><a href="https://juejin.im/entry/587f3bae570c3522011941b7" target="_blank" rel="noopener">laravel 提供的简单强大的 repository</a></p>]]></content>
<summary type="html">
laravel 学习-安装 l5-repository 依赖
</summary>
<category term="laravel" scheme="http://blog.jybx.me/categories/laravel/"/>
<category term="repository" scheme="http://blog.jybx.me/categories/laravel/repository/"/>
<category term="laravel" scheme="http://blog.jybx.me/tags/laravel/"/>
<category term="repository" scheme="http://blog.jybx.me/tags/repository/"/>
</entry>
<entry>
<title>array</title>
<link href="http://blog.jybx.me/array.html"/>
<id>http://blog.jybx.me/array.html</id>
<published>2017-06-15T04:03:56.000Z</published>
<updated>2017-12-05T14:05:06.382Z</updated>
<content type="html"><![CDATA[<h5 id="array-change-key-case-—-将数组中的所有键名修改为全大写或小写"><a href="#array-change-key-case-—-将数组中的所有键名修改为全大写或小写" class="headerlink" title="array_change_key_case — 将数组中的所有键名修改为全大写或小写"></a>array_change_key_case — 将数组中的所有键名修改为全大写或小写</h5><figure class="highlight xquery"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">// 错误/异常 : 输入值(<span class="keyword">array</span>)不是一个数组,就会抛出一个错误警告(E_WARNING)</span><br><span class="line">$input_<span class="keyword">array</span> = <span class="keyword">array</span>(<span class="string">"FirSt"</span> => <span class="number">1</span>, <span class="string">"SecOnd"</span> => <span class="number">4</span>);</span><br><span class="line">// [<span class="number">1</span>] <span class="keyword">array</span> 需要操作的数组 [<span class="number">2</span>] CASE_UPPER 或 CASE_LOWER(默认值)</span><br><span class="line">print_r(array_change_key_case($input_<span class="keyword">array</span>, CASE_UPPER));</span><br><span class="line">// [ [<span class="string">'FIRST'</span> => <span class="number">1</span>], [<span class="string">'SECOND'</span> => <span class="number">4</span>] ]</span><br></pre></td></tr></table></figure><h5 id="array-chunk-—-将一个数组分割成多个"><a href="#array-chunk-—-将一个数组分割成多个" class="headerlink" title="array_chunk — 将一个数组分割成多个"></a>array_chunk — 将一个数组分割成多个</h5><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><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">// 错误/异常 : 如果 size 小于 <span class="number">1</span>,会抛出一个 <span class="symbol">E_WARNING</span> 错误并返回 <span class="symbol">NULL</span>。</span><br><span class="line">$input_array = array(<span class="string">'a'</span>, <span class="string">'b'</span>, <span class="string">'c'</span>, <span class="string">'d'</span>, <span class="string">'e'</span>);</span><br><span class="line">// [<span class="number">1</span>] array 需要操作的数组 [<span class="number">2</span>] size 每个数组的单元数目 [<span class="number">3</span>] <span class="symbol">TRUE</span>,保留输入数组中原来的键名 <span class="symbol">FALSE</span>,每个结果数组将用从零开始的新数字索引。默认值是 <span class="symbol">FALSE</span>。</span><br><span class="line">print_r(array_chunk($input_array, <span class="number">2</span>));</span><br><span class="line">// [ [<span class="string">'a'</span>, <span class="string">'b'</span>], [<span class="string">'c'</span>, <span class="string">'d'</span>], [<span class="string">'e'</span>] ]</span><br><span class="line">print_r(array_chunk($input_array, <span class="number">2</span>, true));</span><br><span class="line">// [ [<span class="number">0</span> => <span class="string">'a'</span>, <span class="number">1</span> => <span class="string">'b'</span>], [<span class="number">2</span> => <span class="string">'c'</span>, <span class="number">3</span> => <span class="string">'d'</span>], [<span class="number">4</span> => <span class="string">'e'</span>] ]</span><br></pre></td></tr></table></figure><h5 id="array-column-—-返回数组中指定的一列"><a href="#array-column-—-返回数组中指定的一列" class="headerlink" title="array_column — 返回数组中指定的一列"></a>array_column — 返回数组中指定的一列</h5><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></pre></td><td class="code"><pre><span class="line">$records = <span class="keyword">array</span>(</span><br><span class="line"> <span class="keyword">array</span>(<span class="string">'id'</span> => <span class="number">2135</span>,<span class="string">'name'</span> => <span class="string">'John'</span>),</span><br><span class="line"> <span class="keyword">array</span>(<span class="string">'id'</span> => <span class="number">3245</span>,<span class="string">'name'</span> => <span class="string">'Smith'</span>),</span><br><span class="line"> <span class="keyword">array</span>(<span class="string">'id'</span> => <span class="number">5342</span>,<span class="string">'name'</span> => <span class="string">'Peter'</span>)</span><br><span class="line">);</span><br><span class="line"><span class="comment">//从结果集中取出 name 列</span></span><br><span class="line">$names = array_column($records, <span class="string">'name'</span>);</span><br><span class="line">print_r($names); <span class="comment">// [ 'John', 'Smith', 'Peter' ]</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//从结果集中总取出 name 列,用相应的 id 作为键值</span></span><br><span class="line">$names = array_column($records, <span class="string">'name'</span>, <span class="string">'id'</span>);</span><br><span class="line">print_r($names); <span class="comment">// [ 2135 => 'John', 3245 => 'Smith', 5342 => 'Peter' ]</span></span><br></pre></td></tr></table></figure><h5 id="array-combine-—-创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值"><a href="#array-combine-—-创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值" class="headerlink" title="array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值"></a>array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值</h5><figure class="highlight shell"><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">// 错误/异常 : 两个数组的元素个数不一样,将会抛出一个警告错误(E_WARNING)</span><br><span class="line">// [1] 将被作为新数组的键 [2] 将被作为 Array 的值</span><br><span class="line"><span class="meta">$</span><span class="bash">a = array(<span class="string">'green'</span>, <span class="string">'red'</span>, <span class="string">'yellow'</span>);</span></span><br><span class="line"><span class="meta">$</span><span class="bash">b = array(<span class="string">'avocado'</span>, <span class="string">'apple'</span>, <span class="string">'banana'</span>);</span></span><br><span class="line"><span class="meta">$</span><span class="bash">c = array_combine(<span class="variable">$a</span>, <span class="variable">$b</span>);</span></span><br><span class="line"><span class="meta">print_r($</span><span class="bash">c); // [ <span class="string">'green'</span> => <span class="string">'avocado'</span> ... ]</span></span><br></pre></td></tr></table></figure><h5 id="array-count-values-—-统计数组中所有的值"><a href="#array-count-values-—-统计数组中所有的值" class="headerlink" title="array_count_values — 统计数组中所有的值"></a>array_count_values — 统计数组中所有的值</h5><figure class="highlight vhdl"><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="built_in">string</span> 和 <span class="built_in">integer</span> 类型的元素抛出一个警告错误(E_WARNING)</span><br><span class="line">$<span class="keyword">array</span> = <span class="keyword">array</span>(<span class="number">1</span>, <span class="string">"hello"</span>, <span class="number">1</span>, <span class="string">"world"</span>, <span class="string">"hello"</span>);</span><br><span class="line">print_r(array_count_values($<span class="keyword">array</span>));</span><br><span class="line">// [ <span class="number">1</span> => <span class="number">2</span>, <span class="symbol">'hello</span>' => <span class="number">2</span>, <span class="symbol">'world</span>' => <span class="number">1</span> ]</span><br></pre></td></tr></table></figure><h5 id="array-diff-assoc-—-带索引检查计算数组的差集"><a href="#array-diff-assoc-—-带索引检查计算数组的差集" class="headerlink" title="array_diff_assoc — 带索引检查计算数组的差集"></a>array_diff_assoc — 带索引检查计算数组的差集</h5><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash">array1 = array(<span class="string">"a"</span> => <span class="string">"green"</span>, <span class="string">"b"</span> => <span class="string">"brown"</span>, <span class="string">"c"</span> => <span class="string">"blue"</span>, <span class="string">"red"</span>); // <span class="string">'0'</span> => <span class="string">'red'</span></span></span><br><span class="line"><span class="meta">$</span><span class="bash">array2 = array(<span class="string">"a"</span> => <span class="string">"green"</span>, <span class="string">"yellow"</span>, <span class="string">"red"</span>); // <span class="string">'1'</span> => <span class="string">'red'</span></span></span><br><span class="line">// [1] 从这个数组进行比较 [2] 被比较的数组 [3] ...更多被比较的数组</span><br><span class="line"><span class="meta">$</span><span class="bash">result = array_diff_assoc(<span class="variable">$array1</span>, <span class="variable">$array2</span>);</span></span><br><span class="line"><span class="meta">print_r($</span><span class="bash">result); // [ <span class="string">'b'</span> => <span class="string">'brown'</span>, <span class="string">'c'</span> => <span class="string">'blue'</span>, <span class="string">'0'</span> => <span class="string">'red'</span> ]</span></span><br><span class="line"></span><br><span class="line"><span class="meta">$</span><span class="bash">array1 = array(0, 1, 2);</span></span><br><span class="line"><span class="meta">$</span><span class="bash">array2 = array(<span class="string">"00"</span>, <span class="string">"01"</span>, <span class="string">"2"</span>);</span></span><br><span class="line"><span class="meta">$</span><span class="bash">result = array_diff_assoc(<span class="variable">$array1</span>, <span class="variable">$array2</span>);</span></span><br><span class="line"><span class="meta">print_r($</span><span class="bash">result); // [ 0, 1 ]</span></span><br></pre></td></tr></table></figure><h5 id="array-diff-key-—-使用键名比较计算数组的差集-比较键名"><a href="#array-diff-key-—-使用键名比较计算数组的差集-比较键名" class="headerlink" title="array_diff_key — 使用键名比较计算数组的差集 (比较键名)"></a>array_diff_key — 使用键名比较计算数组的差集 (比较键名)</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 返回一个数组,该数组包括了所有出现在 array1 中但是未出现在任何其它参数数组中的键名的值</span></span><br><span class="line">$array1 = <span class="keyword">array</span>(<span class="string">'blue'</span> => <span class="number">1</span>, <span class="string">'red'</span> => <span class="number">2</span>, <span class="string">'green'</span> => <span class="number">3</span>, <span class="string">'purple'</span> => <span class="number">4</span>);</span><br><span class="line">$array2 = <span class="keyword">array</span>(<span class="string">'green'</span> => <span class="number">5</span>, <span class="string">'blue'</span> => <span class="number">6</span>, <span class="string">'yellow'</span> => <span class="number">7</span>, <span class="string">'cyan'</span> => <span class="number">8</span>);</span><br><span class="line"><span class="comment">// [1] 从这个数组进行比较 [2] 针对此数组进行比较 [3] ...更多比较数组</span></span><br><span class="line">var_dump(array_diff_key($array1, $array2)); <span class="comment">// [ 'red' => 2, 'purple' => 4 ]</span></span><br></pre></td></tr></table></figure><h5 id="array-diff-—-计算数组的差集(比较键值)"><a href="#array-diff-—-计算数组的差集(比较键值)" class="headerlink" title="array_diff — 计算数组的差集(比较键值)"></a>array_diff — 计算数组的差集(比较键值)</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 返回一个数组,该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。[[注意键名保留不变]]</span></span><br><span class="line">$array1 = <span class="keyword">array</span>(<span class="string">"a"</span> => <span class="string">"green"</span>, <span class="string">"red"</span>, <span class="string">"blue"</span>, <span class="string">"red"</span>);</span><br><span class="line">$array2 = <span class="keyword">array</span>(<span class="string">"b"</span> => <span class="string">"green"</span>, <span class="string">"yellow"</span>, <span class="string">"red"</span>);</span><br><span class="line"><span class="comment">// [1] 要被对比的数组 [2] 和这个数组进行比较 [3] ...更多比较数组</span></span><br><span class="line">$result = array_diff($array1, $array2);</span><br><span class="line">print_r($result); <span class="comment">// [ '1' => 'blue' ]</span></span><br></pre></td></tr></table></figure><h5 id="array-fill-keys-—-使用指定的键和值填充数组"><a href="#array-fill-keys-—-使用指定的键和值填充数组" class="headerlink" title="array_fill_keys — 使用指定的键和值填充数组"></a>array_fill_keys — 使用指定的键和值填充数组</h5><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">$</span><span class="bash">keys = array(<span class="string">'foo'</span>, 5, 10, <span class="string">'bar'</span>);</span></span><br><span class="line">// [1] 使用该数组的值作为键。非法值将被转换为字符串 [2] 填充使用的值</span><br><span class="line"><span class="meta">$</span><span class="bash">a = array_fill_keys(<span class="variable">$keys</span>, <span class="string">'banana'</span>);</span></span><br><span class="line"><span class="meta">print_r($</span><span class="bash">a); // [ <span class="string">'foo'</span> => <span class="string">'banana'</span>, <span class="string">'5'</span> => <span class="string">'banana'</span>, <span class="string">'10'</span> => <span class="string">'banana'</span>, <span class="string">'bar'</span> => <span class="string">'banana'</span> ]</span></span><br></pre></td></tr></table></figure><h5 id="array-fill-—-用给定的值填充数组"><a href="#array-fill-—-用给定的值填充数组" class="headerlink" title="array_fill — 用给定的值填充数组"></a>array_fill — 用给定的值填充数组</h5><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="regexp">//</span> 错误/异常 : 如果 num 小于零,将会抛出 E_WARNING</span><br><span class="line"><span class="regexp">//</span> [<span class="number">1</span>] 返回的数组的第一个索引值 [<span class="number">2</span>] 插入元素的数量。 必须大于或等于 <span class="number">0</span> [<span class="number">3</span>] 用来填充的值</span><br><span class="line"><span class="variable">$a</span> = array_fill(<span class="number">5</span>, <span class="number">3</span>, <span class="string">'banana'</span>);</span><br><span class="line"><span class="variable">$b</span> = array_fill(-<span class="number">2</span>, <span class="number">3</span>, <span class="string">'pear'</span>);</span><br><span class="line">print_r(<span class="variable">$a</span>); <span class="regexp">//</span> [ <span class="string">'5'</span> => <span class="string">'banana'</span>, <span class="string">'6'</span> => <span class="string">'banana'</span>, <span class="string">'7'</span> => <span class="string">'banana'</span> ]</span><br><span class="line">print_r(<span class="variable">$b</span>); <span class="regexp">//</span> [ -<span class="number">2</span> => <span class="string">'pear'</span>, <span class="number">0</span> => <span class="string">'pear'</span>, <span class="number">1</span> => <span class="string">'pear'</span> ]</span><br></pre></td></tr></table></figure><h5 id="array-filter-—-用回调函数过滤数组中的单元"><a href="#array-filter-—-用回调函数过滤数组中的单元" class="headerlink" title="array_filter — 用回调函数过滤数组中的单元"></a>array_filter — 用回调函数过滤数组中的单元</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_filter — 用回调函数过滤数组中的单元 [用户不应在回调函数中修改数组本身]</span></span><br><span class="line">$max_comparator = <span class="function"><span class="keyword">function</span> <span class="params">($max)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="function"><span class="keyword">function</span> <span class="params">($v)</span> <span class="title">use</span> <span class="params">($max)</span> </span>{ <span class="keyword">return</span> $v > $max; };</span><br><span class="line">};</span><br><span class="line">$input = <span class="keyword">array</span>(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>);</span><br><span class="line"><span class="comment">// [1] 要循环的数组 [2] 使用的回调函数</span></span><br><span class="line">$output = array_filter($input, $max_comparator(<span class="number">2</span>)); <span class="comment">// 返回大于 2 的</span></span><br><span class="line">print_r($output);</span><br><span class="line"></span><br><span class="line">$arr = [<span class="string">'a'</span> => <span class="number">1</span>, <span class="string">'b'</span> => <span class="number">2</span>, <span class="string">'c'</span> => <span class="number">3</span>, <span class="string">'d'</span> => <span class="number">4</span>];</span><br><span class="line">var_dump(array_filter($arr, <span class="function"><span class="keyword">function</span><span class="params">($k)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> $k == <span class="string">'b'</span>;</span><br><span class="line">}, ARRAY_FILTER_USE_KEY)); <span class="comment">// ARRAY_FILTER_USE_KEY - callback 接受键名作为的唯一参数</span></span><br><span class="line"></span><br><span class="line">var_dump(array_filter($arr, <span class="function"><span class="keyword">function</span><span class="params">($v, $k)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> $k == <span class="string">'b'</span> || $v == <span class="number">4</span>;</span><br><span class="line">}, ARRAY_FILTER_USE_BOTH)); <span class="comment">// ARRAY_FILTER_USE_BOTH - callback 同时接受键名和键值</span></span><br></pre></td></tr></table></figure><h5 id="array-flip-—-交换数组中的键和值"><a href="#array-flip-—-交换数组中的键和值" class="headerlink" title="array_flip — 交换数组中的键和值"></a>array_flip — 交换数组中的键和值</h5><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">// array_flip — 交换数组中的键和值</span><br><span class="line"><span class="meta">$</span><span class="bash">array = array(<span class="string">'green'</span>,<span class="string">'blue'</span>,<span class="string">'orange'</span>,<span class="string">'blue'</span>);</span></span><br><span class="line"><span class="meta">$</span><span class="bash">array = array_flip(<span class="variable">$array</span>); // [ <span class="string">'green'</span> => 0, <span class="string">'blue'</span> => <span class="string">'3'</span>, <span class="string">'orange'</span> => 2 ]</span></span><br><span class="line"><span class="meta">$</span><span class="bash">array = array_flip(<span class="variable">$array</span>); // [ 0 => <span class="string">'green'</span>, 3 => <span class="string">'blue'</span>, 2 => <span class="string">'orange'</span>]</span></span><br><span class="line"></span><br><span class="line">/* 使用 array_values() 函数修复键值*/</span><br><span class="line"><span class="meta">$</span><span class="bash">array = array_values(<span class="variable">$array</span>);</span></span><br><span class="line"><span class="meta">print_r($</span><span class="bash">array); // [ 0 => <span class="string">'green'</span>, 1 => <span class="string">'blue'</span>, 2 => <span class="string">'orange'</span>]</span></span><br><span class="line"></span><br><span class="line"><span class="meta">$</span><span class="bash">array = array(<span class="string">'green'</span>,<span class="string">'blue'</span>,<span class="string">'orange'</span>,<span class="string">'blue'</span>);</span></span><br><span class="line"><span class="meta">$</span><span class="bash">array = array_flip(<span class="variable">$array</span>);</span></span><br><span class="line">/* 跟第一个例子一样,但是现在我们先提取数组的键值 */</span><br><span class="line"><span class="meta">$</span><span class="bash">array = array_keys(<span class="variable">$array</span>); // array_keys — 返回数组中部分的或所有的键名</span></span><br><span class="line"><span class="meta">print_r($</span><span class="bash">array);</span></span><br></pre></td></tr></table></figure><h5 id="array-key-exists-—-检查数组里是否有指定的键名或索引"><a href="#array-key-exists-—-检查数组里是否有指定的键名或索引" class="headerlink" title="array_key_exists — 检查数组里是否有指定的键名或索引"></a>array_key_exists — 检查数组里是否有指定的键名或索引</h5><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></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_key_exists — 检查数组里是否有指定的键名或索引</span></span><br><span class="line">$search_array = <span class="keyword">array</span>(<span class="string">'first'</span> => <span class="keyword">null</span>, <span class="string">'second'</span> => <span class="number">4</span>);</span><br><span class="line"><span class="keyword">isset</span>($search_array[<span class="string">'first'</span>]); <span class="comment">// returns false</span></span><br><span class="line">array_key_exists(<span class="string">'first'</span>, $search_array); <span class="comment">// returns true</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">array_check</span><span class="params">(...)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> (<span class="keyword">isset</span>(..) || array_key_exists(...))</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h5 id="array-keys-—-返回数组中部分的或所有的键名"><a href="#array-keys-—-返回数组中部分的或所有的键名" class="headerlink" title="array_keys — 返回数组中部分的或所有的键名"></a>array_keys — 返回数组中部分的或所有的键名</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_keys — 返回数组中部分的或所有的键名</span></span><br><span class="line"><span class="comment">// [1] 数组 [2] 只有包含这些值的键才会返回 [3] 默认 false,true 严格的比较(===)</span></span><br><span class="line">$array = <span class="keyword">array</span>(<span class="number">0</span> => <span class="number">100</span>, <span class="string">"color"</span> => <span class="string">"red"</span>);</span><br><span class="line">print_r(array_keys($array)); <span class="comment">// [ 0, 'color' ]</span></span><br><span class="line"></span><br><span class="line">$array = <span class="keyword">array</span>(<span class="string">"blue"</span>, <span class="string">"red"</span>, <span class="string">"green"</span>, <span class="string">"blue"</span>, <span class="string">"blue"</span>);</span><br><span class="line">print_r(array_keys($array, <span class="string">"blue"</span>)); <span class="comment">// [ 0, 3, 4 ]</span></span><br></pre></td></tr></table></figure><h5 id="array-map-—-为数组的每个元素应用回调函数-返回数组"><a href="#array-map-—-为数组的每个元素应用回调函数-返回数组" class="headerlink" title="array_map — 为数组的每个元素应用回调函数,返回数组"></a>array_map — 为数组的每个元素应用回调函数,返回数组</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_map — 为数组的每个元素应用回调函数,返回数组</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">arraysSum</span><span class="params">(array ...$arrays)</span> </span>{</span><br><span class="line"> <span class="comment">// [1] 回调函数 [2] 数组 [3]...数组列表</span></span><br><span class="line"> <span class="keyword">return</span> array_map(<span class="function"><span class="keyword">function</span><span class="params">(array $array)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> array_sum($array);</span><br><span class="line"> }, $arrays);</span><br><span class="line">}</span><br><span class="line">print_r(arraysSum([<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>], [<span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>], [<span class="number">7</span>, <span class="number">8</span>, <span class="number">9</span>])); <span class="comment">// [6, 15, 24]</span></span><br><span class="line"></span><br><span class="line">$a = <span class="keyword">array</span>(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>);</span><br><span class="line">$b = <span class="keyword">array</span>(<span class="string">"uno"</span>, <span class="string">"dos"</span>, <span class="string">"tres"</span>);</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">show_Spanish</span><span class="params">($n, $m)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span>(<span class="string">"$n is $m"</span>);</span><br><span class="line">}</span><br><span class="line">$c = array_map(<span class="string">"show_Spanish"</span>, $a, $b);</span><br><span class="line">print_r($c); <span class="comment">// [ '1 is uno', '2 is dos', '3 is tres' ]</span></span><br></pre></td></tr></table></figure><h5 id="array-merge-recursive-—-递归地合并一个或多个数组"><a href="#array-merge-recursive-—-递归地合并一个或多个数组" class="headerlink" title="array_merge_recursive — 递归地合并一个或多个数组"></a>array_merge_recursive — 递归地合并一个或多个数组</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_merge_recursive — 递归地合并一个或多个数组</span></span><br><span class="line">$ar1 = <span class="keyword">array</span>(<span class="string">"color"</span> => <span class="keyword">array</span>(<span class="string">"favorite"</span> => <span class="string">"red"</span>), <span class="number">5</span>);</span><br><span class="line">$ar2 = <span class="keyword">array</span>(<span class="number">10</span>, <span class="string">"color"</span> => <span class="keyword">array</span>(<span class="string">"favorite"</span> => <span class="string">"green"</span>, <span class="string">"blue"</span>));</span><br><span class="line"><span class="comment">// [1] 要合并的初始数组 [2] 数组变量列表,进行递归合并</span></span><br><span class="line">$result = array_merge_recursive($ar1, $ar2);</span><br><span class="line">print_r($result);</span><br><span class="line"><span class="comment">// [ 'color' => [ 'favorte' => [ 'red', 'green' ], 'blue' ], 5, 10 ]</span></span><br></pre></td></tr></table></figure><h5 id="array-merge-—-合并一个或多个数组"><a href="#array-merge-—-合并一个或多个数组" class="headerlink" title="array_merge — 合并一个或多个数组"></a>array_merge — 合并一个或多个数组</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_merge — 合并一个或多个数组</span></span><br><span class="line">$array1 = <span class="keyword">array</span>(<span class="string">"color"</span> => <span class="string">"red"</span>, <span class="number">2</span>);</span><br><span class="line">$array2 = <span class="keyword">array</span>(<span class="string">"a"</span>, <span class="string">"color"</span> => <span class="string">"green"</span>, <span class="string">"shape"</span> => <span class="string">"trape"</span>, <span class="number">4</span>);</span><br><span class="line"><span class="comment">// [1] 要合并的第一个数组 [2] 要合并的数组列表</span></span><br><span class="line">$result = array_merge($array1, $array2);</span><br><span class="line">print_r($result); <span class="comment">// [ 'color' => 'green', 2, 'a', 'shape' => 'trape', 4 ]</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 如果你想完全保留原有数组并只想新的数组附加到后面,用 + 运算符:</span></span><br><span class="line">$array1 = <span class="keyword">array</span>(<span class="number">0</span> => <span class="string">'zero_a'</span>, <span class="number">2</span> => <span class="string">'two_a'</span>, <span class="number">3</span> => <span class="string">'three_a'</span>);</span><br><span class="line">$array2 = <span class="keyword">array</span>(<span class="number">1</span> => <span class="string">'one_b'</span>, <span class="number">3</span> => <span class="string">'three_b'</span>, <span class="number">4</span> => <span class="string">'four_b'</span>);</span><br><span class="line">$result = $array1 + $array2;</span><br><span class="line">var_dump($result);</span><br><span class="line"><span class="comment">// 第一个数组的键名将会被保留。在两个数组中存在相同的键名时,</span></span><br><span class="line"><span class="comment">// 第一个数组中的同键名的元素将会被保留,第二个数组中的元素将会被忽略</span></span><br><span class="line"><span class="comment">// [ 'zero_a', 'two_a', 'three_a', 'one_b', 'four_b' ]</span></span><br></pre></td></tr></table></figure><h5 id="array-multisort-—-对多个数组或多维数组进行排序"><a href="#array-multisort-—-对多个数组或多维数组进行排序" class="headerlink" title="array_multisort — 对多个数组或多维数组进行排序"></a>array_multisort — 对多个数组或多维数组进行排序</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_multisort — 对多个数组或多维数组进行排序</span></span><br><span class="line">$ar1 = <span class="keyword">array</span>(<span class="number">10</span>, <span class="number">100</span>, <span class="number">100</span>, <span class="number">0</span>);</span><br><span class="line">$ar2 = <span class="keyword">array</span>(<span class="number">1</span>, <span class="number">3</span>, <span class="number">2</span>, <span class="number">4</span>);</span><br><span class="line"><span class="comment">// [1] 要排序的 array</span></span><br><span class="line"><span class="comment">// [2] (默认)SORT_ASC 按照上升顺序排序, SORT_DESC 按照下降顺序排序</span></span><br><span class="line"><span class="comment">// [3] 排序类型标志:</span></span><br><span class="line"><span class="comment">// 1. SORT_REGULAR - 将项目按照通常方法比较(不修改类型)默认</span></span><br><span class="line"><span class="comment">// 2. SORT_NUMERIC - 按照数字大小比较</span></span><br><span class="line"><span class="comment">// 3. SORT_STRING - 按照字符串比较</span></span><br><span class="line"><span class="comment">// 4. SORT_LOCALE_STRING - 根据当前的本地化设置,按照字符串比较</span></span><br><span class="line"><span class="comment">// 5. SORT_NATURAL - 以字符串的"自然排序",类似 natsort()</span></span><br><span class="line"><span class="comment">// 6. SORT_FLAG_CASE - 可以组合 (按位或 OR) SORT_STRING 或者 SORT_NATURAL 大小写不敏感的方式排序字符串</span></span><br><span class="line">array_multisort($ar1, $ar2);</span><br><span class="line">var_dump($ar1); <span class="comment">// [ 0, 10, 100, 100 ]</span></span><br><span class="line"><span class="comment">// 第二个数组对应第一个数组后进行了排序</span></span><br><span class="line">var_dump($ar2); <span class="comment">// [ 4, 1, 2, 3 ]</span></span><br><span class="line"></span><br><span class="line">$arr = <span class="keyword">array</span> (<span class="keyword">array</span>(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>), <span class="keyword">array</span>(<span class="string">"a"</span>, <span class="string">"b"</span>, <span class="string">"b"</span>, <span class="string">"d"</span>));</span><br><span class="line">array_multisort($arr[<span class="number">0</span>], SORT_DESC, $arr[<span class="number">1</span>], SORT_ASC);</span><br><span class="line">print_r($arr); <span class="comment">// [ [ 4, 3, 2, 1 ], [ 'd', 'b', 'b', 'a' ] ]</span></span><br><span class="line"></span><br><span class="line">$arr = <span class="keyword">array</span>(<span class="string">"d"</span> => <span class="number">100</span>, <span class="string">"c"</span> => <span class="number">22</span>, <span class="string">"f"</span> => <span class="number">22</span>, <span class="string">"e"</span> => <span class="number">22</span>);</span><br><span class="line">array_multisort($arr, array_keys($arr));</span><br><span class="line"><span class="comment">//先按值排序,如果值相同的,按其键排序。</span></span><br><span class="line">var_dump($arr); <span class="comment">// [ 'c' => 22, 'e' => 22, 'f' => 22, 'd' => 100 ]</span></span><br></pre></td></tr></table></figure><h5 id="array-pad-—-以指定长度将一个值填充进数组"><a href="#array-pad-—-以指定长度将一个值填充进数组" class="headerlink" title="array_pad — 以指定长度将一个值填充进数组"></a>array_pad — 以指定长度将一个值填充进数组</h5><figure class="highlight lsl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_pad — 以指定长度将一个值填充进数组</span></span><br><span class="line">$input = array(<span class="number">12</span>, <span class="number">10</span>, <span class="number">9</span>);</span><br><span class="line">$result = array_pad($input, <span class="number">5</span>, <span class="number">0</span>);</span><br><span class="line"><span class="comment">// result is array(12, 10, 9, 0, 0)</span></span><br><span class="line">$result = array_pad($input, <span class="number">-7</span>, <span class="number">-1</span>);</span><br><span class="line"><span class="comment">// result is array(-1, -1, -1, -1, 12, 10, 9)</span></span><br></pre></td></tr></table></figure><h5 id="array-pop-—-弹出数组最后一个单元(出栈)"><a href="#array-pop-—-弹出数组最后一个单元(出栈)" class="headerlink" title="array_pop — 弹出数组最后一个单元(出栈)"></a>array_pop — 弹出数组最后一个单元(出栈)</h5><figure class="highlight smali"><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">// array_pop — 弹出数组最后一个单元(出栈)</span><br><span class="line">$stack = array(<span class="string">"orange"</span>, <span class="string">"banana"</span>, <span class="string">"apple"</span>, <span class="string">"raspberry"</span>);</span><br><span class="line">// 返回<span class="built_in"> array </span>的最后一个值。如果<span class="built_in"> array </span>是空(如果不是一个数组),将会返回 NULL</span><br><span class="line">$fruit = array_pop($stack);</span><br><span class="line">print_r($stack); // [ 'orange', 'banana', 'apple' ]</span><br></pre></td></tr></table></figure><h5 id="array-push-—-将一个或多个单元压入数组的末尾(入栈)"><a href="#array-push-—-将一个或多个单元压入数组的末尾(入栈)" class="headerlink" title="array_push — 将一个或多个单元压入数组的末尾(入栈)"></a>array_push — 将一个或多个单元压入数组的末尾(入栈)</h5><figure class="highlight awk"><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="regexp">//</span> array_push — 将一个或多个单元压入数组的末尾(入栈)</span><br><span class="line"><span class="variable">$stack</span> = array(<span class="string">"orange"</span>, <span class="string">"banana"</span>);</span><br><span class="line"><span class="regexp">//</span> [<span class="number">1</span>] 输入的数组 [<span class="number">2</span>] 要压入 array 末尾的第一个值</span><br><span class="line">array_push(<span class="variable">$stack</span>, <span class="string">"apple"</span>, <span class="string">"raspberry"</span>);</span><br><span class="line">print_r(<span class="variable">$stack</span>); <span class="regexp">//</span> [ <span class="string">'orange'</span>, <span class="string">'banana'</span>, <span class="string">'apple'</span>, <span class="string">'respberry'</span> ]</span><br></pre></td></tr></table></figure><h5 id="array-product-—-计算数组中所有值的乘积"><a href="#array-product-—-计算数组中所有值的乘积" class="headerlink" title="array_product — 计算数组中所有值的乘积"></a>array_product — 计算数组中所有值的乘积</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_product — 计算数组中所有值的乘积</span></span><br><span class="line">$a = <span class="keyword">array</span>(<span class="number">2</span>, <span class="number">4</span>, <span class="number">6</span>, <span class="number">8</span>);</span><br><span class="line"><span class="keyword">echo</span> array_product($a); <span class="comment">// 384</span></span><br><span class="line"><span class="keyword">echo</span> array_product(<span class="keyword">array</span>()); <span class="comment">// 1</span></span><br></pre></td></tr></table></figure><h5 id="array-rand-—-从数组中随机取出一个或多个单元"><a href="#array-rand-—-从数组中随机取出一个或多个单元" class="headerlink" title="array_rand — 从数组中随机取出一个或多个单元"></a>array_rand — 从数组中随机取出一个或多个单元</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_rand — 从数组中随机取出一个或多个单元</span></span><br><span class="line">$input = <span class="keyword">array</span>(<span class="string">"Neo"</span>, <span class="string">"Morpheus"</span>, <span class="string">"Trinity"</span>, <span class="string">"Cypher"</span>, <span class="string">"Tank"</span>);</span><br><span class="line"><span class="comment">// [1] 输入的数组 [2] 指明了你想取出多少个单元</span></span><br><span class="line"><span class="comment">// 取出数量如果超过 array 的长度,就会导致 E_WARNING 错误,并返回 NULL</span></span><br><span class="line">$rand_keys = array_rand($input, <span class="number">2</span>);</span><br><span class="line"><span class="keyword">echo</span> $input[$rand_keys[<span class="number">0</span>]];</span><br><span class="line"><span class="keyword">echo</span> $input[$rand_keys[<span class="number">1</span>]];</span><br></pre></td></tr></table></figure><h5 id="array-reduce-—-用回调函数迭代地将数组简化为单一的值"><a href="#array-reduce-—-用回调函数迭代地将数组简化为单一的值" class="headerlink" title="array_reduce — 用回调函数迭代地将数组简化为单一的值"></a>array_reduce — 用回调函数迭代地将数组简化为单一的值</h5><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></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_reduce — 用回调函数迭代地将数组简化为单一的值</span></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">因为第一个参数是保存的结果,第二个参数才是每次取的数组中的一个元素。</span></span><br><span class="line"><span class="comment">第一次返回0+0+1+1=2,第二次是2+2+2+1=7,所以最终返回结果是7.</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">echo</span> array_reduce(<span class="keyword">array</span>(<span class="number">1</span>,<span class="number">2</span>),<span class="string">'f'</span>); <span class="comment">// 7</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">f</span><span class="params">($x, $y)</span> </span>{</span><br><span class="line"> <span class="comment">// var_dump($x, $y);</span></span><br><span class="line"> <span class="keyword">return</span> $x + $x + $y + <span class="number">1</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">// 结果是 51,array_reduce 第三个参数作为数组第一个值,所以这里就是 23+23+4+1=51.</span></span><br><span class="line">var_dump(array_reduce(<span class="keyword">array</span>(<span class="number">4</span>), <span class="string">'f'</span>, <span class="number">23</span>)); <span class="comment">// 51</span></span><br></pre></td></tr></table></figure><h5 id="array-replace-recursive-—-使用传递的数组递归替换第一个数组的元素"><a href="#array-replace-recursive-—-使用传递的数组递归替换第一个数组的元素" class="headerlink" title="array_replace_recursive — 使用传递的数组递归替换第一个数组的元素"></a>array_replace_recursive — 使用传递的数组递归替换第一个数组的元素</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_replace_recursive — 使用传递的数组递归替换第一个数组的元素</span></span><br><span class="line">$base = <span class="keyword">array</span>(<span class="string">'citrus'</span> => <span class="keyword">array</span>( <span class="string">"orange"</span>) , <span class="string">'berries'</span> => <span class="keyword">array</span>(<span class="string">"blackberry"</span>, <span class="string">"raspberry"</span>));</span><br><span class="line">$replacements = <span class="keyword">array</span>(<span class="string">'citrus'</span> => <span class="keyword">array</span>(<span class="string">'pineapple'</span>), <span class="string">'berries'</span> => <span class="keyword">array</span>(<span class="string">'blueberry'</span>));</span><br><span class="line">$basket = array_replace_recursive($base, $replacements);</span><br><span class="line">print_r($basket);</span><br><span class="line"><span class="comment">// [ 'citrus' => [ 'pineapple' ], 'berries' => [ 'blueberry', 'raspberry' ] ]</span></span><br></pre></td></tr></table></figure><h5 id="array-replace-—-使用传递的数组替换第一个数组的元素"><a href="#array-replace-—-使用传递的数组替换第一个数组的元素" class="headerlink" title="array_replace — 使用传递的数组替换第一个数组的元素"></a>array_replace — 使用传递的数组替换第一个数组的元素</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_replace — 使用传递的数组替换第一个数组的元素</span></span><br><span class="line">$base = <span class="keyword">array</span>(<span class="string">"orange"</span>, <span class="string">"banana"</span>, <span class="string">"apple"</span>, <span class="string">"raspberry"</span>);</span><br><span class="line">$replacements = <span class="keyword">array</span>(<span class="number">0</span> => <span class="string">"pineapple"</span>, <span class="number">4</span> => <span class="string">"cherry"</span>);</span><br><span class="line">$replacements2 = <span class="keyword">array</span>(<span class="number">0</span> => <span class="string">"grape"</span>);</span><br><span class="line">$basket = array_replace($base, $replacements, $replacements2);</span><br><span class="line">print_r($basket);</span><br><span class="line"><span class="comment">// [ 'grape', 'banana', 'apple', 'raspberry', 'cherry' ]</span></span><br></pre></td></tr></table></figure><h5 id="array-reverse-—-返回单元顺序相反的数组"><a href="#array-reverse-—-返回单元顺序相反的数组" class="headerlink" title="array_reverse — 返回单元顺序相反的数组"></a>array_reverse — 返回单元顺序相反的数组</h5><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">// array_reverse — 返回单元顺序相反的数组</span><br><span class="line"><span class="meta">$</span><span class="bash">input = array(<span class="string">"php"</span>, 4.0, array(<span class="string">"green"</span>, <span class="string">"red"</span>));</span></span><br><span class="line">// [1] 输入的数组 [2] TRUE 会保留数字的键。 非数字的键则不受这个设置的影响,总是会被保留。</span><br><span class="line"><span class="meta">$</span><span class="bash">reversed = array_reverse(<span class="variable">$input</span>);</span></span><br><span class="line"><span class="meta">$</span><span class="bash">preserved = array_reverse(<span class="variable">$input</span>, <span class="literal">true</span>);</span></span><br><span class="line"><span class="meta">print_r($</span><span class="bash">reversed); // [ [ <span class="string">'green'</span>, <span class="string">'red'</span> ], 4, <span class="string">'php'</span> ]</span></span><br><span class="line"><span class="meta">print_r($</span><span class="bash">preserved); // [ 2 => [ <span class="string">'green'</span>, <span class="string">'red'</span> ], 1 => 4, 0 => <span class="string">'php'</span> ]</span></span><br></pre></td></tr></table></figure><h5 id="array-search-—-在数组中搜索给定的值,如果成功则返回首个相应的键名"><a href="#array-search-—-在数组中搜索给定的值,如果成功则返回首个相应的键名" class="headerlink" title="array_search — 在数组中搜索给定的值,如果成功则返回首个相应的键名"></a>array_search — 在数组中搜索给定的值,如果成功则返回首个相应的键名</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_search — 在数组中搜索给定的值,如果成功则返回首个相应的键名</span></span><br><span class="line">$array = <span class="keyword">array</span>(<span class="number">0</span> => <span class="string">'blue'</span>, <span class="number">1</span> => <span class="string">'red'</span>, <span class="number">2</span> => <span class="string">'green'</span>, <span class="number">3</span> => <span class="string">'red'</span>);</span><br><span class="line">$key = array_search(<span class="string">'green'</span>, $array); <span class="comment">// $key = 2;</span></span><br><span class="line">$key = array_search(<span class="string">'red'</span>, $array); <span class="comment">// $key = 1;</span></span><br></pre></td></tr></table></figure><h5 id="array-shift-—-将数组开头的单元移出数组"><a href="#array-shift-—-将数组开头的单元移出数组" class="headerlink" title="array_shift — 将数组开头的单元移出数组"></a>array_shift — 将数组开头的单元移出数组</h5><figure class="highlight awk"><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="regexp">//</span> array_shift — 将数组开头的单元移出数组</span><br><span class="line"><span class="variable">$stack</span> = array(<span class="string">"orange"</span>, <span class="string">"banana"</span>, <span class="string">"apple"</span>, <span class="string">"raspberry"</span>);</span><br><span class="line"><span class="regexp">//</span> 返回移出的值,如果 array 为 空或不是一个数组则返回 NULL</span><br><span class="line"><span class="variable">$fruit</span> = array_shift(<span class="variable">$stack</span>);</span><br><span class="line">print_r(<span class="variable">$stack</span>); <span class="regexp">//</span> [ <span class="string">'banana'</span>, <span class="string">'apple'</span>, <span class="string">'raspberry'</span> ]</span><br></pre></td></tr></table></figure><h5 id="array-slice-—-从数组中取出一段"><a href="#array-slice-—-从数组中取出一段" class="headerlink" title="array_slice — 从数组中取出一段"></a>array_slice — 从数组中取出一段</h5><figure class="highlight awk"><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></pre></td><td class="code"><pre><span class="line"><span class="regexp">//</span> array_slice — 从数组中取出一段</span><br><span class="line"><span class="variable">$input</span> = array(<span class="string">"a"</span>, <span class="string">"b"</span>, <span class="string">"c"</span>, <span class="string">"d"</span>, <span class="string">"e"</span>);</span><br><span class="line"><span class="regexp">//</span> [<span class="number">1</span>] 输入的数组</span><br><span class="line"><span class="regexp">//</span> [<span class="number">2</span>] 如果非负,则序列将从 array 中的此偏移量开始。如果为负,则序列将从 array 中距离末端这么远的地方开始。</span><br><span class="line"><span class="regexp">//</span> [<span class="number">3</span>] 为正,则序列中将具有这么多的单元。为负,则序列将终止在距离数组末端这么远的地方</span><br><span class="line"><span class="regexp">//</span> [<span class="number">4</span>] 默认会重新排序并重置数组的数字索引。设为 TRUE 来改变此行为。</span><br><span class="line"><span class="variable">$output</span> = array_slice(<span class="variable">$input</span>, <span class="number">2</span>); <span class="regexp">//</span> [ <span class="string">'c'</span>, <span class="string">'d'</span>, <span class="string">'e'</span> ]</span><br><span class="line"><span class="variable">$output</span> = array_slice(<span class="variable">$input</span>, -<span class="number">2</span>, <span class="number">1</span>); <span class="regexp">//</span> [ <span class="string">'d'</span> ]</span><br><span class="line"><span class="variable">$output</span> = array_slice(<span class="variable">$input</span>, <span class="number">0</span>, <span class="number">3</span>); <span class="regexp">//</span> [ <span class="string">'a'</span>, <span class="string">'b'</span>, <span class="string">'c'</span> ]</span><br><span class="line"></span><br><span class="line">print_r(array_slice(<span class="variable">$input</span>, <span class="number">2</span>, -<span class="number">1</span>)); <span class="regexp">//</span> [ <span class="number">0</span> => <span class="string">'c'</span>, <span class="number">1</span> => <span class="string">'d'</span> ]</span><br><span class="line">print_r(array_slice(<span class="variable">$input</span>, <span class="number">2</span>, -<span class="number">1</span>, true)); <span class="regexp">//</span> [ <span class="number">2</span> => <span class="string">'c'</span>, <span class="number">3</span> => <span class="string">'d'</span> ]</span><br></pre></td></tr></table></figure><h5 id="array-splice-—-去掉数组中的某一部分并用其它值取代"><a href="#array-splice-—-去掉数组中的某一部分并用其它值取代" class="headerlink" title="array_splice — 去掉数组中的某一部分并用其它值取代"></a>array_splice — 去掉数组中的某一部分并用其它值取代</h5><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="regexp">//</span> array_splice — 去掉数组中的某一部分并用其它值取代</span><br><span class="line"><span class="variable">$input</span> = array(<span class="string">"red"</span>, <span class="string">"green"</span>, <span class="string">"blue"</span>, <span class="string">"yellow"</span>);</span><br><span class="line"><span class="regexp">//</span> [<span class="number">1</span>] 输入的数组</span><br><span class="line"><span class="regexp">//</span> [<span class="number">2</span>] 如果为正,则从 input 数组中该值指定的偏移量开始移除。如果为负,则从 input 末尾倒数该值指定的偏移量开始移除。</span><br><span class="line"><span class="regexp">//</span> [<span class="number">3</span>] 没有值,移除至结尾。整数,移除这么多单元。负数,从结尾开始移除几个。<span class="number">0</span>,不移除</span><br><span class="line"><span class="regexp">//</span> [<span class="number">4</span>] 有值,插入到第二个参数的指定位置。注意替换数组中的键名不保留。</span><br><span class="line">array_splice(<span class="variable">$input</span>, <span class="number">2</span>);</span><br><span class="line"><span class="regexp">//</span> <span class="variable">$input</span> is now array(<span class="string">"red"</span>, <span class="string">"green"</span>)</span><br><span class="line"></span><br><span class="line"><span class="variable">$input</span> = array(<span class="string">"red"</span>, <span class="string">"green"</span>, <span class="string">"blue"</span>, <span class="string">"yellow"</span>);</span><br><span class="line">array_splice(<span class="variable">$input</span>, <span class="number">1</span>, -<span class="number">1</span>);</span><br><span class="line"><span class="regexp">//</span> <span class="variable">$input</span> is now array(<span class="string">"red"</span>, <span class="string">"yellow"</span>)</span><br><span class="line"></span><br><span class="line"><span class="variable">$input</span> = array(<span class="string">"red"</span>, <span class="string">"green"</span>, <span class="string">"blue"</span>, <span class="string">"yellow"</span>);</span><br><span class="line">array_splice(<span class="variable">$input</span>, <span class="number">1</span>, count(<span class="variable">$input</span>), <span class="string">"orange"</span>);</span><br><span class="line"><span class="regexp">//</span> <span class="variable">$input</span> is now array(<span class="string">"red"</span>, <span class="string">"orange"</span>)</span><br><span class="line"></span><br><span class="line"><span class="variable">$input</span> = array(<span class="string">"red"</span>, <span class="string">"green"</span>, <span class="string">"blue"</span>, <span class="string">"yellow"</span>);</span><br><span class="line">array_splice(<span class="variable">$input</span>, -<span class="number">1</span>, <span class="number">1</span>, array(<span class="string">"black"</span>, <span class="string">"maroon"</span>));</span><br><span class="line"><span class="regexp">//</span> <span class="variable">$input</span> is now array(<span class="string">"red"</span>, <span class="string">"green"</span>,</span><br><span class="line"><span class="regexp">//</span> <span class="string">"blue"</span>, <span class="string">"black"</span>, <span class="string">"maroon"</span>)</span><br><span class="line"></span><br><span class="line"><span class="variable">$input</span> = array(<span class="string">"red"</span>, <span class="string">"green"</span>, <span class="string">"blue"</span>, <span class="string">"yellow"</span>);</span><br><span class="line">array_splice(<span class="variable">$input</span>, <span class="number">3</span>, <span class="number">0</span>, <span class="string">"purple"</span>);</span><br><span class="line"><span class="regexp">//</span> <span class="variable">$input</span> is now array(<span class="string">"red"</span>, <span class="string">"green"</span>,</span><br><span class="line"><span class="regexp">//</span> <span class="string">"blue"</span>, <span class="string">"purple"</span>, <span class="string">"yellow"</span>);</span><br></pre></td></tr></table></figure><h5 id="array-sum-—-对数组中所有值求和"><a href="#array-sum-—-对数组中所有值求和" class="headerlink" title="array_sum — 对数组中所有值求和"></a>array_sum — 对数组中所有值求和</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_sum — 对数组中所有值求和</span></span><br><span class="line"><span class="comment">// array 为空时则返回 0</span></span><br><span class="line">$a = <span class="keyword">array</span>(<span class="number">2</span>, <span class="number">4</span>, <span class="number">6</span>, <span class="number">8</span>);</span><br><span class="line"><span class="keyword">echo</span> array_sum($a); <span class="comment">// 20</span></span><br><span class="line"></span><br><span class="line">$b = <span class="keyword">array</span>(<span class="string">"a"</span> => <span class="number">1.2</span>, <span class="string">"b"</span> => <span class="number">2.3</span>, <span class="string">"c"</span> => <span class="number">3.4</span>);</span><br><span class="line"><span class="keyword">echo</span> array_sum($b); <span class="comment">// 6.9</span></span><br></pre></td></tr></table></figure><h5 id="array-udiff-—-用回调函数比较数据来计算数组的差集"><a href="#array-udiff-—-用回调函数比较数据来计算数组的差集" class="headerlink" title="array_udiff — 用回调函数比较数据来计算数组的差集"></a>array_udiff — 用回调函数比较数据来计算数组的差集</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_udiff — 用回调函数比较数据来计算数组的差集</span></span><br><span class="line">$array1 = <span class="keyword">array</span>(</span><br><span class="line"> <span class="keyword">array</span>(<span class="string">'n3'</span>=><span class="string">'v3'</span>, <span class="string">'n4'</span>=><span class="string">'v4'</span>),</span><br><span class="line"> <span class="keyword">array</span>(<span class="string">'n1'</span>=><span class="string">'v1'</span>, <span class="string">'n2'</span>=><span class="string">'v2'</span>)</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line">$array2 = <span class="keyword">array</span>(</span><br><span class="line"> <span class="keyword">array</span>(<span class="string">'n1'</span>=><span class="string">'v1'</span>, <span class="string">'n2'</span>=><span class="string">'v2'</span>)</span><br><span class="line">);</span><br><span class="line"></span><br><span class="line">$result = array_udiff(</span><br><span class="line"> $array1,</span><br><span class="line"> $array2,</span><br><span class="line"> <span class="function"><span class="keyword">function</span> <span class="params">($v1, $v2)</span> </span>{</span><br><span class="line"> <span class="comment">// 在第一个参数小于,等于或大于第二个参数时,该比较函数必须相应地返回一个小于,等于或大于 0 的整数。</span></span><br><span class="line"> print_r($v1);</span><br><span class="line"> print_r($v2);</span><br><span class="line"> <span class="comment">// 如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0。</span></span><br><span class="line"> <span class="keyword">return</span> strcmp(serialize($v1), serialize($v2));</span><br><span class="line"> }</span><br><span class="line">);</span><br><span class="line">print_r($result); <span class="comment">// array( array('n3'=>'v3', 'n4'=>'v4') )</span></span><br><span class="line"></span><br><span class="line">$result = array_filter($array1, <span class="function"><span class="keyword">function</span><span class="params">($v)</span> <span class="title">use</span> <span class="params">($array2)</span> </span>{</span><br><span class="line"> <span class="keyword">return</span> in_array($v, $array2);</span><br><span class="line">});</span><br><span class="line">print_r($result); <span class="comment">// array( array('n1'=>'v1', 'n2'=>'v2') )</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">$arr1 = <span class="keyword">array</span>(<span class="string">'cat'</span>, <span class="string">'mouse'</span>, <span class="string">'horse'</span>);</span><br><span class="line">$arr2 = <span class="keyword">array</span>(<span class="string">'cat'</span>, <span class="string">'mouse'</span>);</span><br><span class="line">print_r(array_udiff($arr1, $arr2, <span class="function"><span class="keyword">function</span><span class="params">($a, $b)</span></span>{</span><br><span class="line"> print_r($a);<span class="keyword">echo</span> <span class="string">'<br/>'</span>;</span><br><span class="line"> print_r($b);<span class="keyword">echo</span> <span class="string">'<br/>'</span>;</span><br><span class="line"> <span class="keyword">return</span> strcmp(serialize($a), serialize($b));</span><br><span class="line">})); <span class="comment">// [ 2 => 'horse' ]</span></span><br></pre></td></tr></table></figure><h5 id="array-unique-—-移除数组中重复的值"><a href="#array-unique-—-移除数组中重复的值" class="headerlink" title="array_unique — 移除数组中重复的值"></a>array_unique — 移除数组中重复的值</h5><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$input</span> = array(<span class="string">"a"</span> => <span class="string">"green"</span>, <span class="string">"red"</span>, <span class="string">"b"</span> => <span class="string">"green"</span>, <span class="string">"blue"</span>, <span class="string">"red"</span>);</span><br><span class="line"><span class="regexp">//</span> [<span class="number">1</span>] 输入的数组</span><br><span class="line"><span class="regexp">//</span> [<span class="number">2</span>] 排序类型标记:</span><br><span class="line"><span class="regexp">//</span> <span class="number">1</span>. SORT_REGULAR - 按照通常方法比较(不修改类型)</span><br><span class="line"><span class="regexp">//</span> <span class="number">2</span>. SORT_NUMERIC - 按照数字形式比较</span><br><span class="line"><span class="regexp">//</span> <span class="number">3</span>. SORT_STRING - 按照字符串形式比较</span><br><span class="line"><span class="regexp">//</span> <span class="number">4</span>. SORT_LOCALE_STRING - 根据当前的本地化设置,按照字符串比较。</span><br><span class="line"><span class="variable">$result</span> = array_unique(<span class="variable">$input</span>);</span><br><span class="line">print_r(<span class="variable">$result</span>);</span><br><span class="line"><span class="regexp">//</span> [ <span class="string">'a'</span> => <span class="string">'green'</span>, <span class="number">0</span> => <span class="string">'red'</span>, <span class="number">1</span> => <span class="string">'blue'</span> ]</span><br></pre></td></tr></table></figure><h5 id="array-uintersect-—-计算数组的交集,用回调函数比较数据"><a href="#array-uintersect-—-计算数组的交集,用回调函数比较数据" class="headerlink" title="array_uintersect — 计算数组的交集,用回调函数比较数据"></a>array_uintersect — 计算数组的交集,用回调函数比较数据</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_uintersect — 计算数组的交集,用回调函数比较数据</span></span><br><span class="line">$array1 = <span class="keyword">array</span>(<span class="string">"a"</span> => <span class="string">"green"</span>, <span class="string">"b"</span> => <span class="string">"brown"</span>, <span class="string">"c"</span> => <span class="string">"blue"</span>, <span class="string">"red"</span>);</span><br><span class="line">$array2 = <span class="keyword">array</span>(<span class="string">"a"</span> => <span class="string">"GREEN"</span>, <span class="string">"B"</span> => <span class="string">"brown"</span>, <span class="string">"yellow"</span>, <span class="string">"red"</span>);</span><br><span class="line"><span class="comment">// strcasecmp — 二进制安全比较字符串(不区分大小写)</span></span><br><span class="line">print_r(array_uintersect($array1, $array2, <span class="string">"strcasecmp"</span>));</span><br><span class="line"><span class="comment">// [ 'a' => 'green', 'b' => 'brown', 0 => 'red' ]</span></span><br></pre></td></tr></table></figure><h5 id="array-unshift-—-在数组开头插入一个或多个单元"><a href="#array-unshift-—-在数组开头插入一个或多个单元" class="headerlink" title="array_unshift — 在数组开头插入一个或多个单元"></a>array_unshift — 在数组开头插入一个或多个单元</h5><figure class="highlight shell"><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">// array_unshift — 在数组开头插入一个或多个单元</span><br><span class="line"><span class="meta">$</span><span class="bash">queue = array(<span class="string">"orange"</span>, <span class="string">"banana"</span>);</span></span><br><span class="line"><span class="meta">array_unshift($</span><span class="bash">queue, <span class="string">"apple"</span>);</span></span><br><span class="line"><span class="meta">print_r($</span><span class="bash">queue); // [ <span class="string">'apple'</span>, <span class="string">'orange'</span>, <span class="string">'banana'</span> ]</span></span><br></pre></td></tr></table></figure><h5 id="array-values-—-返回数组中所有的值"><a href="#array-values-—-返回数组中所有的值" class="headerlink" title="array_values — 返回数组中所有的值"></a>array_values — 返回数组中所有的值</h5><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></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_values — 返回数组中所有的值</span></span><br><span class="line">$array = <span class="keyword">array</span>(<span class="string">"size"</span> => <span class="string">"XL"</span>, <span class="string">"color"</span> => <span class="string">"gold"</span>);</span><br><span class="line">print_r(array_values($array)); <span class="comment">// [ 0 => 'XL', 1 => 'gold' ]</span></span><br></pre></td></tr></table></figure><h5 id="array-walk-—-使用用户自定义函数对数组中的每个元素做回调处理-成功时返回-TRUE"><a href="#array-walk-—-使用用户自定义函数对数组中的每个元素做回调处理-成功时返回-TRUE" class="headerlink" title="array_walk — 使用用户自定义函数对数组中的每个元素做回调处理,成功时返回 TRUE"></a>array_walk — 使用用户自定义函数对数组中的每个元素做回调处理,成功时返回 TRUE</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// array_walk — 使用用户自定义函数对数组中的每个元素做回调处理,成功时返回 TRUE</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">trim_value</span><span class="params">(&$value, $k, $tmp)</span> </span>{</span><br><span class="line"> var_dump($value, $k, $tmp);</span><br><span class="line"> $value = trim($value);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">$fruit = <span class="keyword">array</span>(<span class="string">'a'</span> => <span class="string">'apple'</span>,<span class="string">'b'</span> => <span class="string">'banana'</span>, <span class="string">'c'</span> => <span class="string">'cranberry '</span>);</span><br><span class="line">$a = array_walk($fruit, <span class="string">'trim_value'</span>, [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]); <span class="comment">// TRUE</span></span><br><span class="line">var_dump($a, $fruit);</span><br><span class="line"><span class="comment">// [ 'a' => 'apple', 'b' => 'banana', 'c' => 'cranberry' ]</span></span><br></pre></td></tr></table></figure><h5 id="asort-—-对数组进行排序并保持索引关系"><a href="#asort-—-对数组进行排序并保持索引关系" class="headerlink" title="asort — 对数组进行排序并保持索引关系"></a>asort — 对数组进行排序并保持索引关系</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// asort — 对数组进行排序并保持索引关系</span></span><br><span class="line">$fruits = <span class="keyword">array</span>(<span class="string">"d"</span> => <span class="string">"lemon"</span>, <span class="string">"a"</span> => <span class="string">"orange"</span>, <span class="string">"b"</span> => <span class="string">"banana"</span>, <span class="string">"c"</span> => <span class="string">"apple"</span>);</span><br><span class="line">asort($fruits);</span><br><span class="line"><span class="keyword">foreach</span> ($fruits <span class="keyword">as</span> $key => $val) {</span><br><span class="line"> <span class="keyword">echo</span> <span class="string">"$key = $val\n"</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">// c = apple</span></span><br><span class="line"><span class="comment">// b = banana</span></span><br><span class="line"><span class="comment">// d = lemon</span></span><br><span class="line"><span class="comment">// a = orange</span></span><br></pre></td></tr></table></figure><h5 id="sort-—-对数组排序"><a href="#sort-—-对数组排序" class="headerlink" title="sort — 对数组排序"></a>sort — 对数组排序</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// sort — 对数组排序</span></span><br><span class="line">$fruits = <span class="keyword">array</span>(</span><br><span class="line"> <span class="string">"Orange1"</span>, <span class="string">"orange2"</span>, <span class="string">"Orange3"</span>, <span class="string">"orange20"</span></span><br><span class="line">);</span><br><span class="line"><span class="comment">// [1] 要排序的数组</span></span><br><span class="line"><span class="comment">// [2] 排序类型标记:</span></span><br><span class="line"><span class="comment">// 1. SORT_REGULAR - 正常比较单元(不改变类型)</span></span><br><span class="line"><span class="comment">// 2. SORT_NUMERIC - 单元被作为数字来比较</span></span><br><span class="line"><span class="comment">// 3. SORT_STRING - 单元被作为字符串来比较</span></span><br><span class="line"><span class="comment">// 4. SORT_LOCALE_STRING - 根据当前的区域(locale)设置来把单元当作字符串比较</span></span><br><span class="line"><span class="comment">// 5. SORT_NATURAL - 和 natsort() 类似对每个单元以“自然的顺序”对字符串进行排序</span></span><br><span class="line"><span class="comment">// 6. SORT_FLAG_CASE - 能够与 SORT_STRING 或 SORT_NATURAL 合并(OR 位运算),不区分大小写排序字符串</span></span><br><span class="line">sort($fruits, SORT_NATURAL | SORT_FLAG_CASE);</span><br><span class="line"><span class="keyword">foreach</span> ($fruits <span class="keyword">as</span> $key => $val) {</span><br><span class="line"> <span class="keyword">echo</span> <span class="string">"fruits["</span> . $key . <span class="string">"] = "</span> . $val . <span class="string">"\n"</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">// fruits[0] = Orange1</span></span><br><span class="line"><span class="comment">// fruits[1] = orange2</span></span><br><span class="line"><span class="comment">// fruits[2] = Orange3</span></span><br><span class="line"><span class="comment">// fruits[3] = orange20</span></span><br></pre></td></tr></table></figure><h5 id="in-array-—-检查数组中是否存在某个值"><a href="#in-array-—-检查数组中是否存在某个值" class="headerlink" title="in_array — 检查数组中是否存在某个值"></a>in_array — 检查数组中是否存在某个值</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// in_array — 检查数组中是否存在某个值</span></span><br><span class="line">$os = <span class="keyword">array</span>(<span class="string">"Mac"</span>, <span class="string">"NT"</span>, <span class="string">"Irix"</span>, <span class="string">"Linux"</span>);</span><br><span class="line"><span class="keyword">if</span> (in_array(<span class="string">"Irix"</span>, $os)) {</span><br><span class="line"> <span class="keyword">echo</span> <span class="string">"Got Irix"</span>;</span><br><span class="line">} <span class="comment">// Got Irix</span></span><br><span class="line"><span class="keyword">if</span> (in_array(<span class="string">"mac"</span>, $os)) {</span><br><span class="line"> <span class="keyword">echo</span> <span class="string">"Got mac"</span>;</span><br><span class="line">} <span class="comment">// in_array() 是区分大小写的</span></span><br><span class="line"></span><br><span class="line">$a = <span class="keyword">array</span>(<span class="string">'1.10'</span>, <span class="number">12.4</span>, <span class="number">1.13</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (in_array(<span class="string">'12.4'</span>, $a, <span class="keyword">true</span>)) {</span><br><span class="line"> <span class="keyword">echo</span> <span class="string">"'12.4' found with strict check\n"</span>;</span><br><span class="line">} <span class="comment">// 严格类型检查例子</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (in_array(<span class="number">1.13</span>, $a, <span class="keyword">true</span>)) {</span><br><span class="line"> <span class="keyword">echo</span> <span class="string">"1.13 found with strict check\n"</span>;</span><br><span class="line">} <span class="comment">// 1.13 found with strict check</span></span><br></pre></td></tr></table></figure><h5 id="ksort-—-对数组按照键名排序"><a href="#ksort-—-对数组按照键名排序" class="headerlink" title="ksort — 对数组按照键名排序"></a>ksort — 对数组按照键名排序</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">$fruits = <span class="keyword">array</span>(<span class="string">"d"</span>=><span class="string">"lemon"</span>, <span class="string">"a"</span>=><span class="string">"orange"</span>, <span class="string">"b"</span>=><span class="string">"banana"</span>, <span class="string">"c"</span>=><span class="string">"apple"</span>);</span><br><span class="line">ksort($fruits);</span><br><span class="line"><span class="keyword">foreach</span> ($fruits <span class="keyword">as</span> $key => $val) {</span><br><span class="line"> <span class="keyword">echo</span> <span class="string">"$key = $val\n"</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">// a = orange</span></span><br><span class="line"><span class="comment">// b = banana</span></span><br><span class="line"><span class="comment">// c = apple</span></span><br><span class="line"><span class="comment">// d = lemon</span></span><br></pre></td></tr></table></figure><h5 id="shuffle-—-打乱数组"><a href="#shuffle-—-打乱数组" class="headerlink" title="shuffle — 打乱数组"></a>shuffle — 打乱数组</h5><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// shuffle — 打乱数组</span></span><br><span class="line">$numbers = range(<span class="number">1</span>, <span class="number">20</span>);</span><br><span class="line"><span class="comment">// 此函数为 array 中的元素赋与新的键名。这将删除原有的键名,而不是仅仅将键名重新排序。</span></span><br><span class="line">shuffle($numbers);</span><br><span class="line"><span class="keyword">foreach</span> ($numbers <span class="keyword">as</span> $number) {</span><br><span class="line"> <span class="keyword">echo</span> <span class="string">"$number "</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<summary type="html">
PHP 数组整理学习
</summary>
<category term="php" scheme="http://blog.jybx.me/categories/php/"/>
<category term="array" scheme="http://blog.jybx.me/categories/php/array/"/>
<category term="php" scheme="http://blog.jybx.me/tags/php/"/>
<category term="array" scheme="http://blog.jybx.me/tags/array/"/>
</entry>
<entry>
<title>carbon</title>
<link href="http://blog.jybx.me/carbon.html"/>
<id>http://blog.jybx.me/carbon.html</id>
<published>2017-05-09T06:15:16.000Z</published>
<updated>2017-12-05T14:16:07.413Z</updated>
<content type="html"><![CDATA[<p>#Carbon 时间处理类</p><blockquote><p>Laravel 项目中的时间处理非常容易,引入 <a href="https://github.com/briannesbitt/Carbon" target="_blank" rel="noopener">Carbon</a> 时间处理类,github 拥有接近 5000 个 star。</p></blockquote><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><figure class="highlight armasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">composer</span> <span class="meta">require</span> nesbot/carbon</span><br></pre></td></tr></table></figure><h2 id="本地化"><a href="#本地化" class="headerlink" title="本地化"></a>本地化</h2><figure class="highlight clean"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">\Carbon\Carbon::setLocale(<span class="string">'zh'</span>);</span><br></pre></td></tr></table></figure><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">use</span> <span class="title">Carbon</span>\<span class="title">Carbon</span>; <span class="comment">// Carbon 类在 Carbon 命名空间中声明</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取当前时间</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now(); <span class="comment">// 2017-04-07 16:32:28</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 今天</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::today(); <span class="comment">// 2017-04-07 00:00:00</span></span><br><span class="line"><span class="comment">// 明天</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::tomorrow(); <span class="comment">// 2017-04-08 00:00:00</span></span><br><span class="line"><span class="comment">// 昨天</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::yesterday(); <span class="comment">// 2017-04-06 00:00:00</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取前一天的开始时间</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->yesterday()->startOfDay(); <span class="comment">// 2017-04-06 00:00:00</span></span><br><span class="line"><span class="comment">// 获取前一天的结束时间</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->yesterday()->endOfDay(); <span class="comment">// 2017-04-06 23:59:59</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//上一周开始时间 (星期一)</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->previous()->startOfWeek(); <span class="comment">// 2017-03-27 00:00:00</span></span><br><span class="line"><span class="comment">// 这周周一</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->startOfWeek(); <span class="comment">// 2017-04-03 00:00:00</span></span><br><span class="line"><span class="comment">//上一周结束时间 (星期天)</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->previous()->endOfWeek(); <span class="comment">// 2017-04-02 23:59:59</span></span><br><span class="line"><span class="comment">// 这周周天</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->endOfWeek(); <span class="comment">// 2017-04-09 23:59:59</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//获取上一月的开始时间</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->subMonth(<span class="number">1</span>)->startOfMonth(); <span class="comment">// 2017-03-01 00:00:00</span></span><br><span class="line"><span class="comment">// 获取上一月的结束时间</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->subMonth(<span class="number">1</span>)->endOfMonth(); <span class="comment">// 2017-03-31 23:59:59</span></span><br><span class="line"><span class="comment">// 这个月的第一天开始时间</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->startOfMonth(); <span class="comment">// 2017-04-01 00:00:00</span></span><br><span class="line"><span class="comment">// 这个月的最后一天结束时间</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->endOfMonth(); <span class="comment">// 2017-04-30 23:59:59</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取上一年的开始时间</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->subYear(<span class="number">1</span>)->startOfYear(); <span class="comment">// 2016-01-01 00:00:00</span></span><br><span class="line"><span class="comment">// 今年开始时间</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->startOfYear(); <span class="comment">// 2017-01-01 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->lastOfYear()->startOfYear(); <span class="comment">// 2017-01-01 00:00:00</span></span><br><span class="line"><span class="comment">// 获取上一年的结束时间</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->subYear(<span class="number">1</span>)->endOfYear(); <span class="comment">// 2016-12-31 23:59:59</span></span><br><span class="line"><span class="comment">// 今年结束时间</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->endOfYear(); <span class="comment">// 2017-12-31 23:59:59</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->lastOfYear()->endOfYear(); <span class="comment">// 2017-12-31 23:59:59</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取当前时间的固定格式</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->format(<span class="string">'Y-m-d'</span>); <span class="comment">// 2017-04-07</span></span><br><span class="line"><span class="comment">// 几号</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->day; <span class="comment">// 7</span></span><br><span class="line"><span class="comment">// 几月</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->month; <span class="comment">// 4</span></span><br><span class="line"><span class="comment">// 年</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->year; <span class="comment">// 2017</span></span><br><span class="line"><span class="comment">// 小时</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->hour;</span><br><span class="line"><span class="comment">// 分钟</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->minute;</span><br><span class="line"><span class="comment">// 上周的今天是星期几</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->dayOfWeek; <span class="comment">// 5</span></span><br><span class="line"><span class="comment">// 今天是365天中的第几天</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->dayOfYear; <span class="comment">// 96</span></span><br><span class="line"><span class="comment">// 这个月中的第几周</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->weekOfMonth; <span class="comment">// 1</span></span><br><span class="line"><span class="comment">// 年中的第几周</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->weekOfYear; <span class="comment">// 14</span></span><br><span class="line"><span class="comment">// 季度</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->quarter; <span class="comment">// 2</span></span><br><span class="line"><span class="comment">// 几岁</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::createFromDate(<span class="number">1991</span>, <span class="number">5</span>, <span class="number">21</span>)->age; <span class="comment">// 25</span></span><br><span class="line"><span class="comment">// 这个月有几天</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->daysInMonth; <span class="comment">// 30</span></span><br><span class="line"></span><br><span class="line">var_dump(<span class="keyword">isset</span>(Carbon::now()->hour)); <span class="comment">// bool(true)</span></span><br><span class="line">var_dump(<span class="keyword">empty</span>(Carbon::now()->year)); <span class="comment">// bool(false)</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->year(<span class="number">2017</span>)->month(<span class="number">5</span>)->day(<span class="number">21</span>)->hour(<span class="number">22</span>)->minute(<span class="number">32</span>)->second(<span class="number">5</span>)->toDateTimeString(); <span class="comment">// 2017-05-21 22:32:05</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->setDate(<span class="number">2017</span>, <span class="number">5</span>, <span class="number">21</span>)->setTime(<span class="number">22</span>, <span class="number">32</span>, <span class="number">5</span>)->toDateTimeString(); <span class="comment">// 2017-05-21 22:32:05</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->setDateTime(<span class="number">2017</span>, <span class="number">5</span>, <span class="number">21</span>, <span class="number">22</span>, <span class="number">32</span>, <span class="number">5</span>)->toDateTimeString(); <span class="comment">// 2017-05-21 22:32:05</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 日期解析</span></span><br><span class="line"><span class="keyword">echo</span> <span class="keyword">new</span> Carbon(<span class="string">'now'</span>);</span><br><span class="line"><span class="keyword">echo</span> Carbon::parse(<span class="string">'now'</span>); <span class="comment">// 2017-04-07 17:54:35</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::parse(<span class="string">'today'</span>); <span class="comment">// 2017-04-07 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::parse(<span class="string">'yesterday'</span>); <span class="comment">// 2017-04-06 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::parse(<span class="string">'2 days ago'</span>); <span class="comment">// 2017-04-05 17:56:28</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::parse(<span class="string">'+3 days'</span>); <span class="comment">// 2017-04-10 17:57:14</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::parse(<span class="string">'-3 days'</span>); <span class="comment">// 2017-04-04 17:57:37</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::parse(<span class="string">'+2 weeks'</span>); <span class="comment">// 2017-04-21 17:58:05</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::parse(<span class="string">'+4 months'</span>); <span class="comment">// 2017-08-07 17:58:32</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::parse(<span class="string">'-1 year'</span>); <span class="comment">// 2016-04-07 17:58:56</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::parse(<span class="string">'next wednesday'</span>); <span class="comment">// 2017-04-12 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::parse(<span class="string">'last friday'</span>); <span class="comment">// 2017-03-31 00:00:00</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 将carbon对象转换成string类型</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::createFromTimestamp(<span class="number">-1</span>)->toDateTimeString(); <span class="comment">// 1970-01-01 07:59:59</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->toDateString(); <span class="comment">// 2017-04-07</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->toDateTimeString(); <span class="comment">// 2017-04-07 16:53:28</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->toFormattedDateString(); <span class="comment">// Apr 7, 2017</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->toTimeString(); <span class="comment">// 18:04:00</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->toDayDateTimeString(); <span class="comment">// Fri, Apr 7, 2017 6:04 PM</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 获取当前时间的时间戳</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->timestamp; <span class="comment">// 1491554091</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->timestamp(<span class="number">1491554091</span>)->toDateTimeString(); <span class="comment">// 2017-04-07 16:34:51</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 设置当前地区的时区</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->timezone(<span class="string">'Asia/Shanghai'</span>); <span class="comment">// 2017-04-07 16:35:35</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 直接使用字符串</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now(<span class="string">'Europe/London'</span>); <span class="comment">// 2017-04-07 09:36:41</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// createFromDate()将默认的时间到现在。 createFromTime()将日期默认为今天。</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::createFromDate(<span class="number">2018</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="string">'Europe/London'</span>); <span class="comment">// 2018-01-01 16:39:40</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::createFromFormat(<span class="string">'Y-m-d H'</span>, <span class="string">'1975-05-21 22'</span>)->toDateTimeString(); <span class="comment">// 1975-05-21 22:00:00</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::createFromFormat(<span class="string">'Y-m-d H'</span>, <span class="string">'1975-05-21 22'</span>); <span class="comment">// 1975-05-21 22:00:00</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// create()将默认任何null参数到当前相应的值</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::create(<span class="number">2000</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>); <span class="comment">// 2000-01-01 00:00:00</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 日期比较</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->tzName; <span class="comment">// PRC</span></span><br><span class="line">$first = Carbon::create(<span class="number">2017</span>, <span class="number">4</span>, <span class="number">10</span>, <span class="number">11</span>, <span class="number">26</span>, <span class="number">30</span>);</span><br><span class="line">$second = Carbon::create(<span class="number">2017</span>, <span class="number">4</span>, <span class="number">10</span>, <span class="number">11</span>, <span class="number">26</span>, <span class="number">30</span>, <span class="string">'Asia/Shanghai'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> $first->toDateTimeString(); <span class="comment">// 2017-04-10 11:26:30</span></span><br><span class="line"><span class="keyword">echo</span> $first->tzName; <span class="comment">// PRC</span></span><br><span class="line"><span class="keyword">echo</span> $second->toDateTimeString(); <span class="comment">// 2017-04-10 11:26:30</span></span><br><span class="line"><span class="keyword">echo</span> $second->tzName; <span class="comment">// Asia/Shanghai</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 判断两个日期是否相等</span></span><br><span class="line">var_dump($first->eq($second)); <span class="comment">// bool(true)</span></span><br><span class="line"><span class="comment">// 判断第一个日期是否不等于第二个日期</span></span><br><span class="line">var_dump($first->ne($second)); <span class="comment">// bool(false)</span></span><br><span class="line"><span class="comment">// 判断第一个日期是否比第二个日期大</span></span><br><span class="line">var_dump($first->gt($second)); <span class="comment">// bool(false)</span></span><br><span class="line"><span class="comment">// 判断第一个日期是否大于等于第二个日期</span></span><br><span class="line">var_dump($first->gte($second)); <span class="comment">// bool(true)</span></span><br><span class="line"><span class="comment">// 判断第一个日期是否比第二个日期小</span></span><br><span class="line">var_dump($first->lt($second)); <span class="comment">// bool(false)</span></span><br><span class="line"><span class="comment">// 判断第一个日期是否小于等于第二个日期</span></span><br><span class="line">var_dump($first->lte($second)); <span class="comment">// bool(true)</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 设置日期和时间</span></span><br><span class="line">$first->setDateTime(<span class="number">2017</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">$second->setDateTime(<span class="number">2017</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line">var_dump($first->eq($second)); <span class="comment">// bool(true)</span></span><br><span class="line">var_dump($first->ne($second)); <span class="comment">// bool(false)</span></span><br><span class="line">var_dump($first->gt($second)); <span class="comment">// bool(false)</span></span><br><span class="line">var_dump($first->gte($second)); <span class="comment">// bool(true)</span></span><br><span class="line">var_dump($first->lt($second)); <span class="comment">// bool(false)</span></span><br><span class="line">var_dump($first->lte($second)); <span class="comment">// bool(true)</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 要判断一个日期是否介于两个日期之间,可以使用 between() 方法,第三个可选参数指定比较是否可以相等,默认为 true</span></span><br><span class="line">$first = Carbon::create(<span class="number">2012</span>, <span class="number">9</span>, <span class="number">5</span>, <span class="number">1</span>);</span><br><span class="line">$second = Carbon::create(<span class="number">2012</span>, <span class="number">9</span>, <span class="number">5</span>, <span class="number">5</span>);</span><br><span class="line">var_dump(Carbon::create(<span class="number">2012</span>, <span class="number">9</span>, <span class="number">5</span>, <span class="number">3</span>)->between($first, $second)); <span class="comment">// bool(true)</span></span><br><span class="line">var_dump(Carbon::create(<span class="number">2012</span>, <span class="number">9</span>, <span class="number">5</span>, <span class="number">5</span>)->between($first, $second)); <span class="comment">// bool(true)</span></span><br><span class="line">var_dump(Carbon::create(<span class="number">2012</span>, <span class="number">9</span>, <span class="number">5</span>, <span class="number">5</span>)->between($first, $second, <span class="keyword">false</span>)); <span class="comment">// bool(false)</span></span><br><span class="line"></span><br><span class="line">$dt1 = Carbon::create(<span class="number">2012</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">$dt2 = Carbon::create(<span class="number">2014</span>, <span class="number">1</span>, <span class="number">30</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line"><span class="comment">// 返回最小日期</span></span><br><span class="line"><span class="keyword">echo</span> $dt1->min($dt2); <span class="comment">// 2012-01-01 00:00:00</span></span><br><span class="line"></span><br><span class="line">$dt1 = Carbon::create(<span class="number">2012</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line">$dt2 = Carbon::create(<span class="number">2014</span>, <span class="number">1</span>, <span class="number">30</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line"><span class="comment">// 返回最大日期</span></span><br><span class="line"><span class="keyword">echo</span> $dt1->max($dt2); <span class="comment">// 2014-01-30 00:00:00</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// now is the default param</span></span><br><span class="line">$dt1 = Carbon::create(<span class="number">2000</span>, <span class="number">1</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>);</span><br><span class="line"><span class="keyword">echo</span> $dt1->max(); <span class="comment">// 2017-04-10 11:51:23</span></span><br><span class="line"></span><br><span class="line">$dt = Carbon::now();</span><br><span class="line"></span><br><span class="line"><span class="comment">// 确定实例是一个工作日</span></span><br><span class="line">$dt->isWeekday();</span><br><span class="line"><span class="comment">// 确定实例是周末的一天</span></span><br><span class="line">$dt->isWeekend();</span><br><span class="line">$dt->isYesterday();</span><br><span class="line">$dt->isToday();</span><br><span class="line">$dt->isTomorrow();</span><br><span class="line"><span class="comment">// 是否比现在的时间大</span></span><br><span class="line">$dt->isFuture();</span><br><span class="line"><span class="comment">// 是否比现在的时间小</span></span><br><span class="line">$dt->isPast();</span><br><span class="line"><span class="comment">// 确定实例是闰年</span></span><br><span class="line">$dt->isLeapYear();</span><br><span class="line"><span class="comment">// 检查传入日期是同一天的当前实例</span></span><br><span class="line">$dt->isSameDay(Carbon::now());</span><br><span class="line">$born = Carbon::createFromDate(<span class="number">1987</span>, <span class="number">4</span>, <span class="number">23</span>);</span><br><span class="line">$noCake = Carbon::createFromDate(<span class="number">2014</span>, <span class="number">9</span>, <span class="number">26</span>);</span><br><span class="line">$yesCake = Carbon::createFromDate(<span class="number">2014</span>, <span class="number">4</span>, <span class="number">23</span>);</span><br><span class="line">$overTheHill = Carbon::now()->subYears(<span class="number">50</span>);</span><br><span class="line"><span class="comment">// 检查它的生日。比较两个日期的日期</span></span><br><span class="line">var_dump($born->isBirthday($noCake)); <span class="comment">// bool(false)</span></span><br><span class="line">var_dump($born->isBirthday($yesCake)); <span class="comment">// bool(true)</span></span><br><span class="line">var_dump($overTheHill->isBirthday()); <span class="comment">// bool(true) -> default compare it to today!</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 日期操作</span></span><br><span class="line"><span class="comment">// add(增加), sub(减去)</span></span><br><span class="line">$dt = Carbon::create(<span class="number">2017</span>, <span class="number">4</span>, <span class="number">10</span>, <span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> $dt->toDateTimeString(); <span class="comment">// 2017-04-10 00:00:00</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> $dt->addYears(<span class="number">5</span>); <span class="comment">// 2022-04-10 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->addYear(); <span class="comment">// 2023-04-10 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->subYear(); <span class="comment">// 2022-04-10 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->subYears(<span class="number">5</span>); <span class="comment">// 2017-04-10 00:00:00</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> $dt->addMonths(<span class="number">6</span>); <span class="comment">// 2017-10-10 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->addMonth(); <span class="comment">// 2017-11-10 00:00:00 equivalent of $dt->month($dt->month + 1); so it wraps</span></span><br><span class="line"><span class="keyword">echo</span> $dt->subMonth(); <span class="comment">// 2017-10-10 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->subMonths(<span class="number">6</span>); <span class="comment">// 2017-04-10 00:00:00</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> $dt->addDays(<span class="number">5</span>); <span class="comment">// 2017-04-15 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->addDay(); <span class="comment">// 2017-04-16 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->subDay(); <span class="comment">// 2017-04-15 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->subDays(<span class="number">5</span>); <span class="comment">// 2017-04-10 00:00:00</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> $dt->addWeekdays(<span class="number">4</span>); <span class="comment">// 2017-04-14 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->addWeekday(); <span class="comment">// 2017-04-17 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->subWeekday(); <span class="comment">// 2017-04-14 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->subWeekdays(<span class="number">4</span>); <span class="comment">// 2017-04-10 00:00:00</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> $dt->addWeeks(<span class="number">1</span>); <span class="comment">// 2017-04-17 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->addWeek(); <span class="comment">// 2017-04-24 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->subWeek(); <span class="comment">// 2017-04-17 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->subWeeks(<span class="number">1</span>); <span class="comment">// 2017-04-10 00:00:00</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> $dt->addHours(<span class="number">24</span>); <span class="comment">// 2017-04-11 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->addHour(); <span class="comment">// 2017-04-11 01:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->subHour(); <span class="comment">// 2017-04-11 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->subHours(<span class="number">24</span>); <span class="comment">// 2017-04-10 00:00:00</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> $dt->addMinutes(<span class="number">61</span>); <span class="comment">// 2017-04-10 01:01:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->addMinute(); <span class="comment">// 2017-04-10 01:02:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->subMinute(); <span class="comment">// 2017-04-10 01:01:00</span></span><br><span class="line"><span class="keyword">echo</span> $dt->subMinutes(<span class="number">61</span>); <span class="comment">// 2017-04-10 00:00:00</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> $dt->addSeconds(<span class="number">61</span>); <span class="comment">// 2017-04-10 00:01:01</span></span><br><span class="line"><span class="keyword">echo</span> $dt->addSecond(); <span class="comment">// 2017-04-10 00:01:02</span></span><br><span class="line"><span class="keyword">echo</span> $dt->subSecond(); <span class="comment">// 2017-04-10 00:01:01</span></span><br><span class="line"><span class="keyword">echo</span> $dt->subSeconds(<span class="number">61</span>); <span class="comment">// 2017-04-10 00:00:00</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// modify 方法,参数格式为 + 或 - 跟上值及单位</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->modify(<span class="string">'+15 days'</span>); <span class="comment">// 2017-04-25 12:26:02</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->modify(<span class="string">'-2 days'</span>); <span class="comment">// 2017-04-08 12:26:02</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->modify(<span class="string">'-2 day'</span>); <span class="comment">// 2017-04-08 12:28:31</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->modify(<span class="string">'-2 weekday'</span>); <span class="comment">// 2017-04-06 00:00:00</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->modify(<span class="string">'-2 month'</span>); <span class="comment">// 2017-02-10 12:29:36</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->modify(<span class="string">'-2 year'</span>); <span class="comment">// 2015-04-10 12:31:13</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->modify(<span class="string">'-2 week'</span>); <span class="comment">// 2017-03-27 12:31:13</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->modify(<span class="string">'-2 hour'</span>); <span class="comment">// 2017-04-10 10:31:13</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->modify(<span class="string">'-2 minute'</span>); <span class="comment">// 2017-04-10 12:29:13</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->modify(<span class="string">'-2 second'</span>); <span class="comment">// 2017-04-10 12:31:11</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->subDays(<span class="number">5</span>)->diffForHumans(); <span class="comment">// 5天前</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->diffForHumans(Carbon::now()->subYear()); <span class="comment">// 1年后</span></span><br><span class="line"></span><br><span class="line">$dt = Carbon::createFromDate(<span class="number">2017</span>, <span class="number">4</span>, <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> $dt->diffForHumans($dt->copy()->addMonth()); <span class="comment">// 1月前</span></span><br><span class="line"><span class="keyword">echo</span> $dt->diffForHumans($dt->copy()->subMonth()); <span class="comment">// 1月后</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->addSeconds(<span class="number">5</span>)->diffForHumans(); <span class="comment">// 距现在5秒</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->subDays(<span class="number">24</span>)->diffForHumans(); <span class="comment">// 3周前</span></span><br><span class="line"><span class="keyword">echo</span> Carbon::now()->subDays(<span class="number">24</span>)->diffForHumans(<span class="keyword">null</span>, <span class="keyword">true</span>); <span class="comment">// 3周</span></span><br><span class="line"> </span><br><span class="line">$dt = Carbon::now();</span><br><span class="line"><span class="comment">// 年的差异</span></span><br><span class="line"><span class="keyword">echo</span> $dt->diffInYears($dt->copy()->addYear(<span class="number">2</span>)); <span class="comment">// 2</span></span><br><span class="line"><span class="keyword">echo</span> $dt->diffInMonths(); <span class="comment">// 0</span></span><br><span class="line"><span class="keyword">echo</span> $dt->diffInMinutes(); <span class="comment">// 0</span></span><br></pre></td></tr></table></figure><h2 id="学习参考"><a href="#学习参考" class="headerlink" title="学习参考"></a>学习参考</h2><p><a href="http://carbon.nesbot.com/docs/" target="_blank" rel="noopener">官方文档</a><br><a href="http://9iphp.com/web/laravel/php-datetime-package-carbon.html" target="_blank" rel="noopener">Carbon</a></p>]]></content>
<summary type="html">
Carbon 时间处理类
</summary>
<category term="carbon" scheme="http://blog.jybx.me/categories/carbon/"/>
<category term="carbon" scheme="http://blog.jybx.me/tags/carbon/"/>
</entry>
<entry>
<title>lnmp</title>
<link href="http://blog.jybx.me/lnmp.html"/>
<id>http://blog.jybx.me/lnmp.html</id>
<published>2017-05-05T03:25:25.000Z</published>
<updated>2017-12-05T14:03:33.545Z</updated>
<content type="html"><![CDATA[<h1 id="Centos-7-下安装-LNMP-官方最新版"><a href="#Centos-7-下安装-LNMP-官方最新版" class="headerlink" title="Centos 7 下安装 LNMP 官方最新版"></a>Centos 7 下安装 LNMP 官方最新版</h1><h2 id="软件版本"><a href="#软件版本" class="headerlink" title="软件版本"></a>软件版本</h2><blockquote><p>Nginx 版本: nginx 1.13.0<br>Mysql 版本:mysql 5.7.18<br>PHP 版本:php 7.1.5</p><p>查看 CentOS 版本号<br>cat /etc/redhat-release</p><p>Centos 版本:CentOS Linux release >7.3.1611 (Core) 64位</p></blockquote><h3 id="软件更新"><a href="#软件更新" class="headerlink" title="软件更新"></a>软件更新</h3><p>阿里云 ECS 不建议升级服务器的内核和操作系统版本,所以,在进行系统软件更新操作时,应该将其剔除。</p><p>下面是查看服务器内核及系统版本,可以看一下在软件升级前后,剔除与否的区别。</p><figure class="highlight livecodeserver"><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">uname -<span class="keyword">a</span></span><br><span class="line">lsb_release -<span class="keyword">a</span></span><br></pre></td></tr></table></figure><p>首先打开 /etc/yum.conf (vi /etc/yum.conf )文件,然后在 [main] 后面加入以下两行代码,这样在软件更新时,就不会升级内核及系统版本了。</p><figure class="highlight ini"><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="attr">exclude</span>=kernel*</span><br><span class="line"><span class="attr">exclude</span>=centos-release*</span><br></pre></td></tr></table></figure><p>然后更新软件,-y 参数是在执行过程中,遇到的交互默认选择 yes ,如果想看一下软件的更新信息,可以去掉 -y 参数。</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">yum -y update</span></span><br></pre></td></tr></table></figure><h3 id="主机名修改"><a href="#主机名修改" class="headerlink" title="主机名修改"></a>主机名修改</h3><p>查看主机名指令</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">hostname</span></span><br></pre></td></tr></table></figure><p>阿里云 ECS 默认的主机名是随机生成的,看着不是特别舒服,可以修改 /etc/hostname 文件,将现在的主机名改成自己想要的名称。</p><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">vim</span> /etc/<span class="built_in">hostname</span></span><br></pre></td></tr></table></figure><p>然后,按 ESC 输入 :wq 保存(vim 基本指令)。reboot(重启),看一下主机名是否已经变更。</p><h3 id="配置第三方-yum-源"><a href="#配置第三方-yum-源" class="headerlink" title="配置第三方 yum 源"></a>配置第三方 yum 源</h3><p>安装 centos7 的源</p><figure class="highlight sql"><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">yum <span class="keyword">install</span> epel-<span class="keyword">release</span></span><br><span class="line">rpm -ivh <span class="keyword">http</span>://rpms.famillecollet.com/<span class="keyword">enterprise</span>/remi-<span class="keyword">release</span><span class="number">-7.</span>rpm</span><br></pre></td></tr></table></figure><h3 id="Nginx-安装"><a href="#Nginx-安装" class="headerlink" title="Nginx 安装"></a>Nginx 安装</h3><figure class="highlight cmake"><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">yum -y <span class="keyword">install</span> nginx</span><br><span class="line">nginx -v</span><br></pre></td></tr></table></figure><h3 id="使用-service-命令-操作-Nginx"><a href="#使用-service-命令-操作-Nginx" class="headerlink" title="使用 service 命令 操作 Nginx"></a>使用 service 命令 操作 Nginx</h3><figure class="highlight livecodeserver"><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">service nginx <span class="built_in">start</span> <span class="comment"> //启动</span></span><br><span class="line">service nginx <span class="built_in">stop</span> <span class="comment"> //停止</span></span><br><span class="line">service nginx restart <span class="comment"> //重启</span></span><br><span class="line">service nginx reload <span class="comment"> //重新加载配置文件</span></span><br></pre></td></tr></table></figure><h3 id="Nginx-随开机自动启动"><a href="#Nginx-随开机自动启动" class="headerlink" title="Nginx 随开机自动启动"></a>Nginx 随开机自动启动</h3><figure class="highlight crystal"><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">systemctl enable nginx</span><br><span class="line"></span><br><span class="line">结果如下</span><br><span class="line">Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/<span class="class"><span class="keyword">lib</span>/<span class="title">systemd</span>/<span class="title">system</span>/<span class="title">nginx</span>.<span class="title">service</span>.</span></span><br></pre></td></tr></table></figure><h3 id="Centos7-启动服务命令(启动-Nginx)"><a href="#Centos7-启动服务命令(启动-Nginx)" class="headerlink" title="Centos7 启动服务命令(启动 Nginx)"></a>Centos7 启动服务命令(启动 Nginx)</h3><figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl <span class="literal">start</span> nginx</span><br></pre></td></tr></table></figure><h3 id="查看-Nignx-状态"><a href="#查看-Nignx-状态" class="headerlink" title="查看 Nignx 状态"></a>查看 Nignx 状态</h3><figure class="highlight groovy"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">systemctl status nginx</span><br><span class="line"></span><br><span class="line">结果如下</span><br><span class="line">nginx.service - nginx - high performance web server</span><br><span class="line"><span class="symbol"> Loaded:</span> loaded (<span class="regexp">/usr/</span>lib<span class="regexp">/systemd/</span>system/nginx.service; enabled; vendor <span class="string">preset:</span> disabled)</span><br><span class="line"><span class="symbol"> Active:</span> active (running) since Fri <span class="number">2017</span><span class="number">-05</span><span class="number">-12</span> <span class="number">17</span>:<span class="number">35</span>:<span class="number">13</span> CST; <span class="number">50</span>s ago</span><br><span class="line"><span class="symbol"> Docs:</span> <span class="string">http:</span><span class="comment">//nginx.org/en/docs/</span></span><br><span class="line"><span class="symbol"> Process:</span> <span class="number">22179</span> ExecStart=<span class="regexp">/usr/</span>sbin<span class="regexp">/nginx -c /</span>etc<span class="regexp">/nginx/</span>nginx.conf (code=exited, status=<span class="number">0</span>/SUCCESS)</span><br><span class="line"><span class="symbol"> Process:</span> <span class="number">22178</span> ExecStartPre=<span class="regexp">/usr/</span>sbin<span class="regexp">/nginx -t -c /</span>etc<span class="regexp">/nginx/</span>nginx.conf (code=exited, status=<span class="number">0</span>/SUCCESS)</span><br><span class="line"> Main <span class="string">PID:</span> <span class="number">22182</span> (nginx)</span><br><span class="line"><span class="symbol"> CGroup:</span> <span class="regexp">/system.slice/</span>nginx.service</span><br><span class="line"> ├─<span class="number">22182</span> <span class="string">nginx:</span> master process <span class="regexp">/usr/</span>sbin<span class="regexp">/nginx -c /</span>etc<span class="regexp">/nginx/</span>nginx.conf</span><br><span class="line"> └─<span class="number">22183</span> <span class="string">nginx:</span> worker process</span><br><span class="line"></span><br><span class="line">May <span class="number">12</span> <span class="number">17</span>:<span class="number">35</span>:<span class="number">13</span> iZ2zehs5ueqrbkxhzynwasZ systemd[<span class="number">1</span>]: Starting nginx - high performance web.....</span><br><span class="line">May <span class="number">12</span> <span class="number">17</span>:<span class="number">35</span>:<span class="number">13</span> iZ2zehs5ueqrbkxhzynwasZ nginx[<span class="number">22178</span>]: <span class="string">nginx:</span> the configuration file <span class="regexp">/etc/</span>n...k</span><br><span class="line">May <span class="number">12</span> <span class="number">17</span>:<span class="number">35</span>:<span class="number">13</span> iZ2zehs5ueqrbkxhzynwasZ nginx[<span class="number">22178</span>]: <span class="string">nginx:</span> configuration file <span class="regexp">/etc/</span>nginx...l</span><br><span class="line">May <span class="number">12</span> <span class="number">17</span>:<span class="number">35</span>:<span class="number">13</span> iZ2zehs5ueqrbkxhzynwasZ systemd[<span class="number">1</span>]: Failed to read PID from file <span class="regexp">/run/</span>ngi...nt</span><br><span class="line">May <span class="number">12</span> <span class="number">17</span>:<span class="number">35</span>:<span class="number">13</span> iZ2zehs5ueqrbkxhzynwasZ systemd[<span class="number">1</span>]: Started nginx - high performance web ...r.</span><br><span class="line"><span class="string">Hint:</span> Some lines were ellipsized, use -l to show <span class="keyword">in</span> full.</span><br></pre></td></tr></table></figure><h3 id="防火墙配置"><a href="#防火墙配置" class="headerlink" title="防火墙配置"></a>防火墙配置</h3><p>如果上述步骤结束后,没有看到欢迎页面,可能是防火墙配置造成的(80端口没有开放),Centos7 默认的防火墙是 FirewallD。</p><p>查看防火墙运行状态</p><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">firewall-<span class="keyword">cmd</span><span class="bash"> --state</span></span><br></pre></td></tr></table></figure><p>开启 FirewallD 服务</p><figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl <span class="literal">start</span> firewalld</span><br></pre></td></tr></table></figure><p>查看 FirewallD 状态</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">systemctl status firewalld</span></span><br></pre></td></tr></table></figure><p>查看 FirewallD 配置</p><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">firewall-<span class="keyword">cmd</span><span class="bash"> --list-all</span></span><br></pre></td></tr></table></figure><p>开启端口</p><figure class="highlight routeros"><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">firewall-cmd <span class="attribute">--zone</span>=public <span class="attribute">--add-port</span>=80/tcp --permanent</span><br><span class="line">firewall-cmd <span class="attribute">--zone</span>=public <span class="attribute">--add-port</span>=3306/tcp --permanent</span><br></pre></td></tr></table></figure><p>命令含义</p><figure class="highlight haml"><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="ruby">-zone <span class="comment">#作用域</span></span></span><br><span class="line"><span class="ruby"></span></span><br><span class="line"><span class="ruby">--add-port=<span class="number">80</span>/tcp <span class="comment">#添加端口,格式为:端口/通讯协议</span></span></span><br><span class="line"><span class="ruby"></span></span><br><span class="line"><span class="ruby">--permanent <span class="comment">#永久生效,没有此参数重启后失效</span></span></span><br></pre></td></tr></table></figure><p>重启防火墙</p><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">firewall-<span class="keyword">cmd</span><span class="bash"> --reload</span></span><br></pre></td></tr></table></figure><h3 id="MySQL-最新版安装"><a href="#MySQL-最新版安装" class="headerlink" title="MySQL 最新版安装"></a>MySQL 最新版安装</h3><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">rpm -Uvh http://dev.mysql.com/get/mysql57-community-<span class="keyword">release</span>-el7<span class="number">-7.</span>noarch.rpm</span><br><span class="line"></span><br><span class="line">yum -y <span class="keyword">install</span> mysql-community-<span class="keyword">server</span> mysql-community-devel</span><br></pre></td></tr></table></figure><p>MySQL 安装完成后配置文件会在这个路径 /etc/my.cnf 可以根据实际需要修改里边的选项。这里暂时不做任何修改,但有个选项是要注意的,因为后面配置 PHP 的时候讲会用到:</p><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">grep</span> socket <span class="regexp">/etc/my</span>.cnf</span><br><span class="line"></span><br><span class="line">结果如下</span><br><span class="line">socket=<span class="regexp">/var/</span>lib<span class="regexp">/mysql/my</span>sql.sock</span><br></pre></td></tr></table></figure><h3 id="查看-MySQL-状态"><a href="#查看-MySQL-状态" class="headerlink" title="查看 MySQL 状态"></a>查看 MySQL 状态</h3><figure class="highlight dts"><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">systemctl status mysqld</span><br><span class="line"></span><br><span class="line">结果如下</span><br><span class="line">mysqld.service - MySQL Server</span><br><span class="line"><span class="symbol"> Loaded:</span> loaded (<span class="meta-keyword">/usr/</span>lib<span class="meta-keyword">/systemd/</span>system/mysqld.service; enabled; vendor preset: disabled)</span><br><span class="line"><span class="symbol"> Active:</span> inactive (dead)</span><br><span class="line"><span class="symbol"> Docs:</span> man:mysqld(<span class="number">8</span>)</span><br><span class="line"><span class="symbol"> http:</span><span class="comment">//dev.mysql.com/doc/refman/en/using-systemd.html</span></span><br></pre></td></tr></table></figure><h3 id="Mysql-添加到开机启动项"><a href="#Mysql-添加到开机启动项" class="headerlink" title="Mysql 添加到开机启动项"></a>Mysql 添加到开机启动项</h3><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl <span class="builtin-name">enable</span> mysqld</span><br></pre></td></tr></table></figure><h3 id="启动-MySQL"><a href="#启动-MySQL" class="headerlink" title="启动 MySQL"></a>启动 MySQL</h3><figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl <span class="literal">start</span> mysqld</span><br></pre></td></tr></table></figure><p>MySQL 5.7 和之前版本很大区别是在安装后会自动为 root@localhost 用户设置一个随机初始密码,之前的版本密码为空的。那如何找到这个初始密码呢?网上很多文章说初始密码在这个文件中 /root/.mysql_secret 我不清楚早前的版本是不是这样,但 MySQL 5.7.11 并不然,而是保持到 error log 文件中。可以通过下面方法找到 MySQL 5.7 root 的初始密码</p><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">grep</span> <span class="string">'temporary password'</span> /var/<span class="built_in">log</span>/mysqld.<span class="built_in">log</span></span><br><span class="line"></span><br><span class="line">结果如下</span><br><span class="line"><span class="number">2017</span>-<span class="number">05</span>-<span class="number">12</span>T09:<span class="number">41</span>:<span class="number">44.686145</span>Z <span class="number">1</span> [Note] A temporary password <span class="keyword">is</span> generated <span class="keyword">for</span> root@localhos<span class="variable">t:</span> U4ygpaZyy(<span class="keyword">up</span></span><br></pre></td></tr></table></figure><p>其中 U4ygpaZyy(up 就是密码。现在立即用这个密码登录 MySQL 并且修改密码(MySQL 5.7 版本对密码的安全性要求很严格,必须至少包含1个大写字母、1个小写字母、1个数字和1个特殊字符,长度不得小于8个字符)</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><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="keyword">ALTER</span> <span class="keyword">USER</span> <span class="string">'root'</span>@<span class="string">'localhost'</span> <span class="keyword">IDENTIFIED</span> <span class="keyword">BY</span> <span class="string">'Aliyun2017.'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">update</span> mysql.user <span class="keyword">set</span> Host=<span class="string">'%'</span> <span class="keyword">where</span> HOST=<span class="string">'localhost'</span> <span class="keyword">and</span> <span class="keyword">User</span>=<span class="string">'root'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">flush</span> <span class="keyword">privileges</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">SELECT</span> <span class="keyword">DISTINCT</span> <span class="keyword">CONCAT</span>(<span class="string">'User: '''</span>,<span class="keyword">user</span>,<span class="string">'''@'''</span>,host,<span class="string">''';'</span>) <span class="keyword">AS</span> <span class="keyword">query</span> <span class="keyword">FROM</span> mysql.user;</span><br><span class="line"></span><br><span class="line">quit</span><br></pre></td></tr></table></figure><p>mysql5.7 重置密码使用这个语句</p><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">update</span> mysql.user <span class="keyword">set</span> authentication_string=<span class="keyword">password</span>(<span class="string">'abcabc'</span>) <span class="keyword">where</span> <span class="keyword">user</span>=<span class="string">'root'</span> <span class="keyword">and</span> Host = <span class="string">'localhost'</span>;</span><br></pre></td></tr></table></figure><p>ps:如果 mysql 授权远程访问之后,访问还是失败。可能是由于防火墙和 selinux 没有关闭到底。<br>Centos7 关闭防火墙和 selinux 命令如下:</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><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">systemctl disable firewalld<span class="selector-class">.service</span> </span><br><span class="line"></span><br><span class="line">systemctl stop firewalld<span class="selector-class">.service</span> </span><br><span class="line"></span><br><span class="line">sed -<span class="selector-tag">i</span> <span class="string">'s/SELINUX=enforcing/SELINUX=disabled/'</span> /etc/selinux/config</span><br><span class="line">setenforce <span class="number">0</span></span><br></pre></td></tr></table></figure><h3 id="Navicat-远程连接阿里云上的-mysql"><a href="#Navicat-远程连接阿里云上的-mysql" class="headerlink" title="Navicat 远程连接阿里云上的 mysql"></a>Navicat 远程连接阿里云上的 mysql</h3><p>在 mysql 中输入命令,开启远程连接权限</p><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">grant</span> all <span class="keyword">privileges</span> <span class="keyword">on</span> *.* <span class="keyword">to</span> <span class="string">'root'</span>@<span class="string">'%'</span> <span class="keyword">identified</span> <span class="keyword">by</span> <span class="string">'YOUR_PASSWORD'</span> <span class="keyword">with</span> <span class="keyword">grant</span> <span class="keyword">option</span>;</span><br></pre></td></tr></table></figure><p>YOUR_PASSWORD 替换成你的mysql连接密码。</p><p>该命令的具体意思可见阿里云官方说法:<a href="https://help.aliyun.com/knowledge_detail/40792.html" target="_blank" rel="noopener">官方</a></p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">刷新权限</span><br><span class="line">flush privileges;</span><br><span class="line"><span class="keyword">exit</span></span><br><span class="line"></span><br><span class="line">重启 mysql 服务</span><br><span class="line">systemctl start mysqld</span><br></pre></td></tr></table></figure><h3 id="PHP7-最新版安装"><a href="#PHP7-最新版安装" class="headerlink" title="PHP7 最新版安装"></a>PHP7 最新版安装</h3><p>安装 REMI 仓库之前,首先安装 EPEL 仓库,因为 REMI 中的一些包依赖于 EPEL<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">yum install https:<span class="regexp">//</span>dl.fedoraproject.org<span class="regexp">/pub/</span>epel<span class="regexp">/epel-release-latest-7.noarch.rpm</span></span><br></pre></td></tr></table></figure></p><p>接下来安装 REMI 仓库</p><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">yum <span class="keyword">install</span> <span class="keyword">http</span>://rpms.remirepo.net/<span class="keyword">enterprise</span>/remi-<span class="keyword">release</span><span class="number">-7.</span>rpm</span><br></pre></td></tr></table></figure><p>再安装 yum 的配置管理工具,方便配置 yum 仓库</p><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum <span class="keyword">install</span> yum-utils</span><br></pre></td></tr></table></figure><p>启用 remi-php71 仓库</p><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum-<span class="built_in">config</span>-manager <span class="comment">--enable remi-php71</span></span><br></pre></td></tr></table></figure><p>最后,安装 PHP</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">yum install php</span><br><span class="line"></span><br><span class="line"><span class="builtin-name">find</span> / -type f -name <span class="string">"php"</span> -print</span><br><span class="line"></span><br><span class="line">/opt/remi/php71/root/usr/bin/php</span><br></pre></td></tr></table></figure><p>查看 PHP 版本以及扩展信息</p><figure class="highlight ada"><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">php <span class="comment">--v</span></span><br><span class="line">php <span class="comment">--m</span></span><br></pre></td></tr></table></figure><p>安装 PHP-FPM,简单理解,PHP-FPM 是 FastCGI 的管理器,FastCGI 是处理 Nginx 转发过来的 PHP 脚本的。</p><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum <span class="keyword">install</span> php-fpm</span><br></pre></td></tr></table></figure><h3 id="配置-nginx-支持-php"><a href="#配置-nginx-支持-php" class="headerlink" title="配置 nginx 支持 php"></a>配置 nginx 支持 php</h3><p>将默认的配置文件作为配置文件</p><figure class="highlight vim"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">cp</span> /etc/nginx/<span class="keyword">conf</span>.d/default.<span class="keyword">conf</span> <span class="keyword">abc</span>.<span class="keyword">conf</span></span><br></pre></td></tr></table></figure><p>进入nginx配置文件进行修改</p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">cp <span class="regexp">/etc/</span>nginx<span class="regexp">/conf.d/</span>abc.conf</span><br><span class="line"></span><br><span class="line">找到<span class="number">80</span>端口的配置,加入index.php</span><br><span class="line">index index.php index.html index.htm;</span><br><span class="line"></span><br><span class="line">加入下面的配置代码,如果已经存在的,去掉注释,并修改,其中<span class="regexp">/usr/</span>share<span class="regexp">/nginx/</span>html是web根目录的地址,可以根据自己的喜好进行选择,我一般放在<span class="regexp">/var/</span>www下</span><br><span class="line"></span><br><span class="line">location ~ \.php$ {</span><br><span class="line"> root <span class="regexp">/usr/</span>share<span class="regexp">/nginx/</span>html;</span><br><span class="line"> fastcgi_pass <span class="number">127.0</span>.<span class="number">0.1</span>:<span class="number">9000</span>;</span><br><span class="line"> fastcgi_index index.php;</span><br><span class="line"> fastcgi_param SCRIPT_FILENAME <span class="regexp">/usr/</span>share<span class="regexp">/nginx/</span>html<span class="variable">$fastcgi_script_name</span>;</span><br><span class="line"> include fastcgi_params;</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>最后,编辑文件php.ini,在文件末尾添加cgi.fix_pathinfo = 1,已经存在的去掉注释就好了</p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cgi<span class="selector-class">.fix_pathinfo</span> = <span class="number">1</span></span><br></pre></td></tr></table></figure><p>重启nginx,启动php-fpm</p><figure class="highlight css"><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="selector-tag">systemctl</span> <span class="selector-tag">restart</span> <span class="selector-tag">nginx</span><span class="selector-class">.service</span></span><br><span class="line"><span class="selector-tag">systemctl</span> <span class="selector-tag">start</span> <span class="selector-tag">php-fpm</span><span class="selector-class">.service</span></span><br></pre></td></tr></table></figure><p>设置php-fpm开机自启动</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">systemctl <span class="builtin-name">enable</span> php-fpm.service</span><br><span class="line"></span><br><span class="line">netstat -antp</span><br></pre></td></tr></table></figure><h3 id="安装Redis"><a href="#安装Redis" class="headerlink" title="安装Redis"></a>安装Redis</h3><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">yum <span class="keyword">install</span> redis php-pecl-redis</span><br></pre></td></tr></table></figure><p>把Redis添加到开机启动服务中:</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">service redis start</span><br><span class="line"></span><br><span class="line">systemctl <span class="builtin-name">enable</span> redis.service</span><br></pre></td></tr></table></figure><p>检查Redis是否运行:</p><figure class="highlight actionscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">systemctl <span class="keyword">is</span>-active redis.service</span><br></pre></td></tr></table></figure><p>重启php-fpm:</p><figure class="highlight ebnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">service php-fpm restart</span></span><br></pre></td></tr></table></figure><h3 id="源码编译安装-Git"><a href="#源码编译安装-Git" class="headerlink" title="源码编译安装 Git"></a>源码编译安装 Git</h3><p>centos 自带 git,7.x版本自带 git 1.8.3.1<br>在 Linux 中有的需要先卸载原来自带的 Git</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo yum <span class="builtin-name">remove</span> git</span><br></pre></td></tr></table></figure><p>安装 <a href="https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git" target="_blank" rel="noopener">Git</a> 的依赖包</p><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo yum <span class="keyword">install</span> dh-autoreconf curl-devel expat-devel gettext-devel openssl-devel perl-devel zlib-devel</span><br></pre></td></tr></table></figure><p>为了能支持多种格式的文档也需要安装一些额外的包</p><figure class="highlight cmake"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sudo yum <span class="keyword">install</span> asciidoc xmlto docbook2X getopt</span><br></pre></td></tr></table></figure><p>下载 Git 源码</p><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">sudo wget https:<span class="regexp">//</span>www.kernel.org<span class="regexp">/pub/</span>software<span class="regexp">/scm/gi</span>t<span class="regexp">/git-2.9.4.tar.gz</span></span><br></pre></td></tr></table></figure><p>解压</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">tar</span> <span class="selector-tag">-xzvf</span> <span class="selector-tag">git-2</span><span class="selector-class">.9</span><span class="selector-class">.4</span><span class="selector-class">.tar</span><span class="selector-class">.gz</span></span><br></pre></td></tr></table></figure><p>注意:如果使用的 Fedora 系列的操作系统需要设置软连接</p><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">sudo ln -s <span class="regexp">/usr/</span>bin<span class="regexp">/db2x_docbook2texi /u</span>sr<span class="regexp">/bin/</span>docbook2x-texi</span><br></pre></td></tr></table></figure><p>进入解压目录编译安装(时间比较漫长)</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><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">cd git-2.9.4</span><br><span class="line">./configure <span class="comment">--prefix=/usr/local/git</span></span><br><span class="line">sudo make all doc info</span><br><span class="line">sudo make <span class="keyword">install</span> <span class="keyword">install</span>-doc <span class="keyword">install</span>-html <span class="keyword">install</span>-info</span><br></pre></td></tr></table></figure><p>添加 Git 到环境变量</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sudo echo <span class="string">"export PATH=<span class="variable">$PATH</span>:/usr/local/git/bin"</span> >> /etc<span class="built_in">/profile </span></span><br><span class="line">sudo source /etc/profile</span><br><span class="line"></span><br><span class="line">git --version</span><br></pre></td></tr></table></figure><h3 id="学习参考"><a href="#学习参考" class="headerlink" title="学习参考"></a>学习参考</h3><p><a href="http://www.jianshu.com/p/1e51985b46dd" target="_blank" rel="noopener">(yum安装nginx和mysql,php7源码安装)</a><br><a href="http://www.jianshu.com/p/907c7edba13f" target="_blank" rel="noopener">centos上安装lnmp环境</a><br><a href="https://segmentfault.com/a/1190000003931716" target="_blank" rel="noopener">不可不知的centos7 firewalld 防火墙的使用</a><br><a href="http://53cto.blog.51cto.com/9899631/1841404" target="_blank" rel="noopener">CentOS7 安装 Mysql 5.7,密码查看与修改</a><br><a href="https://segmentfault.com/a/1190000007183895" target="_blank" rel="noopener">Centos 7.2 安装配置</a></p>]]></content>
<summary type="html">
Centos 7 下安装 LNMP 官方最新版
</summary>
<category term="lnmp" scheme="http://blog.jybx.me/categories/lnmp/"/>
<category term="lnmp" scheme="http://blog.jybx.me/tags/lnmp/"/>
</entry>
<entry>
<title>laravel-composer</title>
<link href="http://blog.jybx.me/laravel-composer.html"/>
<id>http://blog.jybx.me/laravel-composer.html</id>
<published>2017-04-09T04:16:28.000Z</published>
<updated>2017-12-05T14:17:30.593Z</updated>
<content type="html"><![CDATA[<h1 id="laravel-视图组件、服务注入"><a href="#laravel-视图组件、服务注入" class="headerlink" title="laravel 视图组件、服务注入"></a>laravel 视图组件、服务注入</h1><blockquote><p>视图组件就是在视图被渲染前,会被调用的闭包或类方法。如果你想在每次渲染某些视图时绑定数据,视图组件可以帮你把这样的程序逻辑都组织到同一个地方。<br>我们需要在我们的服务提供者中注册一个视图 composer 则应该在 boot 方法中完成。此方法会在所有其它的服务提供者被注册后才被调用,意味着你能访问已经被框架注册的所有其它服务</p></blockquote><p><strong>请注意,Laravel 没有默认的目录来放置视图组件。你可以随意把它们放到任何地方。</strong><br>你可以创建一个 <code>App\Http\ViewComposers</code> 目录</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="php"><span class="meta"><?php</span></span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Providers</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Support</span>\<span class="title">ServiceProvider</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="class"><span class="keyword">class</span> <span class="title">AppServiceProvider</span> <span class="keyword">extends</span> <span class="title">ServiceProvider</span></span></span></span><br><span class="line"><span class="php">{</span></span><br><span class="line"> /**</span><br><span class="line"> * Bootstrap any application services.</span><br><span class="line"> *</span><br><span class="line"> * @return void</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">boot</span><span class="params">()</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"> /**</span><br><span class="line"> * 视图 composer 共享后台菜单数据</span><br><span class="line"> * 多个视图共用一个视图组件</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> view()->composer(</span></span><br><span class="line"><span class="php"> [<span class="string">'layouts.index'</span>,<span class="string">'layouts.blog'</span>, <span class="string">'front.article.detail'</span>, <span class="string">'front.category.list'</span> , <span class="string">'front.index.search'</span>], <span class="string">'App\Http\ViewComposers\SettingsComposer'</span></span></span><br><span class="line"><span class="php"> );</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php">}</span></span><br></pre></td></tr></table></figure><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="php"><span class="meta"><?php</span></span></span><br><span class="line"><span class="php"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Http</span>\<span class="title">ViewComposers</span>;</span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">View</span>\<span class="title">View</span>;</span></span><br><span class="line"><span class="php"><span class="class"><span class="keyword">class</span> <span class="title">SettingsComposer</span></span></span></span><br><span class="line"><span class="php">{</span></span><br><span class="line"> /**</span><br><span class="line"> * 将数据绑定到视图。</span><br><span class="line"> *</span><br><span class="line"> * @param View $view</span><br><span class="line"> * @return void</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">compose</span><span class="params">(View $view)</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> <span class="comment">// getSettings() 方法如下</span></span></span><br><span class="line"><span class="php"> $view->with(<span class="string">'settings'</span>, getSettings());</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php">}</span></span><br></pre></td></tr></table></figure><p><strong>getSettings() 方法如下</strong></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 这是 laravel 5.3 版本</span></span><br><span class="line"><span class="keyword">if</span>(!function_exists(<span class="string">'getSettings'</span>)){</span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">getSettings</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">$key = config(<span class="string">'admin.global.blog'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// has 方法可以用来检查一个项目是否存在于缓存中</span></span><br><span class="line"><span class="keyword">if</span> (cache()->has($key)) {</span><br><span class="line"><span class="keyword">return</span> cache($key);</span><br><span class="line">}<span class="keyword">else</span>{</span><br><span class="line"> <span class="comment">// 此方法需要安装包 edvinaskrucas/settings</span></span><br><span class="line">$settings = settings($key,config(<span class="string">'admin.global.setting'</span>));</span><br><span class="line"><span class="comment">// forever 方法可以用来存放永久的项目到缓存中,这些值必须被手动的删除,这可以通过 forget 方法实现</span></span><br><span class="line">cache()->forever($key,$settings);</span><br><span class="line"><span class="keyword">return</span> $settings;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="php"><span class="meta"><?php</span></span></span><br><span class="line"><span class="php"><span class="comment">// 这是 laravel 5.2 版本</span></span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Support</span>\<span class="title">Facades</span>\<span class="title">Cache</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">if</span>(!function_exists(<span class="string">'getSettings'</span>)){</span></span><br><span class="line"><span class="php"> <span class="function"><span class="keyword">function</span> <span class="title">getSettings</span><span class="params">()</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> $key = config(<span class="string">'admin.global.blog'</span>);</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"> <span class="keyword">if</span> (Cache::has($key)) {</span></span><br><span class="line"><span class="php"> <span class="keyword">return</span> Cache::get($key);</span></span><br><span class="line"><span class="php"> }<span class="keyword">else</span>{</span></span><br><span class="line"><span class="php"> $settings = settings($key,config(<span class="string">'admin.global.setting'</span>));</span></span><br><span class="line"><span class="php"> Cache::forever($key,$settings);</span></span><br><span class="line"><span class="php"> <span class="keyword">return</span> $settings;</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php">}</span></span><br></pre></td></tr></table></figure><h2 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h2><figure class="highlight django"><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="xml"><span class="meta"><!DOCTYPE html></span></span></span><br><span class="line"><span class="xml"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span> <span class="attr">class</span>=<span class="string">"no-js"</span>></span></span></span><br><span class="line"><span class="xml"><span class="tag"><<span class="name">head</span>></span></span></span><br><span class="line"><span class="xml"><span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"utf-8"</span>/></span></span></span><br><span class="line"><span class="xml"><span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span></span><br><span class="line"><span class="xml"><span class="tag"><<span class="name">title</span>></span></span><span class="template-variable">{{$settings['title']}}</span><span class="xml"><span class="tag"></<span class="name">title</span>></span></span></span><br><span class="line"><span class="xml"><span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"keywords"</span> <span class="attr">content</span>=<span class="string">"</span></span></span><span class="template-variable">{{$settings['keywords']}}</span><span class="xml"><span class="tag"><span class="string">"</span> /></span></span></span><br><span class="line"><span class="xml"><span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"description"</span> <span class="attr">content</span>=<span class="string">"</span></span></span><span class="template-variable">{{$settings['description']}}</span><span class="xml"><span class="tag"><span class="string">"</span>></span></span></span><br><span class="line"><span class="xml"><span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"author"</span> <span class="attr">content</span>=<span class="string">"</span></span></span><span class="template-variable">{{$settings['author']}}</span><span class="xml"><span class="tag"><span class="string">"</span>></span></span></span><br></pre></td></tr></table></figure><h2 id="缓存"><a href="#缓存" class="headerlink" title="缓存"></a>缓存</h2><p><a href="http://d.laravel-china.org/docs/5.2/cache#获取一个缓存的实例" target="_blank" rel="noopener">缓存实例看手册</a><br><a href="https://github.com/illuminate/contracts/blob/master/Cache/Repository.php" target="_blank" rel="noopener">缓存接口</a></p><p><strong>源码 cache() 方法如下</strong></p><figure class="highlight php"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">if</span> (! function_exists(<span class="string">'cache'</span>)) {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Get / set the specified cache value.</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * If an array is passed, we'll assume you want to put to the cache.</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> dynamic key|key,default|data,expiration|null</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> mixed</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> \Exception</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="function"><span class="keyword">function</span> <span class="title">cache</span><span class="params">()</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> $arguments = func_get_args(); <span class="comment">// 返回一个包含函数参数列表的数组</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">empty</span>($arguments)) {</span><br><span class="line"> <span class="keyword">return</span> app(<span class="string">'cache'</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (is_string($arguments[<span class="number">0</span>])) {</span><br><span class="line"> <span class="comment">// get 方法可以用来取出缓存中的项目,缓存不存在的话返回 null,get 方法接受第二个参数,作为找不到项目时返回的预设值</span></span><br><span class="line"> <span class="keyword">return</span> app(<span class="string">'cache'</span>)->get($arguments[<span class="number">0</span>], <span class="keyword">isset</span>($arguments[<span class="number">1</span>]) ? $arguments[<span class="number">1</span>] : <span class="keyword">null</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (is_array($arguments[<span class="number">0</span>])) {</span><br><span class="line"> <span class="keyword">if</span> (! <span class="keyword">isset</span>($arguments[<span class="number">1</span>])) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="keyword">Exception</span>(</span><br><span class="line"> <span class="string">'You must set an expiration time when putting to the cache.'</span></span><br><span class="line"> );</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * put 方法来存放项目到缓存中,你需要使用第三个参数来设定缓存的存放时间</span></span><br><span class="line"><span class="comment"> * key — 从关联数组中取得键名</span></span><br><span class="line"><span class="comment"> * reset — 将数组的内部指针指向第一个单元,取值</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">return</span> app(<span class="string">'cache'</span>)->put(key($arguments[<span class="number">0</span>]), reset($arguments[<span class="number">0</span>]), $arguments[<span class="number">1</span>]);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="edvinaskrucas-settings"><a href="#edvinaskrucas-settings" class="headerlink" title="edvinaskrucas/settings"></a>edvinaskrucas/settings</h2><p>执行 <code>composer require edvinaskrucas/settings</code><br><a href="https://packagist.org/packages/edvinaskrucas/settings" target="_blank" rel="noopener">包地址</a></p><h2 id="服务注入"><a href="#服务注入" class="headerlink" title="服务注入"></a>服务注入</h2><blockquote><p>@inject 命令可以取出 Laravel 服务容器 中的服务。传递给 @inject 的第一个参数为置放该服务的变量名称,而第二个参数为你想要解析的服务的类或是接口的名称</p></blockquote><figure class="highlight elixir"><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="variable">@inject</span>(<span class="string">'metrics'</span>, <span class="string">'App\Services\MetricsService'</span>)</span><br><span class="line"></span><br><span class="line"><div></span><br><span class="line"> 每月收入:{{ <span class="variable">$metrics</span>->monthlyRevenue() }}。</span><br><span class="line"><<span class="regexp">/div></span></span><br></pre></td></tr></table></figure><h2 id="参考学习"><a href="#参考学习" class="headerlink" title="参考学习"></a>参考学习</h2><p><a href="http://d.laravel-china.org/docs/5.2/views#视图组件" target="_blank" rel="noopener">视图组件</a></p>]]></content>
<summary type="html">
laravel 视图组件、服务注入
</summary>
<category term="laravel" scheme="http://blog.jybx.me/categories/laravel/"/>
<category term="laravel" scheme="http://blog.jybx.me/tags/laravel/"/>
</entry>
<entry>
<title>mamp</title>
<link href="http://blog.jybx.me/mamp.html"/>
<id>http://blog.jybx.me/mamp.html</id>
<published>2017-04-03T14:05:29.000Z</published>
<updated>2017-12-05T14:06:37.493Z</updated>
<content type="html"><![CDATA[<h1 id="为-OS-X-集成环境-MAMP-添加-php-redis"><a href="#为-OS-X-集成环境-MAMP-添加-php-redis" class="headerlink" title="为 OS X 集成环境 MAMP 添加 php redis"></a>为 OS X 集成环境 MAMP 添加 php redis</h1><ol><li>确保 OS X 上已安装 home brew,打开终端</li><li><code>brew install redis</code> <a href="http://blog.csdn.net/pingpangbing0902/article/details/47104545" target="_blank" rel="noopener">在 mac 上通过 Homebrew 安装 redis</a></li><li><code>brew install homebrew/php/php56-redis</code> #56 为 php 版本 5.6.10</li><li>到 /usr/local/Cellar 目录下查看安装的文件</li><li>MAMP顶部菜单:File –> Edit Template –> PHP –> PHP 5.6.10 php.ini</li><li>找到第 531 行左右; Extensions,在列表最后添加extension=”/usr/local/Cellar/php56-redis/2.2.8_1/redis.so” (PHP 版本和 redis 版本以实际安装为准)</li><li>重启 MAMP,查看 phpinfo</li></ol><h2 id="MAMP-如何开启-php-的错误报告"><a href="#MAMP-如何开启-php-的错误报告" class="headerlink" title="MAMP 如何开启 php 的错误报告"></a>MAMP 如何开启 php 的错误报告</h2><p>打开 /Applications/MAMP/bin/php/{your PHP version}/conf/php.ini 文件</p><p>找到 display_errors = Off (大概在 277 行的位置)把他改成 display_errors = On</p><h2 id="MAMP-MySQL-插入数据时,中文乱码问题的解决"><a href="#MAMP-MySQL-插入数据时,中文乱码问题的解决" class="headerlink" title="MAMP MySQL 插入数据时,中文乱码问题的解决"></a>MAMP MySQL 插入数据时,中文乱码问题的解决</h2><p>在 MySQL 的安装目录下有一个 my.ini 配置文件,通过修改这个配置文件可以一劳永逸的解决乱码问题。</p><figure class="highlight ini"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">[mysql]</span></span><br><span class="line"><span class="attr">default-character-set</span>=utf8</span><br><span class="line"><span class="section">[mysqld]</span></span><br><span class="line"><span class="attr">character-set-server</span>=utf8</span><br></pre></td></tr></table></figure><h2 id="学习参考"><a href="#学习参考" class="headerlink" title="学习参考"></a>学习参考</h2><p><a href="https://icewing.cc/mamp-pro-install-php-extendsion.html" target="_blank" rel="noopener">MAMP PRO安装PHP扩展的方法</a><br><a href="http://www.cnblogs.com/sunzn/archive/2013/03/14/2960248.html" target="_blank" rel="noopener">中文乱码问题的解决</a></p>]]></content>
<summary type="html">
为 OS X 集成环境 MAMP 添加 php redis
</summary>
<category term="mamp" scheme="http://blog.jybx.me/categories/mamp/"/>
<category term="redis" scheme="http://blog.jybx.me/categories/mamp/redis/"/>
<category term="mamp" scheme="http://blog.jybx.me/tags/mamp/"/>
<category term="redis" scheme="http://blog.jybx.me/tags/redis/"/>
</entry>
<entry>
<title>laravel-faker</title>
<link href="http://blog.jybx.me/laravel-faker.html"/>
<id>http://blog.jybx.me/laravel-faker.html</id>
<published>2017-03-05T00:09:50.000Z</published>
<updated>2017-12-05T13:12:14.975Z</updated>
<content type="html"><![CDATA[<h1 id="Laravel-5-使用-Seeder-amp-Faker-生成假数据"><a href="#Laravel-5-使用-Seeder-amp-Faker-生成假数据" class="headerlink" title="Laravel 5 使用 Seeder & Faker 生成假数据"></a>Laravel 5 使用 Seeder & Faker 生成假数据</h1><blockquote><p>还在为手动填写假数据而头疼吗?Laravel 使用 Faker 可以很灵活的添加所需的特定格式的数据,可以通过 tinker 命令行预览、保存测试数据,也可以直接在 Seed 中写好相应代码一键生成。所有的 seeder 文件在 database/seeds 目录下。</p></blockquote><h1 id="Faker-是一个-PHP-库,为您生成假数据"><a href="#Faker-是一个-PHP-库,为您生成假数据" class="headerlink" title="Faker 是一个 PHP 库,为您生成假数据"></a>Faker 是一个 PHP 库,为您生成假数据</h1><blockquote><p>laravel 框架默认引入了 <a href="https://github.com/fzaninotto/Faker" target="_blank" rel="noopener">fzaninotto/Faker</a> 包,这个包能让我们快速的生成一些测试数据。<a href="https://github.com/fzaninotto/Faker/tree/master/src/Faker/Provider/zh_CN" target="_blank" rel="noopener">本地化</a></p><p><a href="https://packagist.org/packages/fzaninotto/faker" target="_blank" rel="noopener">packages</a><br>composer require fzaninotto/faker</p></blockquote><h2 id="创建-seeder-文件"><a href="#创建-seeder-文件" class="headerlink" title="创建 seeder 文件"></a>创建 seeder 文件</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">php</span> <span class="selector-tag">artisan</span> <span class="selector-tag">make</span><span class="selector-pseudo">:seeder</span> <span class="selector-tag">UserTableSeeder</span></span><br></pre></td></tr></table></figure><h2 id="用-laracasts-generators-包创建文件"><a href="#用-laracasts-generators-包创建文件" class="headerlink" title="用 laracasts/generators 包创建文件"></a>用 laracasts/generators 包创建文件</h2><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="comment">// 步骤1:通过Composer安装</span></span><br><span class="line">composer <span class="keyword">require</span> laracasts/generators --dev</span><br><span class="line"></span><br><span class="line"><span class="comment">// 步骤2:添加服务提供商</span></span><br><span class="line"><span class="comment">// 添加提供者 app/Providers/AppServiceProvider.php</span></span><br><span class="line"><span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">register</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">$this</span>->app->environment() == <span class="string">'local'</span>) {</span><br><span class="line"> <span class="keyword">$this</span>->app->register(<span class="string">'Laracasts\Generators\GeneratorsServiceProvider'</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p><strong>命令</strong></p><figure class="highlight css"><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="selector-tag">make</span><span class="selector-pseudo">:migration</span><span class="selector-pseudo">:schema</span></span><br><span class="line"><span class="selector-tag">make</span><span class="selector-pseudo">:migration</span><span class="selector-pseudo">:pivot</span></span><br><span class="line"><span class="selector-tag">make</span><span class="selector-pseudo">:seed</span></span><br></pre></td></tr></table></figure><p><strong>迁移与模式</strong></p><figure class="highlight groovy"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">php artisan <span class="string">make:</span><span class="string">migration:</span>schema create_articles_table --schema=<span class="string">"title:string, conent:text, published_at:timestamp"</span></span><br></pre></td></tr></table></figure><p><strong>创建如下文件内容</strong></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="php"><span class="meta"><?php</span></span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Database</span>\<span class="title">Schema</span>\<span class="title">Blueprint</span>;</span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Database</span>\<span class="title">Migrations</span>\<span class="title">Migration</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="class"><span class="keyword">class</span> <span class="title">CreateArticlesTable</span> <span class="keyword">extends</span> <span class="title">Migration</span></span></span></span><br><span class="line"><span class="php">{</span></span><br><span class="line"> /**</span><br><span class="line"> * Run the migrations.</span><br><span class="line"> *</span><br><span class="line"> * @return void</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">up</span><span class="params">()</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> Schema::create(<span class="string">'articles'</span>, <span class="function"><span class="keyword">function</span> <span class="params">(Blueprint $table)</span> </span>{</span></span><br><span class="line"><span class="php"> $table->increments(<span class="string">'id'</span>);</span></span><br><span class="line"><span class="php"> $table->string(<span class="string">'title'</span>);</span></span><br><span class="line"><span class="php"> $table->text(<span class="string">'content'</span>);</span></span><br><span class="line"><span class="php"> $table->timestamp(<span class="string">'published_at'</span>);</span></span><br><span class="line"><span class="php"> $table->timestamps();</span></span><br><span class="line"><span class="php"> });</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"> /**</span><br><span class="line"> * Reverse the migrations.</span><br><span class="line"> *</span><br><span class="line"> * @return void</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">down</span><span class="params">()</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> Schema::drop(<span class="string">'articles'</span>);</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php">}</span></span><br></pre></td></tr></table></figure><p><strong>删除</strong></p><figure class="highlight groovy"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">php artisan <span class="string">make:</span><span class="string">migration:</span>schema remove_published_at_from_articles_table --schema=<span class="string">"published_at:timestamp"</span></span><br></pre></td></tr></table></figure><p><strong>创建如下文件内容</strong></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="php"><span class="meta"><?php</span></span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Database</span>\<span class="title">Schema</span>\<span class="title">Blueprint</span>;</span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Database</span>\<span class="title">Migrations</span>\<span class="title">Migration</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="class"><span class="keyword">class</span> <span class="title">RemovePublishedAtFromArticlesTable</span> <span class="keyword">extends</span> <span class="title">Migration</span></span></span></span><br><span class="line"><span class="php">{</span></span><br><span class="line"> /**</span><br><span class="line"> * Run the migrations.</span><br><span class="line"> *</span><br><span class="line"> * @return void</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">up</span><span class="params">()</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> Schema::table(<span class="string">'articles'</span>, <span class="function"><span class="keyword">function</span> <span class="params">(Blueprint $table)</span> </span>{</span></span><br><span class="line"><span class="php"> $table->dropColumn(<span class="string">'published_at'</span>);</span></span><br><span class="line"><span class="php"> });</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"> /**</span><br><span class="line"> * Reverse the migrations.</span><br><span class="line"> *</span><br><span class="line"> * @return void</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">down</span><span class="params">()</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> Schema::table(<span class="string">'articles'</span>, <span class="function"><span class="keyword">function</span> <span class="params">(Blueprint $table)</span> </span>{</span></span><br><span class="line"><span class="php"> $table->timestamp(<span class="string">'published_at'</span>);</span></span><br><span class="line"><span class="php"> });</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php">}</span></span><br></pre></td></tr></table></figure><p><strong>多对多关系</strong></p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">php</span> <span class="selector-tag">artisan</span> <span class="selector-tag">make</span><span class="selector-pseudo">:migration</span><span class="selector-pseudo">:pivot</span> <span class="selector-tag">tags</span> <span class="selector-tag">articles</span></span><br></pre></td></tr></table></figure><p><strong>创建如下文件内容</strong></p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="php"><span class="meta"><?php</span></span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Database</span>\<span class="title">Schema</span>\<span class="title">Blueprint</span>;</span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Database</span>\<span class="title">Migrations</span>\<span class="title">Migration</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="class"><span class="keyword">class</span> <span class="title">CreateArticleTagPivotTable</span> <span class="keyword">extends</span> <span class="title">Migration</span></span></span></span><br><span class="line"><span class="php">{</span></span><br><span class="line"> /**</span><br><span class="line"> * Run the migrations.</span><br><span class="line"> *</span><br><span class="line"> * @return void</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">up</span><span class="params">()</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> Schema::create(<span class="string">'article_tag'</span>, <span class="function"><span class="keyword">function</span> <span class="params">(Blueprint $table)</span> </span>{</span></span><br><span class="line"><span class="php"> $table->integer(<span class="string">'article_id'</span>)->unsigned()->index();</span></span><br><span class="line"><span class="php"> $table->foreign(<span class="string">'article_id'</span>)->references(<span class="string">'id'</span>)->on(<span class="string">'articles'</span>)->onDelete(<span class="string">'cascade'</span>);</span></span><br><span class="line"><span class="php"> $table->integer(<span class="string">'tag_id'</span>)->unsigned()->index();</span></span><br><span class="line"><span class="php"> $table->foreign(<span class="string">'tag_id'</span>)->references(<span class="string">'id'</span>)->on(<span class="string">'tags'</span>)->onDelete(<span class="string">'cascade'</span>);</span></span><br><span class="line"><span class="php"> $table->primary([<span class="string">'article_id'</span>, <span class="string">'tag_id'</span>]);</span></span><br><span class="line"><span class="php"> });</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"> /**</span><br><span class="line"> * Reverse the migrations.</span><br><span class="line"> *</span><br><span class="line"> * @return void</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">down</span><span class="params">()</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> Schema::drop(<span class="string">'article_tag'</span>);</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php">}</span></span><br></pre></td></tr></table></figure><h2 id="用-laravel-test-factory-helper-包自动生成属性"><a href="#用-laravel-test-factory-helper-包自动生成属性" class="headerlink" title="用 laravel-test-factory-helper 包自动生成属性"></a>用 laravel-test-factory-helper 包自动生成属性</h2><blockquote><p>该软件包可帮助您从现有的模型/数据库结构生成模型工厂,以便更快速地测试Laravel应用程序</p></blockquote><figure class="highlight armasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">composer</span> <span class="meta">require</span> mpociot/laravel-test-factory-helper</span><br></pre></td></tr></table></figure><p><strong>config/app.php 添加服务提供商</strong></p><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Mpociot\LaravelTestFactoryHelper\TestFactoryHelperServiceProvider::<span class="class"><span class="keyword">class</span></span></span><br></pre></td></tr></table></figure><p><strong>执行</strong></p><figure class="highlight verilog"><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="comment">// database/factory/ModelFactory.php 模型工厂文件会自动生成各个模型对应字段数据</span></span><br><span class="line">php artisan test-factory-helper:<span class="keyword">generate</span></span><br></pre></td></tr></table></figure><h2 id="安全保证"><a href="#安全保证" class="headerlink" title="安全保证"></a>安全保证</h2><p>在 .env 文件中的 APP_ENV 配置通常可以配置以下三个值</p><figure class="highlight makefile"><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">// local 代表本地环境</span><br><span class="line">APP_ENV=local </span><br><span class="line">// testing 代码测试环境</span><br><span class="line">APP_ENV=testing </span><br><span class="line">// production 代表线上环境</span><br><span class="line">APP_ENV=production</span><br></pre></td></tr></table></figure><h2 id="执行-seed"><a href="#执行-seed" class="headerlink" title="执行 seed"></a>执行 seed</h2><blockquote><p>使用 php artisan make:seeder 命令来创建数据时,会调用 database/seeders 目录下的 DatabaseSeeder.php 文件中的 run() 方法。生成数据的代码可以放在 run() 中,既支持 DB 操作,也支持 Factory 方法,在 run() 中使用 call() 函数一次性来添加操作方法。</p></blockquote><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="php"><span class="meta"><?php</span></span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="keyword">use</span> <span class="title">Illuminate</span>\<span class="title">Database</span>\<span class="title">Seeder</span>;</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"><span class="class"><span class="keyword">class</span> <span class="title">DatabaseSeeder</span> <span class="keyword">extends</span> <span class="title">Seeder</span></span></span></span><br><span class="line"><span class="php">{</span></span><br><span class="line"> /**</span><br><span class="line"> * Run the database seeds.</span><br><span class="line"> *</span><br><span class="line"> * @return void</span><br><span class="line"><span class="php"> */</span></span><br><span class="line"><span class="php"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">run</span><span class="params">()</span></span></span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> <span class="keyword">if</span> (App::environment(<span class="string">'production'</span>, <span class="string">'staging'</span>))</span></span><br><span class="line"><span class="php"> {</span></span><br><span class="line"><span class="php"> <span class="comment">// 线上环境</span></span></span><br><span class="line"><span class="php"> <span class="keyword">exit</span>(<span class="string">'你不会是想被开除吧 ?'</span>);</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php"> </span></span><br><span class="line"><span class="php"> DB::table(<span class="string">'users'</span>)->truncate();</span></span><br><span class="line"><span class="php"> DB::table(<span class="string">'articles'</span>)->truncate();</span></span><br><span class="line"><span class="php"> <span class="keyword">$this</span>->call(UserTableSeeder::class);</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"> factory(\App\Article::class,<span class="number">50</span>)->create();</span></span><br><span class="line"><span class="php"></span></span><br><span class="line"><span class="php"> <span class="comment">// 直接在这写</span></span></span><br><span class="line"> /*\App\User::truncate();</span><br><span class="line"><span class="php"> factory(\App\User::class,<span class="number">20</span>)->create();*/</span></span><br><span class="line"><span class="php"> }</span></span><br><span class="line"><span class="php">}</span></span><br></pre></td></tr></table></figure><figure class="highlight groovy"><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="comment">// 执行这一步如果出现错误: 出现 [ReflectionException] Class does not exist 的提示。</span></span><br><span class="line"><span class="comment">// 在终端中执行 composer dump-autoload 即可</span></span><br><span class="line">php artisan <span class="string">db:</span>seed</span><br></pre></td></tr></table></figure><h2 id="学习参考"><a href="#学习参考" class="headerlink" title="学习参考"></a>学习参考</h2><p><a href="http://www.yzgod.com/?tag=laravel" target="_blank" rel="noopener">叶子天堂互联</a><br><a href="https://laravel.com/docs/5.4/configuration" target="_blank" rel="noopener">检测当前环境</a><br><a href="https://laravel-china.org/topics/109" target="_blank" rel="noopener">有用的数据填充</a></p>]]></content>
<summary type="html">
Laravel 5 使用 Seeder & Faker 生成假数据
</summary>
<category term="laravel" scheme="http://blog.jybx.me/categories/laravel/"/>
<category term="laravel" scheme="http://blog.jybx.me/tags/laravel/"/>
</entry>
<entry>
<title>Browsersync</title>
<link href="http://blog.jybx.me/browsersync.html"/>
<id>http://blog.jybx.me/browsersync.html</id>
<published>2016-12-01T10:08:38.000Z</published>
<updated>2017-02-04T04:40:49.000Z</updated>
<content type="html"><![CDATA[<h1 id="Browsersync-浏览器同步"><a href="#Browsersync-浏览器同步" class="headerlink" title="Browsersync 浏览器同步"></a>Browsersync 浏览器同步</h1><blockquote><p>Browsersync 能让浏览器实时、快速响应您的文件更改(html、js、css、sass、less 等)并自动刷新页面。更重要的是 Browsersync 可以同时在 PC、平板、手机等设备下进项调试。您可以想象一下:“假设您的桌子上有 pc、ipad、iphone、android 等设备,同时打开了您需要调试的页面,当您使用 browsersync 后,您的任何一次代码保存,以上的设备都会同时显示您的改动”。无论您是前端还是后端工程师,使用它将提高您 30% 的工作效率。– <a href="http://www.browsersync.cn/" target="_blank" rel="noopener">引自官方网站</a></p></blockquote><h2 id="安装-Node-js"><a href="#安装-Node-js" class="headerlink" title="安装 Node.js"></a>安装 Node.js</h2><p>BrowserSync 是基于 Node.js 的, 是一个 Node 模块, 如果您想要快速使用它,也许您需要先安装一下 Node.js <a href="https://nodejs.org/download/" target="_blank" rel="noopener">安装适用于Mac OS,Windows和Linux。</a></p><h2 id="安装-BrowserSync"><a href="#安装-BrowserSync" class="headerlink" title="安装 BrowserSync"></a>安装 BrowserSync</h2><p>您可以选择从 Node.js 的包管理(NPM)库中 安装 BrowserSync。打开一个终端窗口,运行以下命令:<code>sudo npm install -g browser-sync</code></p><p>安装时可能出现 <code>(node:11882) Warning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit</code> 错误,安装最新版本 node</p><h2 id="查看版本"><a href="#查看版本" class="headerlink" title="查看版本"></a>查看版本</h2><p><code>browser-sync --version</code></p><h2 id="构建项目"><a href="#构建项目" class="headerlink" title="构建项目"></a>构建项目</h2><p>创建文件夹并进入<br><code>npm init</code> 一路回车<br><code>npm install --save-dev browser-sync</code></p><h2 id="启动-BrowserSync"><a href="#启动-BrowserSync" class="headerlink" title="启动 BrowserSync"></a>启动 BrowserSync</h2><p>如果您想要监听 .css 文件, 您需要使用服务器模式。 BrowserSync 将启动一个小型服务器,并提供一个 URL 来查看您的网站。</p><figure class="highlight jboss-cli"><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="string">//</span> <span class="params">--files</span> 路径是相对于运行该命令的项目(目录) </span><br><span class="line">browser-sync start <span class="params">--server</span> <span class="params">--files</span> <span class="string">"css/*.css"</span></span><br></pre></td></tr></table></figure><p>如果您需要监听多个类型的文件,您只需要用逗号隔开。例如我们再加入一个 .html 文件</p><figure class="highlight jboss-cli"><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="string">//</span> <span class="params">--files</span> 路径是相对于运行该命令的项目(目录) </span><br><span class="line">browser-sync start <span class="params">--server</span> <span class="params">--files</span> <span class="string">"css/*.css, *.html"</span></span><br><span class="line"><span class="string">//</span> 如果你的文件层级比较深,您可以考虑使用 **(表示任意目录)匹配,任意目录下任意<span class="string">.css</span> 或 <span class="string">.html</span>文件。 </span><br><span class="line">browser-sync start <span class="params">--server</span> <span class="params">--files</span> <span class="string">"**/*.css, **/*.html"</span></span><br></pre></td></tr></table></figure><p>如果您已经有其他本地服务器环境 PHP 或类似的,您需要使用代理模式。 BrowserSync 将通过代理 URL(localhost:3000) 来查看您的网站。</p><figure class="highlight armasm"><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="built_in">ip</span>或域名</span><br><span class="line"><span class="keyword">browser-sync </span>start --proxy <span class="string">"主机名"</span> <span class="string">"css/*.css"</span></span><br></pre></td></tr></table></figure><p>我在这里执行<br><code>browser-sync start --server [html] --files "html/css/*.css, html/*.html"</code></p><p><img src="http://api.jybx.me/htmls.png" alt="htmls"></p><h2 id="配置界面"><a href="#配置界面" class="headerlink" title="配置界面"></a>配置界面</h2><p>浏览器地址:<code>http://localhost:3001</code></p><p><img src="http://api.jybx.me/brow.png" alt="brow"></p><p>Debug 调试(选择哪个链接,变成绿色)</p><p><img src="http://api.jybx.me/debug.png" alt="debug"></p><p><img src="http://api.jybx.me/target.png" alt="target"></p><h2 id="–tunnel:与所有人同步"><a href="#–tunnel:与所有人同步" class="headerlink" title="–tunnel:与所有人同步"></a>–tunnel:与所有人同步</h2><p><code>browser-sync start --server [html] --files "html/css/*.css, html/*.html" --tunnel</code></p><p><img src="http://api.jybx.me/tunnel.png" alt="tunnel"></p><p>在同步之前需要安装 <code>npm install -g localtunnel</code><br><a href="https://localtunnel.github.io/www/" target="_blank" rel="noopener">Localtunnel</a></p><p>打开 <code>https://tngvbwigwn.localtunnel.me</code> 可以在别人的浏览器上同步打开</p><h2 id="Browsersync-整合到-Gulp-任务"><a href="#Browsersync-整合到-Gulp-任务" class="headerlink" title="Browsersync 整合到 Gulp 任务"></a>Browsersync 整合到 Gulp 任务</h2><p><code>npm install browser-sync gulp --save-dev</code><br>然后在 Glupfile.js 里配置任务</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> gulp = <span class="built_in">require</span>(<span class="string">'gulp'</span>);</span><br><span class="line"><span class="keyword">var</span> browserSync = <span class="built_in">require</span>(<span class="string">'browser-sync'</span>).create(); <span class="comment">//引入模块</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Static server</span></span><br><span class="line">gulp.task(<span class="string">'browser-sync'</span>, <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>{ <span class="comment">//注册任务</span></span><br><span class="line"> browserSync.init({ <span class="comment">//调用API</span></span><br><span class="line"> server: {</span><br><span class="line"> baseDir: <span class="string">"./html"</span> <span class="comment">//监听当前路径</span></span><br><span class="line"> },</span><br><span class="line"> files: [<span class="string">'html/ndex.html'</span>, <span class="string">'html/css/*.css'</span>] <span class="comment">//监听整个项目</span></span><br><span class="line"> });</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line"><span class="comment">// or...</span></span><br><span class="line"></span><br><span class="line">gulp.task(<span class="string">'browser-sync'</span>, <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>{</span><br><span class="line"> browserSync.init({</span><br><span class="line"> proxy: <span class="string">"yourlocal.dev"</span></span><br><span class="line"> });</span><br><span class="line">});</span><br></pre></td></tr></table></figure><p><a href="https://browsersync.io/docs/gulp/" target="_blank" rel="noopener">详细例子传送门</a></p><h2 id="高级用法"><a href="#高级用法" class="headerlink" title="高级用法"></a>高级用法</h2><p><a href="https://segmentfault.com/a/1190000003787713" target="_blank" rel="noopener">原文引用</a><br><code>browser-sync init</code><br>件,这个是 BrowserSync 的配置文件。有关 BrowserSync 的所有运行配置都在这个里面,我们可以 <a href="https://browsersync.io/docs/options/" target="_blank" rel="noopener">参考官方文档</a> 进行修改,然后以这个配置文件来运行 BrowserSync:<br><code>browser-sync start --config bs-config .js</code></p>]]></content>
<summary type="html">
Browsersync 能让浏览器实时、快速响应您的文件更改(html、js、css、sass、less 等)并自动刷新页面。更重要的是 Browsersync 可以同时在 PC、平板、手机等设备下进项调试。
</summary>
<category term="npm" scheme="http://blog.jybx.me/categories/npm/"/>
<category term="browsersync" scheme="http://blog.jybx.me/categories/npm/browsersync/"/>
<category term="gulp" scheme="http://blog.jybx.me/categories/npm/browsersync/gulp/"/>
<category term="npm" scheme="http://blog.jybx.me/tags/npm/"/>
<category term="browsersync" scheme="http://blog.jybx.me/tags/browsersync/"/>
<category term="gulp" scheme="http://blog.jybx.me/tags/gulp/"/>
</entry>
<entry>
<title>git</title>
<link href="http://blog.jybx.me/git.html"/>
<id>http://blog.jybx.me/git.html</id>
<published>2016-11-27T06:59:05.000Z</published>
<updated>2016-12-17T11:10:10.000Z</updated>
<content type="html"><![CDATA[<h1 id="Git-学习笔记"><a href="#Git-学习笔记" class="headerlink" title="Git 学习笔记"></a>Git 学习笔记</h1><blockquote><p>GIT 是一款免费的、开源的、分布式的版本控制系统。每一个 GIT 克隆都是一个完整的文件库,含有全部历史记录和修订追踪能力。其最大特色就是“分支”及“合并”操作快速、简便。支持离线工作,GIT 是整个项目范围的原子提交,而且 GIT 中的每个工作树都包含一个具有完整项目历史的仓库。</p></blockquote><h2 id="Git-安装"><a href="#Git-安装" class="headerlink" title="Git 安装"></a>Git 安装</h2><p><a href="https://git-scm.com/download/" target="_blank" rel="noopener">https://git-scm.com/download/</a><br>如果你不想安装,可以访问 <a href="http://www.hubwiz.com/course/55d301543ad79a1b05dcc4e2/" target="_blank" rel="noopener">http://www.hubwiz.com/course/55d301543ad79a1b05dcc4e2/</a> 这个链接直接练习。</p><h2 id="查看-Git-版本"><a href="#查看-Git-版本" class="headerlink" title="查看 Git 版本"></a>查看 Git 版本</h2><p><code>git --version</code></p><h2 id="创建一个新的-Git-仓库"><a href="#创建一个新的-Git-仓库" class="headerlink" title="创建一个新的 Git 仓库"></a>创建一个新的 Git 仓库</h2><p>创建新文件夹,打开,然后执行 <code>git init</code> 命令用来创建一个新的 git 仓库,git 大部分命令都是在 git 仓库下运行</p><figure class="highlight mipsasm"><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">git init <span class="comment"># 将当前目录转换为 git 仓库</span></span><br><span class="line">git init <<span class="keyword">directory> </span><span class="comment"># 将特定目录转换为 git 仓库</span></span><br><span class="line">git init --<span class="keyword">bare </span><<span class="keyword">directory> </span> <span class="comment"># 指定目录创建一个空的(裸的)git 仓库,它不包含工作目录,并且不能提交编辑和提交修改,该仓库主要用于远端服务器管理代码,保存 git 历史提交的版本信息,防止冲突。</span></span><br><span class="line">git <span class="keyword">clone </span>[url] <span class="comment"># 复制一个存在的 git 仓库到本地</span></span><br></pre></td></tr></table></figure><p><a href="https://segmentfault.com/q/1010000004683286" target="_blank" rel="noopener">git init 和 git init –bare 的区别?</a></p><h2 id="Git-的目录结构"><a href="#Git-的目录结构" class="headerlink" title="Git 的目录结构"></a>Git 的目录结构</h2><p><img src="http://api.jybx.me/git-init.png" alt="git-init"></p><figure class="highlight mipsasm"><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">HEAD <span class="comment"># 指向 Git 项目当前分支的头指针</span></span><br><span class="line"><span class="built_in">config</span> <span class="comment"># Git 项目配置信息</span></span><br><span class="line">hooks <span class="comment"># 默认的 'hooks' 脚本,被特定事件发生前后触发。</span></span><br><span class="line">objects <span class="comment"># Git 的数据对象,包括:commits, trees, blobs, tags。</span></span><br><span class="line"><span class="keyword">branches </span><span class="comment"># Git 项目分支信息,新版 Git 已经不再使用该目录</span></span><br><span class="line">description <span class="comment"># Git 项目描述信息</span></span><br><span class="line">info <span class="comment"># 里面含一个 exclude 文件,指 Git 项目要忽略的文件。</span></span><br><span class="line">refs <span class="comment"># 指向所有 Git 项目分支的指针</span></span><br></pre></td></tr></table></figure><p>所有的分支指针保存在 .git/refs/heads 目录下,HEAD 在 .git/HEAD 目录下,标签在 .git/refs/tags 目录下。</p><h2 id="忽略不必要的文件-敏感信息"><a href="#忽略不必要的文件-敏感信息" class="headerlink" title="忽略不必要的文件/敏感信息"></a>忽略不必要的文件/敏感信息</h2><p>在 Git 工作区的根目录下创建一个特殊的 <code>.gitignore</code> 文件,然后把要忽略的文件名填进去,Git 就会自动忽略这些文件。</p><figure class="highlight jboss-cli"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 配置语法</span></span><br><span class="line"><span class="comment"># 以斜杠“/”开头表示目录;</span></span><br><span class="line"><span class="comment"># 以星号“*”通配多个字符;</span></span><br><span class="line"><span class="comment"># 以问号“?”通配单个字符</span></span><br><span class="line"><span class="comment"># 以方括号“[]”包含单个字符的匹配列表;</span></span><br><span class="line"><span class="comment"># 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;</span></span><br><span class="line"><span class="comment"># {!ab}:必须不是此类型</span></span><br><span class="line"><span class="comment"># {ab,bb,cx}:代表ab,bb,cx中任一类型即可</span></span><br><span class="line"><span class="comment"># [abc]:代表a,b,c中任一字符即可</span></span><br><span class="line"><span class="comment"># [ ^abc]:代表必须不是a,b,c中任一字符</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 此为注释 – 将被 Git 忽略</span></span><br><span class="line">*<span class="string">.a</span> <span class="comment"># 忽略所有 .a 结尾的文件</span></span><br><span class="line">!test.json <span class="comment"># 但 test.json 除外</span></span><br><span class="line"><span class="string">/TODO</span> <span class="comment"># 仅仅忽略项目根目录下的 TODO 文件 </span></span><br><span class="line">build/ <span class="comment"># 忽略目录下的所有文件</span></span><br><span class="line">doc/*<span class="string">.txt</span> <span class="comment"># 会忽略 doc/ 文件夹下的所有以 .txt 结尾的 </span></span><br><span class="line"><span class="string">.DS_Store</span></span><br><span class="line"><span class="string">.idea</span></span><br></pre></td></tr></table></figure><h2 id="Git-工作流"><a href="#Git-工作流" class="headerlink" title="Git 工作流"></a>Git 工作流</h2><p>你的本地仓库由 git 维护的三棵“树”组成。第一个是你的工作目录,它持有实际文件;第二个是暂存区(Index),它像个缓存区域,临时保存你的改动;最后是 HEAD,它指向你最后一次提交的结果。<br><img src="http://api.jybx.me/trees.png" alt="trees"></p><h2 id="Git-配置"><a href="#Git-配置" class="headerlink" title="Git 配置"></a>Git 配置</h2><p><code>git config</code> 命令用来配置本地安装的 git<br>Git的设置文件为 <code>.gitconfig</code> 它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。</p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">cat ~/.gitconfig # 查看当前本地配置</span><br><span class="line">git<span class="built_in"> config </span>--list # 显示当前的 Git 配置</span><br><span class="line">git<span class="built_in"> config </span>-e [--global] # 编辑 Git 配置文件</span><br><span class="line"></span><br><span class="line">git<span class="built_in"> config </span>[--global] user.name <span class="string">"[name]"</span> # 配置当前仓库修改提交作者名</span><br><span class="line">git<span class="built_in"> config </span>[--global] user.email <span class="string">"[email address]"</span> # 配置本地所有仓库提交 email 地址</span><br><span class="line">git<span class="built_in"> config </span>[--global] color.ui <span class="literal">true</span> # 打开所有的默认终端着色</span><br><span class="line">git<span class="built_in"> config </span>[--global] core.editor vim # 设置默认编辑器</span><br><span class="line">git<span class="built_in"> config </span>[--global] alias.co checkout # 设置别名,使用如下 git co</span><br><span class="line">git<span class="built_in"> config </span>[--global] alias.ci commit #命令用来将本地跟踪的修改添加到本地仓库历史</span><br><span class="line">git<span class="built_in"> config </span>[--global] alias.st status # 命令用于查看当前工作区和暂存区的状态信息</span><br><span class="line">git<span class="built_in"> config </span>[--global] alias.br branch # 命令用于查看当前分支</span><br><span class="line"></span><br><span class="line">git<span class="built_in"> config </span>[--global] --unset alias.br # 删除别名</span><br></pre></td></tr></table></figure><p><a href="自定义 Git - 配置 Git">更多自定义 Git - 配置 Git</a></p><h2 id="添加和提交"><a href="#添加和提交" class="headerlink" title="添加和提交"></a>添加和提交</h2><p><code>git add</code> 你可以提出更改(把它们添加到暂存区)<br><code>git commit</code> 命令用来将本地修改添加到本地仓库历史,你的改动已经提交到了 HEAD,但是还没到你的远端仓库。</p><figure class="highlight dockerfile"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">add</span><span class="bash"> [file1] [file2] <span class="comment"># 添加指定文件到暂存区</span></span></span><br><span class="line"><span class="bash">git add [dir] <span class="comment"># 添加指定目录到暂存区,包括子目录</span></span></span><br><span class="line"><span class="bash">git add . <span class="comment"># 添加当前目录的所有文件到暂存区</span></span></span><br><span class="line"><span class="bash">git add prefix_* <span class="comment"># 匹配以 prefix 开头的所有文件</span></span></span><br><span class="line"><span class="bash">git add *.js <span class="comment"># 匹配以 js 结尾的所有文件</span></span></span><br><span class="line"><span class="bash">git add -p <span class="comment"># 添加每个变化前,都会要求确认</span></span></span><br><span class="line"><span class="bash">git add -u <span class="comment"># 只加修改过的档案, 新增的档案不加入</span></span></span><br><span class="line"><span class="bash"></span></span><br><span class="line"><span class="bash">git commit -m [message] <span class="comment"># 提交暂存区到仓库区</span></span></span><br><span class="line"><span class="bash">git commit [file1] [file2] ... -m [message] <span class="comment"># 提交暂存区的指定文件到仓库区</span></span></span><br><span class="line"><span class="bash">git commit -a <span class="comment"># 提交工作区自上次 commit 之后的变化,直接到仓库区</span></span></span><br><span class="line"><span class="bash">git commit -a -m <span class="string">'commit -message'</span> <span class="comment"># 将所有修改过得档案都 commit, 不需要执行 git-add 命令 .-a 参数就是已经自动执行 git-add 命令</span></span></span><br><span class="line"><span class="bash">git commit -a -v <span class="comment"># -v 可以看到档案哪些内容有被更改, -a 把所有修改的档案都 commit</span></span></span><br><span class="line"><span class="bash">git commit -v <span class="comment"># 提交时显示所有 diff 信息</span></span></span><br><span class="line"><span class="bash">git commit --amend -m [message] <span class="comment"># 使用一次新的commit,替代上一次提交,如果代码没有任何新变化,则用来改写上一次commit的提交信息</span></span></span><br><span class="line"><span class="bash">git commit --amend [file1] [file2] ... <span class="comment"># 重做上一次commit,并包括指定文件的新变化</span></span></span><br><span class="line"><span class="bash">git commit --amend --no-edit <span class="comment"># 加入 --no-edit 标记会修复提交但不修改提交信息</span></span></span><br></pre></td></tr></table></figure><h2 id="删除文件-改名文件"><a href="#删除文件-改名文件" class="headerlink" title="删除文件/改名文件"></a>删除文件/改名文件</h2><figure class="highlight accesslog"><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">git rm <span class="string">[file1]</span> <span class="string">[file2]</span> ... # 删除工作区文件,并且将这次删除放入暂存区</span><br><span class="line">git rm <span class="string">[r]</span> --cached <span class="string">[file]</span> # 停止追踪指定文件,但该文件会保留在工作区</span><br><span class="line"></span><br><span class="line">git mv <span class="string">[file-original]</span> <span class="string">[file-renamed]</span> # 改名文件,并且将这个改名放入暂存区</span><br></pre></td></tr></table></figure><h2 id="清除没有在-Git-库中的文件"><a href="#清除没有在-Git-库中的文件" class="headerlink" title="清除没有在 Git 库中的文件"></a>清除没有在 Git 库中的文件</h2><figure class="highlight nginx"><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">git</span> clean -nd <span class="comment"># 查看当前多的文件和目录或将要被删除的文件和目录</span></span><br><span class="line">git clean -fd <span class="comment"># 将多的文件和目录从 git 目录里删除</span></span><br></pre></td></tr></table></figure><h2 id="查看信息"><a href="#查看信息" class="headerlink" title="查看信息"></a>查看信息</h2><p><code>git log</code> 查看历史记录<br><img src="http://api.jybx.me/gitlog.png" alt="gitlog"><br>git 一直停留在 log 模式,这时只需要按 q 键即可退出。如果不退出,在按完 q 键后回车即可。</p><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line">git status <span class="comment"># 显示有变更的文件</span></span><br><span class="line"></span><br><span class="line">git <span class="keyword">log</span> <span class="comment"># 显示当前分支的版本历史</span></span><br><span class="line">git <span class="keyword">log</span> --<span class="keyword">stat</span> <span class="comment"># 会显示在每个提交 (commit) 中哪些文件被修改了, 这些文件分别添加或删除了多少行内容</span></span><br><span class="line">git <span class="keyword">log</span> -<span class="number">2</span> <span class="comment"># 查看最近2次的提交日志</span></span><br><span class="line">git <span class="keyword">log</span> -p <span class="comment"># 除了 git log 信息之外,包含哪些文件被更改了,以及每个文件相对的增删行数。</span></span><br><span class="line">git <span class="keyword">log</span> --oneline <span class="comment"># 查看历史提交日志,单行显示</span></span><br><span class="line">git <span class="keyword">log</span> --pretty=oneline <span class="comment"># 查看版本号,同上(版本号更详细)</span></span><br><span class="line">git <span class="keyword">log</span> --graph --pretty=oneline --abbrev-commit <span class="comment"># 可以看到分支的合并情况(简化版)</span></span><br><span class="line">git <span class="keyword">log</span> --graph <span class="comment"># 分支合并图(详细图) 同 git log</span></span><br><span class="line">git <span class="keyword">log</span> -S [keyword] <span class="comment"># 搜索提交历史,根据关键词</span></span><br><span class="line">git <span class="keyword">log</span> [tag] HEAD --pretty=<span class="keyword">format</span>:%s <span class="comment"># 显示某个 commit 之后的所有变动,每个 commit 占据一行</span></span><br><span class="line">git <span class="keyword">log</span> [tag] HEAD --<span class="keyword">grep</span> feature <span class="comment"># 显示某个 commit 之后的所有变动,其"提交说明"必须符合搜索条件</span></span><br><span class="line">git <span class="keyword">log</span> --follow [file] <span class="comment"># 显示某个文件的版本历史,包括文件改名</span></span><br><span class="line">git <span class="keyword">log</span> --since=<span class="string">"2 weeks ago"</span> <span class="comment"># 最后这2周的log</span></span><br><span class="line"><span class="comment"># 自定义的 git log 配置</span></span><br><span class="line">git <span class="keyword">log</span> --graph --abbrev-commit --decorate --all --<span class="keyword">format</span>=<span class="keyword">format</span>:<span class="string">'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(dim white) - %an%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n %C(white)%s%C(reset)'</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">git shortlog -sn <span class="comment"># 显示所有提交过的用户,按提交次数排序</span></span><br><span class="line">git blame [file] <span class="comment"># 关于此档案的所有 commit 纪录,显示指定文件是什么人在什么时间修改过(通常找出来谁改动了某个文件里的某行代码会很有用)</span></span><br><span class="line">git blame -C [file] <span class="comment"># 显示内容来自哪个文件</span></span><br><span class="line"></span><br><span class="line">git diff <span class="comment"># 显示暂存区和工作区的差异</span></span><br><span class="line">git diff --cached <span class="comment"># 看看哪些文件将被提交(commit)</span></span><br><span class="line">git diff HEAD <span class="comment"># 显示工作区与当前分支最新 commit 之间的差异</span></span><br><span class="line">git diff [first-branch]...[second-branch] <span class="comment"># 显示两次提交之间的差异</span></span><br><span class="line">git diff --shortstat <span class="string">"<span class="subst">@{<span class="number">0</span> day ago}</span>"</span> <span class="comment"># 显示今天你写了多少行代码</span></span><br><span class="line"></span><br><span class="line">git show [commit] <span class="comment"># 显示某次提交的元数据和内容变化</span></span><br><span class="line">git show --name-only [commit] <span class="comment"># 显示某次提交发生变化的文件</span></span><br><span class="line">git show [commit]:[filename] <span class="comment"># 显示某次提交时,某个文件的内容</span></span><br><span class="line">git show HEAD <span class="comment"># 此版本修改的资料</span></span><br><span class="line">git show HEAD^ <span class="comment"># 前一版修改的资料</span></span><br><span class="line">git show HEAD~<span class="number">4</span> <span class="comment"># 前前前前一版修改的资料</span></span><br><span class="line">git reflog <span class="comment"># 显示当前分支的最近几次提交,记录每一次命令</span></span><br></pre></td></tr></table></figure><h2 id="修正错误的-commit"><a href="#修正错误的-commit" class="headerlink" title="修正错误的 commit"></a>修正错误的 commit</h2><p><code>git reset</code> 命令用来撤销历史中的某次提交,也会撤销其后面的提交历史</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><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">reset</span> [<span class="keyword">file</span>] # 重置暂存区的指定文件,与上一次<span class="keyword">commit</span>保持一致,但工作区不变</span><br><span class="line">git <span class="keyword">reset</span> <span class="comment">--hard # 重置暂存区与工作区,与上一次commit保持一致</span></span><br><span class="line">git <span class="keyword">reset</span> [<span class="keyword">commit</span>] # 重置当前分支的指针为指定<span class="keyword">commit</span>,同时重置暂存区,但工作区不变</span><br><span class="line">git <span class="keyword">reset</span> <span class="comment">--hard HEAD^ # 回到上一个版本</span></span><br><span class="line">git <span class="keyword">reset</span> <span class="comment">--hard HEAD~2 # 命令将当前分支向前倒退两个提交</span></span><br><span class="line">git <span class="keyword">reset</span> <span class="comment">--keep [commit] # 重置当前HEAD为指定commit,但保持暂存区和工作区不变</span></span><br><span class="line">git <span class="keyword">reset</span> <span class="comment">--soft * # --soft 参数告诉 Git 重置 HEAD 到另外一个 commit,但也到此为止</span></span><br><span class="line"></span><br><span class="line">git revert [<span class="keyword">commit</span>] # 新建一个<span class="keyword">commit</span>,用来撤销指定 <span class="keyword">commit</span>, 后者的所有变化都将被前者抵消,并且应用到当前分支</span><br><span class="line"></span><br><span class="line">git checkout [<span class="keyword">file</span>] # 恢复暂存区的指定文件到工作区</span><br><span class="line">git checkout [<span class="keyword">commit</span>] [<span class="keyword">file</span>] # 恢复某个<span class="keyword">commit</span>的指定文件到暂存区和工作区</span><br><span class="line">git checkout . # 恢复暂存区的所有文件到工作区</span><br><span class="line">git checkout <span class="comment">-- file # 我 git add 增加到暂存区后,接着添加内容,我想通过撤销命令让其回到暂存区后的状态(删除了也可以恢复)</span></span><br></pre></td></tr></table></figure><h2 id="Git-分支理解与应用"><a href="#Git-分支理解与应用" class="headerlink" title="Git 分支理解与应用"></a>Git 分支理解与应用</h2><p>分支是用来将特性开发绝缘开来的。在你创建仓库的时候,master 是“默认的”分支。在其他分支上进行开发,完成后再将它们合并到主分支上。<br><img src="http://api.jybx.me/branches.png" alt="branches"></p><figure class="highlight armasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">git</span> checkout -<span class="keyword">b </span>dev(分支名) # 创建分支并切换过去,-<span class="keyword">b </span>参数表示创建并切换,相当于 git <span class="keyword">branch </span>dev , git checkout dev</span><br><span class="line"><span class="symbol">git</span> <span class="keyword">branch </span># 查看当前所有本地分支</span><br><span class="line"><span class="symbol">git</span> <span class="keyword">branch </span>-r # 列出所有远程分支</span><br><span class="line"><span class="symbol">git</span> <span class="keyword">branch </span>-a # 列出所有本地分支和远程分支</span><br><span class="line"><span class="symbol">git</span> <span class="keyword">branch </span>[<span class="keyword">branch-name] </span># 新建一个分支,但依然停留在当前分支</span><br><span class="line"><span class="symbol">git</span> <span class="keyword">branch </span>-m [<span class="keyword">branch-name] </span>[new-<span class="keyword">branch-name] </span># 重命名本地分支</span><br><span class="line"><span class="symbol">git</span> <span class="keyword">branch </span>--track [<span class="keyword">branch] </span>[remote-<span class="keyword">branch] </span># 新建一个分支,与指定的远程分支建立追踪关系</span><br><span class="line"><span class="symbol">git</span> <span class="keyword">branch </span>--set-upstream [<span class="keyword">branch] </span>[remote-<span class="keyword">branch] </span># 建立追踪关系,在现有分支与指定的远程分支之间</span><br><span class="line"></span><br><span class="line"><span class="symbol">git</span> <span class="keyword">branch </span>-d [<span class="keyword">branch-name] </span># 删除分支</span><br><span class="line"><span class="symbol">git</span> <span class="keyword">branch </span>-D [<span class="keyword">branch-name] </span># 强制删除分支</span><br><span class="line"></span><br><span class="line"><span class="symbol">git</span> <span class="keyword">push </span>origin --delete [<span class="keyword">branch-name] </span># 删除远程分支</span><br><span class="line"><span class="symbol">git</span> <span class="keyword">branch </span>-dr [remote/<span class="keyword">branch] </span># 删除远程分支</span><br><span class="line"></span><br><span class="line"><span class="symbol">git</span> checkout [<span class="keyword">branch-name] </span># 切换到指定分支,并更新工作区</span><br><span class="line"><span class="symbol">git</span> checkout - # 切换到上一个分支</span><br><span class="line"><span class="symbol">git</span> checkout master # 切换回主分支</span><br><span class="line"></span><br><span class="line"><span class="symbol">git</span> merge [<span class="keyword">branch] </span># 合并指定分支到当前分支</span><br><span class="line"><span class="symbol">git</span> cherry-pick [commit] # 选择一个commit,合并进当前分支</span><br><span class="line"><span class="symbol">git</span> merge --no-ff -m <span class="string">'' [branch] # 合并并删除分支,被删除的分支信息还在</span></span><br></pre></td></tr></table></figure><h2 id="处理合并冲突-Git-merge-conflict"><a href="#处理合并冲突-Git-merge-conflict" class="headerlink" title="处理合并冲突 Git merge conflict"></a>处理合并冲突 Git merge conflict</h2><p><img src="http://api.jybx.me/mergerdev.png" alt="mergerdev"><br><code>git diff [fileName]</code> 查看区别<br>编辑查看文件,git 已为我们做好标记区别, 删除你不要的部分并保存,<code>git add [fileName]</code></p><h2 id="代码合并:Merge、Rebase-的选择"><a href="#代码合并:Merge、Rebase-的选择" class="headerlink" title="代码合并:Merge、Rebase 的选择"></a>代码合并:Merge、Rebase 的选择</h2><p>git rebase 和 git merge 做的事其实是一样的。它们都被设计来将一个分支的更改并入另一个分支,只不过方式有些不同。<br><a href="https://github.com/geeeeeeeeek/git-recipes/wiki/5.1-%E4%BB%A3%E7%A0%81%E5%90%88%E5%B9%B6%EF%BC%9AMerge%E3%80%81Rebase%E7%9A%84%E9%80%89%E6%8B%A9" target="_blank" rel="noopener">查看详细</a></p><h2 id="Git-基础-打标签"><a href="#Git-基础-打标签" class="headerlink" title="Git 基础 - 打标签"></a>Git 基础 - 打标签</h2><p>标签可以针对某一时间点的版本做标记,常用于版本发布。<br><a href="https://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE" target="_blank" rel="noopener">https://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80-%E6%89%93%E6%A0%87%E7%AD%BE</a></p><figure class="highlight crmsh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">tag</span> <span class="title"># 列显已有的标签</span></span><br><span class="line"><span class="title">git</span> <span class="keyword">tag</span> <span class="title"><name</span>> <span class="comment"># 新建一个标签,默认为 HEAD,也可以指定一个 commit id</span></span><br><span class="line">git <span class="keyword">tag</span> <span class="title">-a</span> v0.<span class="number">1.2</span> -m “<span class="number">0.1</span>.<span class="number">2</span>版本” <span class="comment"># 创建附注标签</span></span><br><span class="line">git <span class="keyword">tag</span> <span class="title">-s</span> <span class="tag"><tagname></span> -m <span class="string">"blablabla..."</span> <span class="comment"># 可以用PGP签名标签</span></span><br><span class="line">git checkout [tagname] <span class="comment"># 切换到标签</span></span><br><span class="line">git show v0.<span class="number">1.2</span> <span class="comment"># 查看标签的版本信息</span></span><br><span class="line">git <span class="keyword">tag</span> <span class="title">-d</span> v0.<span class="number">1.2</span> <span class="comment"># 删除标签</span></span><br><span class="line">git <span class="keyword">tag</span> <span class="title">-a</span> v0.<span class="number">1.1</span> <span class="number">9</span>fbc3d0 <span class="comment"># 补打标签</span></span><br><span class="line">git <span class="keyword">tag</span> <span class="title">-v</span> [<span class="keyword">tag</span>-name] <span class="comment"># (译注:取 verify 的首字母)的方式验证已经签署的标签。此命令会调用 GPG 来验证签名,所以你需要有签署者的公钥,存放在 keyring 中,才能验证</span></span><br><span class="line">git checkout -b [branch] [<span class="keyword">tag</span>] <span class="comment"># 新建一个分支,指向某个tag</span></span><br><span class="line"></span><br><span class="line">git push origin v0.<span class="number">1.2</span> <span class="comment"># 将 v0.1.2 标签提交到 git 服务器</span></span><br><span class="line">git push origin --tags <span class="comment"># 将本地所有标签一次性提交到 git 服务器</span></span><br><span class="line">git push origin :refs/tags/[tagName] <span class="comment"># 从远程删除</span></span><br><span class="line"></span><br><span class="line">git fetch origin <span class="keyword">tag</span> <span class="title">V1</span>.<span class="number">2</span> <span class="comment"># 精准拉取指定的某一个远程版本</span></span><br></pre></td></tr></table></figure><h2 id="Git-stash-改善工作流"><a href="#Git-stash-改善工作流" class="headerlink" title="Git stash 改善工作流"></a>Git stash 改善工作流</h2><p>备份当前的工作区的内容,从最近的一次提交中读取相关内容,让工作区保证和上次提交的内容一致。同时,将当前的工作区内容保存到 Git 栈中。<br><a href="http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/00137602359178794d966923e5c4134bc8bf98dfb03aea3000" target="_blank" rel="noopener">查看廖雪峰 git 教程详情</a></p><figure class="highlight perl"><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">git stash save <span class="string">"message..."</span> <span class="comment"># 这条命令实际上是 git stash 命令的完整版。git 会基于当前的提交信息自动创建评论。如果你更希望有自定义信息的话(因为它可能和前一个提交没有任何联系)</span></span><br><span class="line">git stash list <span class="comment"># 显示进度列表</span></span><br><span class="line">git stash apply <span class="comment"># 取出来</span></span><br><span class="line">git stash apply stash@{num}</span><br><span class="line">git stash drop <span class="comment"># 从堆栈上移除</span></span><br><span class="line">git stash <span class="keyword">pop</span> stash@{num} <span class="comment"># 取出然后从记录就删除</span></span><br><span class="line"></span><br><span class="line">git stash clear <span class="comment"># 删除所有存储的进度</span></span><br></pre></td></tr></table></figure><h2 id="Git-远程同步"><a href="#Git-远程同步" class="headerlink" title="Git 远程同步"></a>Git 远程同步</h2><figure class="highlight mipsasm"><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">git fetch [remote] <span class="comment"># 下载远程仓库的所有变动</span></span><br><span class="line">git remote <span class="comment"># 查看远程仓库信息</span></span><br><span class="line">git remote -v <span class="comment"># 显示当前所有远程库的详细信息,显示格式为 远程库名字 url 连接(类型)</span></span><br><span class="line">git remote <span class="keyword">show </span>[remote] <span class="comment"># 显示某个远程仓库的信息</span></span><br><span class="line">git remote <span class="keyword">add </span>[<span class="keyword">shortname] </span>[url] <span class="comment"># 增加一个新的远程仓库,并命名</span></span><br><span class="line">git pull [remote] [<span class="keyword">branch] </span><span class="comment"># 取回远程仓库的变化,并与本地分支合并</span></span><br><span class="line"></span><br><span class="line">git push [remote] [<span class="keyword">branch] </span><span class="comment"># 上传本地指定分支到远程仓库</span></span><br><span class="line">git push [remote] --force <span class="comment"># 强行推送当前分支到远程仓库,即使有冲突</span></span><br><span class="line">git push [remote] --all <span class="comment"># 推送所有分支到远程仓库</span></span><br></pre></td></tr></table></figure><p>假设现在想增加 3 个远程库地址</p><figure class="highlight avrasm"><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="symbol">https:</span>//git.oschina.net<span class="comment">/****/</span>*.git </span><br><span class="line"><span class="symbol">https:</span>//coding.net<span class="comment">/****/</span>*.git</span><br><span class="line"><span class="symbol">https:</span>//github.com<span class="comment">/****/</span>*.git</span><br></pre></td></tr></table></figure><p>首先,先增加第一个地址 <code>git remote add origin <url1></code><br>然后增加第二个地址 <code>git remote set-url --add origin <url2></code><br>增加第三个地址 <code>git remote set-url --add origin <url3></code><br>⋯ 依次类推</p><p>这样就完成了添加多个地址到 origin 库中了,<br>以后只要使用 <code>git push origin master</code> 就可以一次性 push 到 3 个库里面了(使用 <code>git push</code> 也可)</p><h2 id="生成一个可供发布的压缩包"><a href="#生成一个可供发布的压缩包" class="headerlink" title="生成一个可供发布的压缩包"></a>生成一个可供发布的压缩包</h2><p><code>git archive</code></p><h2 id="Github-贡献代码工作流"><a href="#Github-贡献代码工作流" class="headerlink" title="Github 贡献代码工作流"></a>Github 贡献代码工作流</h2><p><a href="http://www.jianshu.com/p/79454cf00945" target="_blank" rel="noopener">学习参考</a></p><ol><li>先 <code>Fork</code> 到自己的项目保持同步</li><li><code>Clone</code> 到本地,如果项目有依赖包,还要安装依赖包</li><li>进入本地项目目录,upstream 是你取的别名 <code>git remote add upstream [原作者项目url]</code></li><li>保持同步fetch(‘拿来、取来’) <code>git fetch upstream</code>,<code>git checkout master</code>,<code>git merge upstream/master</code>,<code>git push origin master</code>;或者 <code>git pull upstream master</code></li><li>创建分支 <code>git checkout -b [dev-rebase]</code></li><li>修改添加代码</li><li><code>git status</code>,<code>git add.</code>,<code>git commit -m '...'</code></li><li>写了 3 天多后考虑到那边可能更新了代码,执行 <code>git checkout master</code></li><li>同步 <code>git pull upstream master</code></li><li><code>git checkout [dev-rebase]</code></li><li><code>git rebase master</code></li><li>推送 <code>git push origin [dev-rebase]</code></li></ol><h2 id="Github-实用小技巧"><a href="#Github-实用小技巧" class="headerlink" title="Github 实用小技巧"></a>Github 实用小技巧</h2><ol><li>查看每日最新资讯 <code>https://github.com/trending/php</code></li><li>github 根据你 following 定期给你发一封邮件 <code>https://github.com/explore/subscribe</code></li><li>进入到别人的项目中按快捷键 <code>t</code> 进行模糊搜索</li><li><code>s</code> 定位到搜索框</li><li><code>gi</code> => issues</li><li><code>gp</code> => pulls</li></ol><h2 id="学习参考"><a href="#学习参考" class="headerlink" title="学习参考"></a>学习参考</h2><p><a href="https://kingofamani.gitbooks.io/git-teach/content/chapter_2/git_q_and_a.html" target="_blank" rel="noopener">https://kingofamani.gitbooks.io/git-teach/content/chapter_2/git_q_and_a.html</a><br><a href="http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html" target="_blank" rel="noopener">http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html</a><br><a href="http://rogerdudler.github.io/git-guide/index.zh.html" target="_blank" rel="noopener">http://rogerdudler.github.io/git-guide/index.zh.html</a><br><a href="https://www.atlassian.com/git/tutorials/setting-up-a-repository/&prev=search" target="_blank" rel="noopener">https://www.atlassian.com/git/tutorials/setting-up-a-repository/&prev=search</a><br><a href="http://backlogtool.com/git-guide/cn/intro/intro1_1.html" target="_blank" rel="noopener">http://backlogtool.com/git-guide/cn/intro/intro1_1.html</a><br><a href="https://github.com/geeeeeeeeek/git-recipes/blob/master/wiki/catagory.md" target="_blank" rel="noopener">https://github.com/geeeeeeeeek/git-recipes/blob/master/wiki/catagory.md</a></p>]]></content>
<summary type="html">
Git 作为版本管理的一个非常成熟的解决方案,在各个领域都得到了很好的应用。
</summary>
<category term="composer" scheme="http://blog.jybx.me/categories/composer/"/>
<category term="packagist" scheme="http://blog.jybx.me/categories/composer/packagist/"/>
<category term="git" scheme="http://blog.jybx.me/categories/composer/packagist/git/"/>
<category term="composer" scheme="http://blog.jybx.me/tags/composer/"/>
<category term="packagist" scheme="http://blog.jybx.me/tags/packagist/"/>
<category term="git" scheme="http://blog.jybx.me/tags/git/"/>
</entry>
<entry>
<title>Composer -- PHP 依赖管理的新时代</title>
<link href="http://blog.jybx.me/composer.html"/>
<id>http://blog.jybx.me/composer.html</id>
<published>2016-10-02T15:43:39.000Z</published>
<updated>2016-10-04T07:32:33.000Z</updated>
<content type="html"><![CDATA[<h1 id="Composer-–-PHP-依赖管理的新时代"><a href="#Composer-–-PHP-依赖管理的新时代" class="headerlink" title="Composer – PHP 依赖管理的新时代"></a>Composer – PHP 依赖管理的新时代</h1><blockquote><p>Composer 是 PHP 中的一个依赖管理工具. 它可以让你声明自己项目所依赖的库,然后它将会在项目中为你安装这些库。Composer 不是包管理器。是的,它实际上和”包”或者库打交道,但是它是以项目为单位进行管理,把它们安装到你项目中的一个目录(例如 vendor )。默认情况下它不会以全局的方式安装任何东西。因此,它是一个依赖管理器。</p></blockquote><h2 id="国内镜像"><a href="#国内镜像" class="headerlink" title="国内镜像"></a>国内镜像</h2><p><a href="http://pkg.phpcomposer.com/" target="_blank" rel="noopener">http://pkg.phpcomposer.com/</a></p><h2 id="全局安装"><a href="#全局安装" class="headerlink" title="全局安装"></a>全局安装</h2><p>Composer 需要 PHP 5.3.2+ 才能运行。<br>你可以把这个文件放到任何你想放的地方。如果你把它放到你的 PATH 中,你就可以全局访问它了。在类 unix 系统中你甚至可以使它可执行,并且调用的时候不需要 php。</p><figure class="highlight groovy"><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">curl -sS <span class="string">https:</span><span class="comment">//getcomposer.org/installer | php</span></span><br><span class="line">sudo mv composer.phar <span class="regexp">/usr/</span>local<span class="regexp">/bin/</span>composer</span><br></pre></td></tr></table></figure><p>然后,只需要执行 composer 命令来运行 <code>Composer</code>,而不是 php composer.phar。</p><h2 id="Windows-安装"><a href="#Windows-安装" class="headerlink" title="Windows 安装"></a>Windows 安装</h2><p>下载安装 <a href="https://getcomposer.org/Composer-Setup.exe" target="_blank" rel="noopener">https://getcomposer.org/Composer-Setup.exe</a><br>它将安装最新版本的 Composer ,并设置好系统的环境变量,因此你可以在任何目录下直接使用 composer 命令。</p><h3 id="手动安装"><a href="#手动安装" class="headerlink" title="手动安装"></a>手动安装</h3><p>设置系统的环境变量 PATH 并运行安装命令下载 composer.phar 文件:</p><figure class="highlight groovy"><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="string">C:</span>\Users\username>cd <span class="string">C:</span>\bin</span><br><span class="line"><span class="string">C:</span>\bin>php -r <span class="string">"readfile('https://getcomposer.org/installer');"</span> | php</span><br></pre></td></tr></table></figure><p>详情请查看手册文档 <a href="http://docs.phpcomposer.com/00-intro.html#Installation-Windows" target="_blank" rel="noopener">点击查看</a></p><h2 id="查看版本号"><a href="#查看版本号" class="headerlink" title="查看版本号"></a>查看版本号</h2><p><code>composer --version</code></p><h2 id="保持-Composer-一直是最新版本"><a href="#保持-Composer-一直是最新版本" class="headerlink" title="保持 Composer 一直是最新版本"></a>保持 Composer 一直是最新版本</h2><p><code>composer selfupdate</code></p><h2 id="在-mac-中用命令行时用-sublime-打开文件"><a href="#在-mac-中用命令行时用-sublime-打开文件" class="headerlink" title="在 mac 中用命令行时用 sublime 打开文件"></a>在 mac 中用命令行时用 sublime 打开文件</h2><p>如果是在默认 shell 下<br><code>sudo ln -s "/Applications/Sublime\ Text.app/Contents/SharedSupport/bin/subl" /usr/bin/subl</code></p><p>使用 zsh 的可以使用以下命令<br><code>vi ~/.zshrc</code></p><figure class="highlight routeros"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">alias <span class="attribute">subl</span>=<span class="string">"'/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl'"</span></span><br><span class="line">alias <span class="attribute">nano</span>=<span class="string">"subl"</span></span><br><span class="line"><span class="builtin-name">export</span> <span class="attribute">EDITOR</span>=<span class="string">"subl"</span></span><br></pre></td></tr></table></figure><p><code>source ~/.zshrc</code></p><h2 id="声明依赖"><a href="#声明依赖" class="headerlink" title="声明依赖"></a>声明依赖</h2><p>创建一个文件夹 test<br>在项目目录下创建一个 composer.json 文件,指明依赖,比如,你的项目依赖 monolog:</p><figure class="highlight json"><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><br><span class="line"> <span class="attr">"require"</span> : {</span><br><span class="line"> <span class="attr">"monolog/monolog"</span> : <span class="string">"1.2.*"</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="安装依赖"><a href="#安装依赖" class="headerlink" title="安装依赖"></a>安装依赖</h2><p>安装依赖非常简单,只需在项目目录下运行:<br><code>composer install</code></p><h2 id="自动加载"><a href="#自动加载" class="headerlink" title="自动加载"></a>自动加载</h2><p>Composer 提供了自动加载的特性,只需在你的代码的初始化部分中加入下面一行:</p><figure class="highlight coffeescript"><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">require</span> <span class="string">'vendor/autoload.php'</span>;</span><br></pre></td></tr></table></figure><h2 id="列出所有可用的软件包"><a href="#列出所有可用的软件包" class="headerlink" title="列出所有可用的软件包"></a>列出所有可用的软件包</h2><p><code>composer show</code></p><p>展示-参数</p><figure class="highlight haml"><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="ruby">-installed (-i): 列出已安装的依赖包。</span></span><br><span class="line"><span class="ruby">--platform (-p): 仅列出平台软件包(PHP 与它的扩展)。</span></span><br><span class="line"><span class="ruby">--<span class="keyword">self</span> (-s): 仅列出当前项目信息。</span></span><br></pre></td></tr></table></figure><h2 id="composer-常用命令"><a href="#composer-常用命令" class="headerlink" title="composer 常用命令"></a>composer 常用命令</h2><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><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">composer list 列出所有可用的命令</span><br><span class="line">composer init 初始化 composer<span class="selector-class">.json</span> 文件(就不劳我们自己费力创建啦),会要求输入一些信息来描述我们当前的项目,还会要求输入依赖包</span><br><span class="line">composer install 读取 composer<span class="selector-class">.json</span> 内容,解析依赖关系,安装依赖包到vendor目录下</span><br><span class="line">composer update 更新最新的依赖关系到 compsoer<span class="selector-class">.lock</span> 文件,解析最新的依赖关系并且写入composer.lock文件</span><br><span class="line">composer search packagename 搜索包,packagename 替换为你想查找的包名称</span><br><span class="line">composer require packagename 添加对 packagename 的依赖,packagename 可修改为你想要的包名称</span><br><span class="line">composer show packagename</span><br><span class="line">composer self-update 更新 composer<span class="selector-class">.phar</span> 文件自身</span><br><span class="line"></span><br><span class="line">composer command --help 以上所有命令都可以添加 --help选项查看帮助信息</span><br></pre></td></tr></table></figure><p>更多命令行,请看 <a href="http://docs.phpcomposer.com/03-cli.html" target="_blank" rel="noopener">http://docs.phpcomposer.com/03-cli.html</a></p><h2 id="更新-autoloader"><a href="#更新-autoloader" class="headerlink" title="更新 autoloader"></a>更新 autoloader</h2><p>比如在包中加入了一个新的类,需要执行 dump-autoload,而不必执行 install or update<br><code>composer dump-autoload</code></p><h2 id="创建项目-create-project"><a href="#创建项目-create-project" class="headerlink" title="创建项目 create-project"></a>创建项目 create-project</h2><p><code>composer create-project laravel/laravel</code></p><h2 id="模块仓库"><a href="#模块仓库" class="headerlink" title="模块仓库"></a>模块仓库</h2><p><a href="https://packagist.org/" target="_blank" rel="noopener">packagist.org</a> 是 Composer 的仓库,很多著名的 PHP 库都能在其中找到。你也可以提交你自己的作品。</p><h2 id="在-packagist-中提交项目"><a href="#在-packagist-中提交项目" class="headerlink" title="在 packagist 中提交项目"></a>在 packagist 中提交项目</h2><p>在 <a href="https://github.com/" target="_blank" rel="noopener">https://github.com/</a> 中上传项目:<br>在文件夹中创建 composer.json ,内容如下</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">{</span><br><span class="line"> <span class="attr">"name"</span>: <span class="string">"yourname/demo"</span>,</span><br><span class="line"> <span class="attr">"description"</span>: <span class="string">"this is a test"</span>,</span><br><span class="line"> <span class="attr">"type"</span>: <span class="string">"project"</span>,</span><br><span class="line"> <span class="attr">"license"</span>: <span class="string">"mit"</span>,</span><br><span class="line"> <span class="attr">"authors"</span>: [</span><br><span class="line"> {</span><br><span class="line"> <span class="attr">"name"</span>: <span class="string">"yourname"</span>,</span><br><span class="line"> <span class="attr">"email"</span>: <span class="string">"[email protected]"</span></span><br><span class="line"> }</span><br><span class="line"> ],</span><br><span class="line"> <span class="attr">"minimum-stability"</span>: <span class="string">"dev"</span>,</span><br><span class="line"> <span class="attr">"require"</span>: {}</span><br><span class="line">}</span><br></pre></td></tr></table></figure><p>当然你也可以直接 <code>composer init</code> 进行一步步填写</p><ol><li><p>先登录<br><img src="http://api.jybx.me/submit.png" alt="submit"></p></li><li><p>点击 submit 进行提交你在 github 上传好的项目链接<br><img src="http://api.jybx.me/login.png" alt="login"></p></li></ol><h2 id="composer-整合-github-实现自动推送"><a href="#composer-整合-github-实现自动推送" class="headerlink" title="composer 整合 github 实现自动推送"></a>composer 整合 github 实现自动推送</h2><ul><li>先在 packagist 上获取 token<br><img src="http://api.jybx.me/token1.png" alt="token1"></li></ul><p><img src="http://api.jybx.me/api.png" alt="api"></p><ul><li>再在 github 上你的项目上点击 settings<br><img src="http://api.jybx.me/setting.png" alt="setting"></li></ul><p><img src="http://api.jybx.me/token.png" alt="token"></p>]]></content>
<summary type="html">
Composer 是 PHP 中的一个依赖管理工具. 它可以让你声明自己项目所依赖的库,然后它将会在项目中为你安装这些库。
</summary>
<category term="composer" scheme="http://blog.jybx.me/categories/composer/"/>
<category term="packagist" scheme="http://blog.jybx.me/categories/composer/packagist/"/>
<category term="composer" scheme="http://blog.jybx.me/tags/composer/"/>
<category term="packagist" scheme="http://blog.jybx.me/tags/packagist/"/>
</entry>
<entry>
<title>mac 如何优雅的使用 phpStorm</title>
<link href="http://blog.jybx.me/mac-phpstorm-key.html"/>
<id>http://blog.jybx.me/mac-phpstorm-key.html</id>
<published>2016-09-17T08:38:47.000Z</published>
<updated>2016-09-17T08:48:56.000Z</updated>
<content type="html"><![CDATA[<h1 id="how-to-be-awesome-in-phpstorm"><a href="#how-to-be-awesome-in-phpstorm" class="headerlink" title="how-to-be-awesome-in-phpstorm"></a>how-to-be-awesome-in-phpstorm</h1><h2 id="下载安装"><a href="#下载安装" class="headerlink" title="下载安装"></a>下载安装</h2><p>官方下载地址:<a href="http://www.jetbrains.com/phpstorm/" target="_blank" rel="noopener">http://www.jetbrains.com/phpstorm/</a></p><h2 id="command-1-1-是数字"><a href="#command-1-1-是数字" class="headerlink" title="command + 1 (1 是数字)"></a>command + 1 (1 是数字)</h2><p>显示关闭左侧</p><h2 id="command-鼠标点击"><a href="#command-鼠标点击" class="headerlink" title="command + 鼠标点击"></a>command + 鼠标点击</h2><p>跳到类或方法或变量等声明处</p><h2 id="command-shift-tab"><a href="#command-shift-tab" class="headerlink" title="command + shift + tab"></a>command + shift + tab</h2><p>切换tab页文件</p><h2 id="command-shift"><a href="#command-shift" class="headerlink" title="command + shift + +,-"></a>command + shift + +,-</h2><p>展开或缩起</p><h2 id="command"><a href="#command" class="headerlink" title="command + ."></a>command + .</h2><p>折叠或展开选中的代码</p><h2 id="command-o"><a href="#command-o" class="headerlink" title="command + o"></a>command + o</h2><p>搜索类名的控制器</p><h2 id="command-option-o"><a href="#command-option-o" class="headerlink" title="command + option + o"></a>command + option + o</h2><p>搜索控制器中的方法</p><h2 id="command-shift-+-a"><a href="#command-shift-+-a" class="headerlink" title="command + shift + a"></a>command + shift + a</h2><p>搜索配置项, 比如 tab,top,plugins(安装插件),keymap<br>修改左侧的代码折叠线 folding outline</p><h2 id="command-+-,"><a href="#command-+-," class="headerlink" title="command + ,"></a>command + ,</h2><p>打开配置搜索 breadcrumbs,去掉勾保存,就是去掉了页面的面包屑</p><h2 id="command-+-control-+-g"><a href="#command-+-control-+-g" class="headerlink" title="command + control + g"></a>command + control + g</h2><p>选中相同的代码 </p><h2 id="字体大小设置"><a href="#字体大小设置" class="headerlink" title="字体大小设置"></a>字体大小设置</h2><p><img src="http://api.jybx.me/font-size-1.png" alt="font-size"></p><h2 id="Ide-配色"><a href="#Ide-配色" class="headerlink" title="Ide 配色"></a>Ide 配色</h2><p><a href="http://daylerees.github.io/" target="_blank" rel="noopener">主题网址</a><br>在上面的网址中挑选你喜欢的配色名字,在 <a href="https://github.com/daylerees/colour-schemes/blob/master/jetbrains/" target="_blank" rel="noopener">这里</a> 选择你的配置文件<br><code>cd ~/Library/Preferences/PhpStorm2016.1</code><br>PhpStorm2016.1 因你的文件名不同而改变<br><code>cd colors</code><br><code>wget https://raw.githubusercontent.com/daylerees/colour-schemes/master/jetbrains/gloom.icls</code></p><figure class="highlight lsl"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gloom.icls <span class="number">100</span>%[===================>] <span class="number">51.48</span>K <span class="number">96.1</span>KB/s in <span class="number">0.5</span>s</span><br></pre></td></tr></table></figure><p>表明已下载成功!<br>重启 ide 就可以查看到<br><img src="http://api.jybx.me/gloom.png" alt="gloom"></p><h2 id="去掉标签栏"><a href="#去掉标签栏" class="headerlink" title="去掉标签栏"></a>去掉标签栏</h2><p>去掉 Top 上的勾<br><img src="http://api.jybx.me/top.png" alt="top"></p><h2 id="统一左侧目录和右侧代码区域的颜色"><a href="#统一左侧目录和右侧代码区域的颜色" class="headerlink" title="统一左侧目录和右侧代码区域的颜色"></a>统一左侧目录和右侧代码区域的颜色</h2><p><code>command+,</code><br>搜索 plugins,点中间的,搜索 color ide 安装<br><img src="http://api.jybx.me/color-ide.png" alt="color-ide"></p><h2 id="修改快捷键"><a href="#修改快捷键" class="headerlink" title="修改快捷键"></a>修改快捷键</h2><p>File -> Settings -> IDE Settings -> Keymap -> 选择“eclipse” -> 然后 “Copy” 一份 -> 再个性化设置(自己习惯的)快捷键<br>同上搜索 keymap<br><img src="http://api.jybx.me/keymap.png" alt="keymap"></p><p><img src="http://api.jybx.me/reset.png" alt="reset"></p><p><img src="http://api.jybx.me/file.png" alt="file"></p><p><img src="http://api.jybx.me/fangfa.png" alt="fangfa"></p><p>按 <code>command R</code> 调出此页面<br><img src="http://api.jybx.me/functions.png" alt="functions"></p><h2 id="快速创建文件夹及目录"><a href="#快速创建文件夹及目录" class="headerlink" title="快速创建文件夹及目录"></a>快速创建文件夹及目录</h2><p><code>command ⬆️</code> 方向键上,选择你要在哪里创建<br><code>command N</code></p><h2 id="继承-Model"><a href="#继承-Model" class="headerlink" title="继承 Model"></a>继承 Model</h2><p><img src="http://api.jybx.me/model.png" alt="mode"></p><p><img src="http://api.jybx.me/extends-1.png" alt="extends"></p><p><img src="http://api.jybx.me/touch.png" alt="touch"></p><p><img src="http://api.jybx.me/my.png" alt="my"></p><h2 id="进行-PHP-代码风格设置"><a href="#进行-PHP-代码风格设置" class="headerlink" title="进行 PHP 代码风格设置"></a>进行 PHP 代码风格设置</h2><p><img src="http://api.jybx.me/style.png" alt="style"></p><h2 id="快速修改文件名字"><a href="#快速修改文件名字" class="headerlink" title="快速修改文件名字"></a>快速修改文件名字</h2><p><code>control T</code><br><img src="http://api.jybx.me/rename.png" alt="rename"></p><h2 id="Copy-为接口"><a href="#Copy-为接口" class="headerlink" title="Copy 为接口"></a>Copy 为接口</h2><p><img src="http://api.jybx.me/inter-1.png" alt="inte"></p><h2 id="定义为变量"><a href="#定义为变量" class="headerlink" title="定义为变量"></a>定义为变量</h2><p><img src="http://api.jybx.me/var.png" alt="va"></p><p><img src="http://api.jybx.me/str.png" alt="st"></p><h2 id="快速创建-PHP-construct-函数"><a href="#快速创建-PHP-construct-函数" class="headerlink" title="快速创建 PHP __construct() 函数"></a>快速创建 PHP __construct() 函数</h2><p><img src="http://api.jybx.me/constr.png" alt="const"></p><h2 id="依赖"><a href="#依赖" class="headerlink" title="依赖"></a>依赖</h2><p><img src="http://api.jybx.me/con.png" alt="con"></p><p>option + 回车<br><img src="http://api.jybx.me/class.png" alt="class"></p><p><img src="http://api.jybx.me/code.png" alt="code"></p><h2 id="分屏"><a href="#分屏" class="headerlink" title="分屏"></a>分屏</h2><p><img src="http://api.jybx.me/split.png" alt="split"></p><p><code>command w</code> 关闭分屏<br>你也可以为它们设置快捷键</p><h2 id="快速添加-namespace"><a href="#快速添加-namespace" class="headerlink" title="快速添加 namespace"></a>快速添加 namespace</h2><p><img src="http://api.jybx.me/name.png" alt="name"></p><p><img src="http://api.jybx.me/php.png" alt="php"></p><h2 id="如何导出个性化设置,备份或给他人用?"><a href="#如何导出个性化设置,备份或给他人用?" class="headerlink" title="如何导出个性化设置,备份或给他人用?"></a>如何导出个性化设置,备份或给他人用?</h2><ul><li>导出:File -> Exporting Settings</li><li>导入:File -> Importing Settings</li></ul><h2 id="mac-下直接用命令行模式下载-Composer"><a href="#mac-下直接用命令行模式下载-Composer" class="headerlink" title="mac 下直接用命令行模式下载 Composer"></a>mac 下直接用命令行模式下载 Composer</h2><ul><li>使用 curl 指令下载:<blockquote><p>curl -sS <a href="https://getcomposer.org/installer" target="_blank" rel="noopener">https://getcomposer.org/installer</a> | php</p></blockquote></li><li>或是沒有安裝 curl ,也可以用 php 指令下载:<blockquote><p>php -r “readfile(‘<a href="https://getcomposer.org/installer" target="_blank" rel="noopener">https://getcomposer.org/installer</a>‘);” | php</p></blockquote></li><li>手动下载 Composer<blockquote><p><a href="https://getcomposer.org/composer.phar" target="_blank" rel="noopener">https://getcomposer.org/composer.phar</a></p></blockquote></li></ul><h2 id="mv-composer-phar-usr-local-bin-composer"><a href="#mv-composer-phar-usr-local-bin-composer" class="headerlink" title="mv composer.phar /usr/local/bin/composer"></a>mv composer.phar /usr/local/bin/composer</h2>]]></content>
<summary type="html">
PhpStorm是一个轻量级且便捷的PHP IDE,其旨在提供用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查。
</summary>
<category term="phpStorm" scheme="http://blog.jybx.me/categories/phpStorm/"/>
<category term="phpStorm" scheme="http://blog.jybx.me/tags/phpStorm/"/>
</entry>
<entry>
<title>npm javascript 包管理</title>
<link href="http://blog.jybx.me/npm.html"/>
<id>http://blog.jybx.me/npm.html</id>
<published>2016-09-11T13:57:01.000Z</published>
<updated>2016-09-14T15:04:41.000Z</updated>
<content type="html"><![CDATA[<h1 id="npm-javascript-包管理"><a href="#npm-javascript-包管理" class="headerlink" title="npm javascript 包管理"></a>npm javascript 包管理</h1><h2 id="node-包管理器"><a href="#node-包管理器" class="headerlink" title="node 包管理器"></a>node 包管理器</h2><blockquote><p>Node 包管理器(Node Package Manager)。它是一个以 javascript 编写的软件包管理系统,默认环境为 Node.js,从Node.js0.6.3 版本开始,npm 被自动附带在安装包中。<br>npm 运行在命令行下,并用于管理相依性包,npm 也允许用户安装在 npm registry 上的 Node.js 应用程序。<br>npm 由 Isaac Z. Schlueter 开发,为了匹配 CommonJS 的规范,如 PHP 之于 (PEAR)、Perl 之于 (CPAN),进而开发出 npm。</p></blockquote><h2 id="Node-js-安装配置"><a href="#Node-js-安装配置" class="headerlink" title="Node.js 安装配置"></a>Node.js 安装配置</h2><p>Node.js 安装包及源码下载地址为:<a href="https://nodejs.org/en/download/" target="_blank" rel="noopener">https://nodejs.org/en/download/</a></p><p>显示 node 安装的版本号<br><code>node -v</code><br>显示 npm 的版本号<br><code>npm -v</code><br>在 mac 上更新 npm<br><code>sudo npm install npm --global</code> </p><h2 id="NPM-教程"><a href="#NPM-教程" class="headerlink" title="NPM 教程"></a>NPM 教程</h2><p><a href="http://www.runoob.com/nodejs/nodejs-npm.html" target="_blank" rel="noopener">NPM 使用介绍</a></p><h2 id="淘宝-NPM-镜像"><a href="#淘宝-NPM-镜像" class="headerlink" title="淘宝 NPM 镜像"></a>淘宝 NPM 镜像</h2><p><a href="https://npm.taobao.org/" target="_blank" rel="noopener">https://npm.taobao.org/</a></p><h2 id="使用-NPM-命令安装模块"><a href="#使用-NPM-命令安装模块" class="headerlink" title="使用 NPM 命令安装模块"></a>使用 NPM 命令安装模块</h2><p>从 <a href="http://npmjs.org" target="_blank" rel="noopener">http://npmjs.org</a> 维护的 public package registry 获取,模块可以使用 npm install 安装:<br><code>npm install <moduleName></code></p><h2 id="全局安装与本地安装"><a href="#全局安装与本地安装" class="headerlink" title="全局安装与本地安装"></a>全局安装与本地安装</h2><p>npm 的包安装分为本地安装(local)、全局安装(global)两种,从敲的命令行来看,差别只是有没有-g而已,比如</p><figure class="highlight cmake"><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">npm <span class="keyword">install</span> express <span class="comment"># 本地安装</span></span><br><span class="line">npm <span class="keyword">install</span> express -g <span class="comment"># 全局安装</span></span><br></pre></td></tr></table></figure><p>如果出现以下错误:<br><code>npm err! Error: connect ECONNREFUSED 127.0.0.1:8087</code></p><p>解决办法为:<br><code>npm config set proxy null</code></p><h2 id="查看所有全局安装的模块"><a href="#查看所有全局安装的模块" class="headerlink" title="查看所有全局安装的模块"></a>查看所有全局安装的模块</h2><p><code>npm ls -g</code></p><h2 id="卸载模块"><a href="#卸载模块" class="headerlink" title="卸载模块"></a>卸载模块</h2><p><code>npm uninstall express</code><br><code>npm uninstall express -g</code></p><p>卸载后,你可以到 /node_modules/ 目录下查看包是否还存在,或者使用以下命令查看:<br><code>npm ls</code></p><h2 id="查看模块信息"><a href="#查看模块信息" class="headerlink" title="查看模块信息"></a>查看模块信息</h2><p><code>npm info express</code></p><h2 id="安装特定的版本"><a href="#安装特定的版本" class="headerlink" title="安装特定的版本"></a>安装特定的版本</h2><p><code>npm install express@1.*.0</code></p><h2 id="使用-package-json"><a href="#使用-package-json" class="headerlink" title="使用 package.json"></a>使用 package.json</h2><p>在你的项目里面使用:<br><code>npm init</code><br>根据提示信息输入你想填入的<br>在最后输入 “yes” 后会生成 package.json 文件。</p><h2 id="Package-json-属性说明"><a href="#Package-json-属性说明" class="headerlink" title="Package.json 属性说明"></a>Package.json 属性说明</h2><blockquote><p>name - 包名。<br>version - 包的版本号。<br>description - 包的描述。<br>homepage - 包的官网 url 。<br>author - 包的作者姓名。<br>contributors - 包的其他贡献者姓名。<br>dependencies - 依赖包列表。如果依赖包没有安装,npm 会自动将依赖包安装在 node_module 目录下。<br>repository - 包代码存放的地方的类型,可以是 git 或 svn,git 可在 Github 上。<br>main - main 字段是一个模块ID,它是一个指向你程序的主要项目。就是说,如果你包的名字叫 express,然后用户安装它,然后 require(“express”)。<br>keywords - 关键字</p></blockquote><h2 id="保存模块到-Package-json"><a href="#保存模块到-Package-json" class="headerlink" title="保存模块到 Package.json"></a>保存模块到 Package.json</h2><p><code>npm install express --save</code><br>开发依赖<br><code>npm install express --save-dev</code><br>删除<br><code>npm uninstall express --save</code></p><h2 id="查看当前项目所有可更新的包"><a href="#查看当前项目所有可更新的包" class="headerlink" title="查看当前项目所有可更新的包"></a>查看当前项目所有可更新的包</h2><p><code>npm outdated</code></p><h2 id="更新的包"><a href="#更新的包" class="headerlink" title="更新的包"></a>更新的包</h2><p><code>npm update</code></p><h2 id="查看是否更新成功-gulp-是安装的包"><a href="#查看是否更新成功-gulp-是安装的包" class="headerlink" title="查看是否更新成功 (gulp 是安装的包)"></a>查看是否更新成功 (gulp 是安装的包)</h2><p><code>npm list | grep gulp</code></p><h2 id="安装-nrm"><a href="#安装-nrm" class="headerlink" title="安装 nrm"></a>安装 nrm</h2><p><code>npm install nrm -g</code></p><h2 id="查看可以使用的源"><a href="#查看可以使用的源" class="headerlink" title="查看可以使用的源"></a>查看可以使用的源</h2><p><code>nrm ls</code><br>测试连接这些源的速度<br><code>nrm test</code></p><h2 id="切换当前的源"><a href="#切换当前的源" class="headerlink" title="切换当前的源"></a>切换当前的源</h2><p><code>nrm use taobao</code></p>]]></content>
<summary type="html">
Node 包管理器(Node Package Manager)。它是一个以 javascript 编写的软件包管理系统,默认环境为 Node.js,从Node.js0.6.3 版本开始,npm 被自动附带在安装包中。
</summary>
<category term="npm" scheme="http://blog.jybx.me/categories/npm/"/>
<category term="nodejs" scheme="http://blog.jybx.me/categories/npm/nodejs/"/>
<category term="npm" scheme="http://blog.jybx.me/tags/npm/"/>
<category term="nodejs" scheme="http://blog.jybx.me/tags/nodejs/"/>
</entry>
<entry>
<title>使用 Hexo + Github Pages 搭建个人独立博客</title>
<link href="http://blog.jybx.me/hexo.html"/>
<id>http://blog.jybx.me/hexo.html</id>
<published>2016-09-03T16:11:53.000Z</published>
<updated>2016-12-17T11:10:28.000Z</updated>
<content type="html"><![CDATA[<h1 id="使用-Hexo-Github-Pages-搭建个人独立博客"><a href="#使用-Hexo-Github-Pages-搭建个人独立博客" class="headerlink" title="使用 Hexo + Github Pages 搭建个人独立博客"></a>使用 Hexo + Github Pages 搭建个人独立博客</h1><h2 id="什么是-Hexo-?"><a href="#什么是-Hexo-?" class="headerlink" title="什么是 Hexo ?"></a>什么是 Hexo ?</h2><blockquote><p>Hexo 是一个基于 Nodejs 快速简洁高效的博客框架,Hexo 使用 Markdown 语法来编辑文章,只需要几秒钟的时间就可以成生静态的网页。整个系统就是一个博客系统。</p></blockquote><h2 id="系统环境配置"><a href="#系统环境配置" class="headerlink" title="系统环境配置"></a>系统环境配置</h2><p>如果想使用 Hexo,需要在你的系统中支持 Nodejs 以及 Git,如果还没有,那就开始安装吧!</p><h2 id="安装-Node-js"><a href="#安装-Node-js" class="headerlink" title="安装 Node.js"></a>安装 Node.js</h2><p>进入官网:<em><a href="https://nodejs.org/en/" target="_blank" rel="noopener">https://nodejs.org/en/</a></em> 下载<br>参考地址:<a href="http://www.runoob.com/nodejs/nodejs-install-setup.html" target="_blank" rel="noopener">nodejs安装</a></p><h2 id="安装-Git"><a href="#安装-Git" class="headerlink" title="安装 Git"></a>安装 Git</h2><p>下载地址:<a href="https://git-scm.com/download/" target="_blank" rel="noopener">官网</a><br>入门教程:<em><a href="http://git.oschina.net/progit/" target="_blank" rel="noopener">http://git.oschina.net/progit/</a></em></p><h2 id="Github-Pages-设置"><a href="#Github-Pages-设置" class="headerlink" title="Github Pages 设置"></a>Github Pages 设置</h2><p>请自行注册账号,如有略过。<br>github 官网:<em><a href="https://github.com/" target="_blank" rel="noopener">https://github.com/</a></em></p><p>登陆之后,点击页面右上角的加号,选择 <code>New repository</code>,<br>进入代码库创建页面,在<code>Repository name</code>下填写 yourname.github.io,<code>Description (optional)</code>下填写一些简单的描述,然后保存。</p><h2 id="配置-SSH-密钥"><a href="#配置-SSH-密钥" class="headerlink" title="配置 SSH 密钥"></a>配置 SSH 密钥</h2><p>配置 Github 的 SSH 密钥可以让本地 git 项目与远程的 github 建立联系,让我们在本地写了代码之后直接通过 git 操作就可以实现本地代码库与 Github 代码库同步。操作如下:</p><ol><li><code>cd ~/. ssh</code></li><li><code>ssh-keygen -t rsa -C "[email protected]"</code></li><li>此时也可以输入特定的文件名,比如/Users/<em>**</em>/.ssh/github_rsa</li><li>根据提示,你需要输入密码和确认密码</li><li><code>cat ~/.ssh/github_rsa.pub</code> 并复制</li><li>登陆 GitHub,进入你的 Account Settings</li><li>选择 SSH Keys</li><li>粘贴密钥,添加即可</li><li><code>ssh -T [email protected]</code></li><li>输入yes就好,然后会看到</li><li><code>Hi ****! You've successfully authenticated, but GitHub does not provide shell access.</code></li><li><code>git config --global user.name "google"//用户名</code></li><li><code>git config --global user.email "[email protected]"//填写自己的邮箱</code></li></ol><h2 id="安装-Hexo"><a href="#安装-Hexo" class="headerlink" title="安装 Hexo"></a>安装 Hexo</h2><p>如果命令无法运行,可以尝试更换 taobao 的 npm 源</p><p><code>npm install -g cnpm --registry=https://registry.npm.taobao.org</code>**</p><blockquote><p>进入你的目录 <code>mkdir hexo && cd hexo</code></p><p>Hexo 是基于 Node.js 的第三方模块,所以我们需要对其进行单独安装。Windows 用户打开 CMD,输入代码:<br><code>npm install -g hexo</code></p><p>Mac 用户打开 Terminal,输入代码:<br><code>sudo npm install -g hexo</code></p><p>创建一个 Hexo 的新框架<br><code>hexo init</code></p><p><img src="http://api.jybx.me/hexo1.png" alt="hexo1"><br>生成一套静态网页<br><code>hexo generate</code></p><p>在服务器上运行<br><code>hexo server</code></p><p>输入完毕后,会提示你使用浏览器进入 <em><a href="http://localhost:4000/" target="_blank" rel="noopener">http://localhost:4000/</a></em></p><p>Hexo 常用的几个命令:</p><ol><li>hexo generate (hexo g) 生成静态文件,会在当前目录下生成一个新的叫做public的文件夹</li><li>hexo server (hexo s) 启动本地 web 服务,用于博客的预览</li><li>hexo deploy (hexo d) 部署播客到远端(比如 github, heroku 等平台)</li><li>hexo n “学习笔记” (hexo n) 新建一篇标题为 <code>学习笔记</code> 的文章 </li><li>hexo clean 清除缓存文件 db.json 和已生成的静态文件 public</li></ol></blockquote><h2 id="更换主题"><a href="#更换主题" class="headerlink" title="更换主题"></a>更换主题</h2><p>如你所见,默认的页面不好看。<br>进入官方主题库:<em><a href="https://github.com/hexojs/hexo/wiki/Themes" target="_blank" rel="noopener">https://github.com/hexojs/hexo/wiki/Themes</a></em><br>挑选你喜欢的主题,我这里是:<em><a href="https://github.com/iissnan/hexo-theme-next" target="_blank" rel="noopener">https://github.com/iissnan/hexo-theme-next</a></em><br>打开终端,进入到 Hexo 的目录下,继续输入:<br><code>cd themes</code><br><code>git clone https://github.com/iissnan/hexo-theme-next.git</code><br><code>cd hexo</code><br>根目录上的 _config.yml 文件<br><code>vi _config.yml</code></p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> Extensions</span></span><br><span class="line"><span class="meta">#</span><span class="bash"><span class="comment"># Plugins: https://hexo.io/plugins/</span></span></span><br><span class="line"><span class="meta">#</span><span class="bash"><span class="comment"># Themes: https://hexo.io/themes/</span></span></span><br><span class="line">theme: hexo-theme-next</span><br></pre></td></tr></table></figure><p><code>hexo generate</code><br><code>hexo server</code><br>进入 <em><a href="http://localhost:4000/" target="_blank" rel="noopener">http://localhost:4000/</a></em> 查看更换的主题<br>更多关于这款主题的配置请参考:<em><a href="http://theme-next.iissnan.com/getting-started.html" target="_blank" rel="noopener">http://theme-next.iissnan.com/getting-started.html</a></em> </p><h2 id="主题目录结构"><a href="#主题目录结构" class="headerlink" title="主题目录结构"></a>主题目录结构</h2><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><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">├── _config<span class="selector-class">.yml</span> <span class="comment">// 主题配置文件</span></span><br><span class="line">├── languages <span class="comment">// 多语言文件夹</span></span><br><span class="line">├── layout</span><br><span class="line">│ ├── archive<span class="selector-class">.swig</span> <span class="comment">// 存档页模板</span></span><br><span class="line">│ ├── category<span class="selector-class">.swig</span> <span class="comment">// 分类文章列表页模板</span></span><br><span class="line">│ ├── includes <span class="comment">// 各页面共享的模板</span></span><br><span class="line">│ │ ├── layout<span class="selector-class">.swig</span> <span class="comment">// 页面布局模板,其它的页面模板都是根据它扩展来的</span></span><br><span class="line">│ │ ├── pagination<span class="selector-class">.swig</span> <span class="comment">// 翻页按钮模板</span></span><br><span class="line">│ │ └── recent-posts<span class="selector-class">.swig</span> <span class="comment">// 文章列表模板</span></span><br><span class="line">│ ├── index<span class="selector-class">.swig</span> <span class="comment">// 首页模板</span></span><br><span class="line">│ ├── page<span class="selector-class">.swig</span> <span class="comment">// 页面详情页模板</span></span><br><span class="line">│ ├── post<span class="selector-class">.swig</span> <span class="comment">// 文章详情页模板</span></span><br><span class="line">│ └── tag<span class="selector-class">.swig</span> <span class="comment">// 标签文章列表页模板</span></span><br><span class="line">└── source</span><br><span class="line"> ├── css</span><br><span class="line"> │ └── theme<span class="selector-class">.styl</span> <span class="comment">// 主题自定义 CSS 文件</span></span><br><span class="line"> ├── favicon.ico</span><br><span class="line"> └── js</span><br><span class="line"> └── theme<span class="selector-class">.js</span> <span class="comment">// 主题 JavaScript 文件</span></span><br></pre></td></tr></table></figure><h2 id="添加-“标签”-页面"><a href="#添加-“标签”-页面" class="headerlink" title="添加 “标签” 页面"></a>添加 “标签” 页面</h2><p>定位到 Hexo 站点目录下<br>使用 <code>hexo new page</code> 新建一个页面,命名为 tags<br>编辑刚新建的页面,将页面的类型设置为 tags ,主题将自动为这个页面显示标签云。页面内容如下:</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">title:</span> <span class="string">标签</span></span><br><span class="line"><span class="attr">date:</span> <span class="number">2016</span><span class="bullet">-09</span><span class="bullet">-01</span> <span class="number">12</span><span class="string">:39:04</span></span><br><span class="line"><span class="attr">type:</span> <span class="string">"tags"</span></span><br><span class="line"><span class="meta">---</span></span><br></pre></td></tr></table></figure><p>!!! 一定要注意博文格式,如 title: 后面有空格,不然会报错,让人好郁闷啊!<br><code>ERROR Process failed: _posts/***.md</code></p><h2 id="安装-Hexo-插件"><a href="#安装-Hexo-插件" class="headerlink" title="安装 Hexo 插件"></a>安装 Hexo 插件</h2><p>为了避免一些麻烦的错误如:<code>error deployer not found git hexo</code> 请将下面的插件都安装完。</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><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">npm <span class="keyword">install</span> hexo-generator-<span class="keyword">index</span> <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-generator-<span class="keyword">search</span> <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-generator-<span class="keyword">archive</span> <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-generator-<span class="keyword">category</span> <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-generator-tag <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-<span class="keyword">server</span> <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-deployer-git <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-deployer-heroku <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-deployer-rsync <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-deployer-openshift <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-renderer-marked@<span class="number">0.2</span> <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-renderer-stylus@<span class="number">0.2</span> <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-generator-feed@<span class="number">1</span> <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-generator-sitemap@<span class="number">1</span> <span class="comment">--save</span></span><br><span class="line">npm <span class="keyword">install</span> hexo-generator-baidu-sitemap <span class="comment">--save</span></span><br></pre></td></tr></table></figure><h2 id="修改文章链接"><a href="#修改文章链接" class="headerlink" title="修改文章链接"></a>修改文章链接</h2><p>HEXO 默认的文章链接形式为 domain/year/month/day/postname,默认就是一个四级 url,并且可能造成 url 过长,对搜索引擎是十分不友好的,我们可以改成 domain/postname 的形式。编辑站点 _config.yml 文件,修改其中的 permalink 字段 <code>permalink: :year/:month/:day/:title/</code> 改为 <code>permalink: :title.html</code> 即可。</p><h2 id="给站点添加-sitemap-网站地图"><a href="#给站点添加-sitemap-网站地图" class="headerlink" title="给站点添加 sitemap 网站地图"></a>给站点添加 sitemap 网站地图</h2><p>Sitemap 可方便网站管理员通知搜索引擎他们网站上有哪些可供抓取的网页。 --摘自<a href="http://www.lovexing.cn/2016/03/15/%E5%8D%9A%E5%AE%A2%E4%BD%BF%E7%94%A8/" target="_blank" rel="noopener">万物</a><br>在 hexo 站点 _config.yml 中间添加代码</p><figure class="highlight avrasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"># hexo sitemap网站地图 </span></span><br><span class="line"><span class="symbol">sitemap:</span> </span><br><span class="line"><span class="symbol">path:</span> sitemap.xml </span><br><span class="line"><span class="symbol">baidusitemap:</span> </span><br><span class="line"><span class="symbol">path:</span> baidusitemap.xml</span><br></pre></td></tr></table></figure><p>执行 <code>hexo g</code> 即可生成这两个文件,sitemap 是提交给谷歌的,baidusitemap 是提交给百度的。</p><h2 id="添加蜘蛛协议robots-txt"><a href="#添加蜘蛛协议robots-txt" class="headerlink" title="添加蜘蛛协议robots.txt"></a>添加蜘蛛协议robots.txt</h2><p>在 hexo 目录下的 source 目录下,新建 robots.txt,复制代码:</p><figure class="highlight dts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"># hexo robots.txt</span></span><br><span class="line">User-agent: *</span><br><span class="line"><span class="symbol">Allow:</span> /</span><br><span class="line"></span><br><span class="line"><span class="symbol">Disallow:</span> <span class="meta-keyword">/js/</span></span><br><span class="line"><span class="symbol">Disallow:</span> <span class="meta-keyword">/css/</span></span><br><span class="line"><span class="symbol">Disallow:</span> <span class="meta-keyword">/fonts/</span></span><br><span class="line"></span><br><span class="line"><span class="symbol">Sitemap:</span> http:<span class="comment">//blog.jybx.me/sitemap.xml</span></span><br><span class="line"><span class="symbol">Sitemap:</span> http:<span class="comment">//blog.jybx.me/baidusitemap.xml</span></span><br></pre></td></tr></table></figure><p>将最后的域名改成自己的就可以了。</p><h2 id="绑定域名"><a href="#绑定域名" class="headerlink" title="绑定域名"></a>绑定域名</h2><p>在 hexo 项目的 source 目录下新建一个文件 CNAME (不需要后缀名)<br>在 CNAME 中添加一行(自己购买的域名),注意不需要http://。</p><h2 id="Hexo-上传-README-文件"><a href="#Hexo-上传-README-文件" class="headerlink" title="Hexo 上传 README 文件"></a>Hexo 上传 README 文件</h2><p><code>cd .deploy/</code><br><code>touch README.md</code><br><code>vi README.md</code></p><h2 id="将本地的-Hexo-文件更新到-Github-的库中"><a href="#将本地的-Hexo-文件更新到-Github-的库中" class="headerlink" title="将本地的 Hexo 文件更新到 Github 的库中"></a>将本地的 Hexo 文件更新到 Github 的库中</h2><blockquote><p>第一步、登录 Github 打开自己的项目 username.github.io<br>第二步、打开之后,点击 HTTPS,选择 HTTPS 类型地址<br>第三步、复制地址<br>第四步、打开你一开始创建的 Hexo 文件夹,编辑_config.yml 文件</p><figure class="highlight dts"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta"># Deployment</span></span><br><span class="line"><span class="meta">## Docs: https:<span class="comment">//hexo.io/docs/deployment.html</span></span></span><br><span class="line"><span class="symbol">deploy:</span></span><br><span class="line"><span class="symbol"> type:</span> git</span><br><span class="line"><span class="symbol"> repository:</span> https:<span class="comment">//github.com/****/****.github.io.git</span></span><br><span class="line"><span class="symbol"> branch:</span> master</span><br></pre></td></tr></table></figure></blockquote><p>执行 <code>hexo clean</code> (缓存问题)<br>执行 <code>hexo g -d</code></p><h2 id="更新到最新版本的-Hexo"><a href="#更新到最新版本的-Hexo" class="headerlink" title="更新到最新版本的 Hexo"></a>更新到最新版本的 Hexo</h2><p><code>npm update -g hexo /** 使用 npm 命令更新 Hexo **/</code><br>查看 Hexo 的版本<br><code>hexo version</code></p><figure class="highlight css"><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></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">hexo</span>: 3<span class="selector-class">.2</span><span class="selector-class">.2</span></span><br><span class="line"><span class="selector-tag">hexo-cli</span>: 1<span class="selector-class">.0</span><span class="selector-class">.2</span></span><br><span class="line"><span class="selector-tag">os</span>: <span class="selector-tag">Darwin</span> 15<span class="selector-class">.6</span><span class="selector-class">.0</span> <span class="selector-tag">darwin</span> <span class="selector-tag">x64</span></span><br><span class="line"><span class="selector-tag">http_parser</span>: 2<span class="selector-class">.7</span><span class="selector-class">.0</span></span><br><span class="line"><span class="selector-tag">node</span>: 6<span class="selector-class">.4</span><span class="selector-class">.0</span></span><br><span class="line"><span class="selector-tag">v8</span>: 5<span class="selector-class">.0</span><span class="selector-class">.71</span><span class="selector-class">.60</span></span><br><span class="line"><span class="selector-tag">uv</span>: 1<span class="selector-class">.9</span><span class="selector-class">.1</span></span><br><span class="line"><span class="selector-tag">zlib</span>: 1<span class="selector-class">.2</span><span class="selector-class">.8</span></span><br><span class="line"><span class="selector-tag">ares</span>: 1<span class="selector-class">.10</span><span class="selector-class">.1-DEV</span></span><br><span class="line"><span class="selector-tag">icu</span>: 57<span class="selector-class">.1</span></span><br><span class="line"><span class="selector-tag">modules</span>: 48</span><br><span class="line"><span class="selector-tag">openssl</span>: 1<span class="selector-class">.0</span><span class="selector-class">.2h</span></span><br></pre></td></tr></table></figure><h2 id="背景效果"><a href="#背景效果" class="headerlink" title="背景效果"></a>背景效果</h2><p>此效果摘自 <a href="http://ehlxr.me/2016/08/30/%E4%BD%BF%E7%94%A8Hexo%E5%9F%BA%E4%BA%8EGitHub-Pages%E6%90%AD%E5%BB%BA%E4%B8%AA%E4%BA%BA%E5%8D%9A%E5%AE%A2%EF%BC%88%E4%B8%89%EF%BC%89/" target="_blank" rel="noopener">一个程序猿之家</a><br>把 js 文件 <a href="https://github.com/ehlxr/ehlxr.github.io/blob/master/js/src/love.js" target="_blank" rel="noopener">love.js</a> 和 <a href="https://github.com/ehlxr/ehlxr.github.io/blob/master/js/src/particle.js" target="_blank" rel="noopener">particle.js</a> 放在 \themes\hexo-theme-next\source\js\src 文件目录下<br>更新 \themes\hexo-theme-next\layout_layout.swig 文件,在末尾(在前面引用会出现找不到的 bug)添加以下 js 引入代码:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!-- 背景动画 --></span></span><br><span class="line"><span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span> <span class="attr">src</span>=<span class="string">"/js/src/particle.js"</span>></span><span class="undefined"></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="comment"><!-- 页面点击小红心 --></span></span><br><span class="line"><span class="tag"><<span class="name">script</span> <span class="attr">type</span>=<span class="string">"text/javascript"</span> <span class="attr">src</span>=<span class="string">"/js/src/love.js"</span>></span><span class="undefined"></span><span class="tag"></<span class="name">script</span>></span></span><br></pre></td></tr></table></figure><h2 id="在-NexT-主题上增加留言板的功能"><a href="#在-NexT-主题上增加留言板的功能" class="headerlink" title="在 NexT 主题上增加留言板的功能"></a>在 NexT 主题上增加留言板的功能</h2><p>前提是已添加多说插件,查看原文 <a href="http://www.lovexing.cn/2016/04/29/NexT%E4%B8%BB%E9%A2%98%E6%96%B0%E5%BB%BA-%E7%95%99%E8%A8%80-%E9%A1%B5%E9%9D%A2/" target="_blank" rel="noopener">万物</a></p><blockquote><p>修改主题配置文件 _config.yml(要注意是 hexo-theme-next 目录下的 _config.yml,不是 hexo 站点目录下的 _config.yml),即 hexo 初始化目录下的 /themes/hexo-theme-next/_config.yml,添加 guestbook 到 menu 中:</p></blockquote><figure class="highlight dts"><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"><span class="symbol">menu:</span></span><br><span class="line"><span class="symbol"> home:</span> / </span><br><span class="line"> <span class="meta">#categories: /categories </span></span><br><span class="line"><span class="symbol"> about:</span> /about </span><br><span class="line"><span class="symbol"> archives:</span> /archives </span><br><span class="line"><span class="symbol"> tags:</span> /tags </span><br><span class="line"> <span class="meta">#commonweal: /404.html </span></span><br><span class="line"><span class="symbol"> guestbook:</span> /guestbook</span><br></pre></td></tr></table></figure><p>这样就在网站 menu 中增加了一个菜单:guestbook,此时留言板还没有真的实现。</p><blockquote><p>修改 hexo-theme-next/languages 文件目录中的 zh-Hans.yml 文件(我用的是简体中文的,其他语言也是类似的),即 hexo 初始化目录下 /themes/hexo-theme-next/languages/zh-Hans.yml,添加 guestbook: 留言 到 menu 中</p></blockquote><figure class="highlight dts"><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="symbol">menu:</span></span><br><span class="line"><span class="symbol"> home:</span> 首页</span><br><span class="line"><span class="symbol"> archives:</span> 归档</span><br><span class="line"><span class="symbol"> categories:</span> 分类</span><br><span class="line"><span class="symbol"> tags:</span> 标签</span><br><span class="line"><span class="symbol"> about:</span> 关于</span><br><span class="line"><span class="symbol"> search:</span> 搜索</span><br><span class="line"><span class="symbol"> commonweal:</span> 公益<span class="number">404</span></span><br><span class="line"><span class="symbol"> guestbook:</span> 留言</span><br></pre></td></tr></table></figure><p>这样在网站上就可以显示中文留言两个字。</p><blockquote><p>新建guestbook页面,执行 <code>hexo new page "guestbook"</code>。此时会在 hexo 初始化目录下的 /source 中看到名为 guestbook 的文件夹,在 index.md 中添加 comments: true 如</p></blockquote><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="attr">title:</span> <span class="string">guestbook</span></span><br><span class="line"><span class="attr">date:</span> <span class="number">2016</span><span class="bullet">-09</span><span class="bullet">-15</span> <span class="number">14</span><span class="string">:44:19</span></span><br><span class="line"><span class="attr">comments:</span> <span class="literal">true</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"><span class="string">> 最近访客</span></span><br><span class="line"><span class="string"><div class="ds-recent-visitors" data-num-items="28" data-avatar-size="42" id="ds-recent-visitors"></div></span></span><br></pre></td></tr></table></figure><blockquote><p>class=“ds-recent-visitors” //指定显示最近访客容器<br>data-num-items=“28” //显示最近访客的数量<br>data-avatar-size=“42” //显示最近访客头像尺寸大小<br>id=“ds-recent-visitors” //为了调节最近访客样式加的</p></blockquote><h2 id="添加音乐播放器功能"><a href="#添加音乐播放器功能" class="headerlink" title="添加音乐播放器功能"></a>添加音乐播放器功能</h2><p>在网易音乐的中,生成外链播放器代码,放入刚才 guestbook 文件夹中的 index.md。--摘自 <a href="http://www.iamlj.com/2016/07/add-music-player-function-for-hexo/" target="_blank" rel="noopener">jing’s</a></p><figure class="highlight xml"><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></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: guestbook</span><br><span class="line">date: 2016-09-15 14:44:19</span><br><span class="line">comments: true</span><br><span class="line">---</span><br><span class="line">> 最近访客</span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"ds-recent-visitors"</span> <span class="attr">data-num-items</span>=<span class="string">"28"</span> <span class="attr">data-avatar-size</span>=<span class="string">"42"</span> <span class="attr">id</span>=<span class="string">"ds-recent-visitors"</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- 只显示播放器 --></span></span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">style</span>=<span class="string">"max-width: 350px;max-height: 150px"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">embed</span> <span class="attr">style</span>=<span class="string">"margin-top: -35px;"</span> <span class="attr">frameborder</span>=<span class="string">"no"</span> <span class="attr">border</span>=<span class="string">"0"</span><span class="attr">marginwidth</span>=<span class="string">"0"</span> <span class="attr">marginheight</span>=<span class="string">"0"</span> <span class="attr">src</span>=<span class="string">"http://music.163.com/outchain/player?type=2&id=3413782&auto=1&height=66"</span>></span><span class="tag"></<span class="name">embed</span>></span></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br></pre></td></tr></table></figure><h2 id="自定义头像样式"><a href="#自定义头像样式" class="headerlink" title="自定义头像样式"></a>自定义头像样式</h2><p>在 hexo/themes/hexo-theme-next/source/css/_common/components/sidebar 目录下修改 <code>vi sidebar.styl</code> ,将以下代码加在最后</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.site-author-image</span> {</span><br><span class="line"> <span class="attribute">display</span>: block;</span><br><span class="line"> <span class="attribute">margin</span>: <span class="number">0</span> auto;</span><br><span class="line"> <span class="attribute">max-width</span>: <span class="number">96px</span>;</span><br><span class="line"> <span class="attribute">height</span>: auto;</span><br><span class="line"> <span class="attribute">padding</span>: <span class="number">2px</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="comment">/* start*/</span></span><br><span class="line"> <span class="attribute">border-radius</span>: <span class="number">90%</span></span><br><span class="line"> webkit-transition: <span class="number">1.4s</span> all;</span><br><span class="line"> <span class="attribute">moz-transition</span>: <span class="number">1.4s</span> all;</span><br><span class="line"> <span class="attribute">ms-transition</span>: <span class="number">1.4s</span> all;</span><br><span class="line"> <span class="attribute">transition</span>: <span class="number">1.4s</span> all;</span><br><span class="line"> <span class="comment">/* end */</span></span><br><span class="line">}</span><br><span class="line"><span class="selector-class">.site-author-image</span><span class="selector-pseudo">:hover</span> {</span><br><span class="line"> <span class="attribute">transform</span>: <span class="built_in">rotateZ</span>(360deg);</span><br><span class="line"> <span class="attribute">-webkit-transform</span>: <span class="built_in">rotateZ</span>(360deg);</span><br><span class="line"> <span class="attribute">-moz-transform</span>: <span class="built_in">rotateZ</span>(360deg);</span><br><span class="line">}</span><br></pre></td></tr></table></figure><h2 id="用-Hexo-发表新文章"><a href="#用-Hexo-发表新文章" class="headerlink" title="用 Hexo 发表新文章"></a>用 Hexo 发表新文章</h2><p><code>hexo n "文章标题"</code></p><h2 id="MWeb-篇"><a href="#MWeb-篇" class="headerlink" title="MWeb 篇"></a>MWeb 篇</h2><p>打开 MWeb, Command + E 切换到外部模式(使用 cmd + L 可以切回默认的 library 模式), 然后把 hexo 下的 source 目录拖到左边, 设置它的 Display name 为 github blog (随意), 最重要一点是设置 Media Save Path 为 Absolute, 这样就可以直接使用 MWeb 的粘贴图片功能。<br><img src="http://www.cyper.me/media/14656594763908.jpg" alt=""></p><p>这样写新博客使用 hexo n “your new blog title”命令即可, MWeb 会监控到新生成的 md 文件并自动显示在当前的视图中, 在 MWeb 中编辑好后, 使用<code>hexo d -g</code>直接发布。</p><h2 id="文章正文内容详情"><a href="#文章正文内容详情" class="headerlink" title="文章正文内容详情"></a>文章正文内容详情</h2><figure class="highlight yaml"><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"><span class="attr">title:</span> <span class="string">postName</span> <span class="comment">#文章页面上的显示名称,可以任意修改,不会出现在URL中</span></span><br><span class="line"><span class="attr">date:</span> <span class="number">2016</span><span class="bullet">-09</span><span class="bullet">-04</span> <span class="number">00</span><span class="string">:11:53</span> <span class="comment">#文章生成时间,一般不改,当然也可以任意修改</span></span><br><span class="line"><span class="attr">categories:</span> <span class="string">example</span> <span class="comment">#分类</span></span><br><span class="line"><span class="attr">tags:</span> <span class="string">[tag1,tag2,tag3]</span> <span class="comment">#文章标签,可空,多标签请用格式,注意:后面有个空格</span></span><br><span class="line"><span class="attr">description:</span> <span class="string">附加一段文章摘要,字数最好在140字以内。</span></span><br><span class="line"><span class="meta">---</span></span><br><span class="line"></span><br><span class="line"><span class="string">以下正文</span></span><br></pre></td></tr></table></figure><h2 id="七牛图床设置详细说明"><a href="#七牛图床设置详细说明" class="headerlink" title="七牛图床设置详细说明"></a>七牛图床设置详细说明</h2><p>如下图,进入 MWeb 的偏好设置 - 发布服务里,本地图片上传服务中,点右边的 七牛云存储 按钮,会跳出如下图的新增窗口:<br><img src="http://zh.mweb.im/media/14531669957228/14531677609529.jpg" alt=""></p>]]></content>
<summary type="html">
Hexo 是一个基于 Nodejs 快速简洁高效的博客框架,Hexo 使用 Markdown 语法来编辑文章,只需要几秒钟的时间就可以成生静态的网页。整个系统就是一个博客系统。
</summary>
<category term="hexo" scheme="http://blog.jybx.me/categories/hexo/"/>
<category term="github" scheme="http://blog.jybx.me/categories/hexo/github/"/>
<category term="hexo" scheme="http://blog.jybx.me/tags/hexo/"/>
<category term="github" scheme="http://blog.jybx.me/tags/github/"/>
<category term="七牛云" scheme="http://blog.jybx.me/tags/%E4%B8%83%E7%89%9B%E4%BA%91/"/>
<category term="mweb" scheme="http://blog.jybx.me/tags/mweb/"/>
</entry>
<entry>
<title>Mac Terminal 终端 配置 zsh</title>
<link href="http://blog.jybx.me/Mac-Terminal-zsh.html"/>
<id>http://blog.jybx.me/Mac-Terminal-zsh.html</id>
<published>2016-04-25T02:36:31.000Z</published>
<updated>2016-09-14T15:12:42.000Z</updated>
<content type="html"><![CDATA[<h1 id="Mac-Terminal-终端-配置-zsh"><a href="#Mac-Terminal-终端-配置-zsh" class="headerlink" title="Mac Terminal 终端 配置 zsh"></a>Mac Terminal 终端 配置 zsh</h1><h2 id="Mac-自带-zsh,还是比较方便的哈"><a href="#Mac-自带-zsh,还是比较方便的哈" class="headerlink" title="Mac 自带 zsh,还是比较方便的哈"></a>Mac 自带 zsh,还是比较方便的哈</h2><p>首先,把 Terminal 的 shell 改一下:<br><code>chsh -s /bin/zsh</code><br>修改下你的 Terminal 的 ‘偏好设置’</p><h2 id="oh-my-zsh-安装"><a href="#oh-my-zsh-安装" class="headerlink" title="oh-my-zsh 安装"></a>oh-my-zsh 安装</h2><p><a href="https://github.com/robbyrussell/oh-my-zsh" target="_blank" rel="noopener">oh-my-zsh 安装</a></p><ol><li><code>git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh</code></li><li><code>cp ~/.zshrc ~/.zshrc.orig</code> (此步可选)</li><li><code>cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc</code></li></ol><h2 id="zsh-autosuggestions-安装自动提示"><a href="#zsh-autosuggestions-安装自动提示" class="headerlink" title="zsh-autosuggestions 安装自动提示"></a>zsh-autosuggestions 安装自动提示</h2><p><a href="https://github.com/zsh-users/zsh-autosuggestions" target="_blank" rel="noopener">zsh-autosuggestions 安装自动提示</a></p><ol><li><code>git clone git://github.com/zsh-users/zsh-autosuggestions ~/.zsh/zsh-autosuggestions</code></li><li>编辑 .zshrc 添加 source ~/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh</li><li>执行 <code>source .zshrc</code> </li></ol><h2 id="添加主机名"><a href="#添加主机名" class="headerlink" title="添加主机名"></a>添加主机名</h2><blockquote><pre><code>vim ~/.oh-my-zsh/themes/robbyrussell.zsh-theme</code></pre><p>注释原来的并添加下一句:</p></blockquote><pre><code>PROMPT='${ret_status}%M%{$fg_bold[green]%}%p %{$fg[cyan]%}%c %{$fg_bold[blue]%}$(git_prompt_info)%{$fg_bold[blue]%} % %{$reset_color%}'</code></pre><h2 id="主题"><a href="#主题" class="headerlink" title="主题"></a>主题</h2><p><a href="https://github.com/robbyrussell/oh-my-zsh/wiki/Themes" target="_blank" rel="noopener">oh-my-zsh 主题自选</a></p><blockquote><p>编辑 .zshrc<br><strong>修改 ZSH_THEME=robbyrussell</strong><br>执行 <code>source .zshrc</code> </p></blockquote><h2 id="oh-my-zsh-不能更新方法"><a href="#oh-my-zsh-不能更新方法" class="headerlink" title="oh-my-zsh 不能更新方法"></a>oh-my-zsh 不能更新方法</h2><blockquote><ol><li>cd ~/.oh-my-zsh/</li><li>git add .</li><li>git commit -m “commit message”</li><li>upgrade_oh_my_zsh</li></ol></blockquote>]]></content>
<summary type="html">
Mac Terminal 终端 配置 zsh
</summary>
<category term="Mac" scheme="http://blog.jybx.me/categories/Mac/"/>
<category term="Terminal" scheme="http://blog.jybx.me/categories/Mac/Terminal/"/>
<category term="Zsh" scheme="http://blog.jybx.me/categories/Mac/Terminal/Zsh/"/>
<category term="Mac" scheme="http://blog.jybx.me/tags/Mac/"/>
<category term="Terminal" scheme="http://blog.jybx.me/tags/Terminal/"/>
<category term="Zsh" scheme="http://blog.jybx.me/tags/Zsh/"/>
</entry>
<entry>
<title>孙子兵法</title>
<link href="http://blog.jybx.me/sunzibingfa.html"/>
<id>http://blog.jybx.me/sunzibingfa.html</id>
<published>2016-01-18T10:42:07.000Z</published>
<updated>2016-09-16T09:05:30.000Z</updated>
<content type="html"><![CDATA[<h1 id="孙子兵法十三篇-孙武"><a href="#孙子兵法十三篇-孙武" class="headerlink" title="孙子兵法十三篇-孙武"></a>孙子兵法十三篇-孙武</h1><blockquote><p>人事管理:人的事物的管理,不太主观管人。</p></blockquote><h5 id="人事管理一定要有制度"><a href="#人事管理一定要有制度" class="headerlink" title="人事管理一定要有制度"></a>人事管理一定要有制度</h5><h5 id="经营理念很重要(薪资结构)"><a href="#经营理念很重要(薪资结构)" class="headerlink" title="经营理念很重要(薪资结构)"></a>经营理念很重要(薪资结构)</h5><h5 id="人是无法说服的"><a href="#人是无法说服的" class="headerlink" title="人是无法说服的"></a>人是无法说服的</h5><h5 id="当主管自己要情绪稳定"><a href="#当主管自己要情绪稳定" class="headerlink" title="当主管自己要情绪稳定"></a>当主管自己要情绪稳定</h5><h5 id="尽心尽力的是少数人"><a href="#尽心尽力的是少数人" class="headerlink" title="尽心尽力的是少数人"></a>尽心尽力的是少数人</h5><h5 id="不要把人逼到无路可走"><a href="#不要把人逼到无路可走" class="headerlink" title="不要把人逼到无路可走"></a>不要把人逼到无路可走</h5><h5 id="激励不能过分"><a href="#激励不能过分" class="headerlink" title="激励不能过分"></a>激励不能过分</h5><h5 id="看到员工,第一句话不要讲工作"><a href="#看到员工,第一句话不要讲工作" class="headerlink" title="看到员工,第一句话不要讲工作"></a>看到员工,第一句话不要讲工作</h5><h5 id="公司有没有向心力很重要,同心之后才能一心"><a href="#公司有没有向心力很重要,同心之后才能一心" class="headerlink" title="公司有没有向心力很重要,同心之后才能一心"></a>公司有没有向心力很重要,同心之后才能一心</h5><h5 id="部属能做的主管不要去做,部属能说的主管不要说"><a href="#部属能做的主管不要去做,部属能说的主管不要说" class="headerlink" title="部属能做的主管不要去做,部属能说的主管不要说"></a>部属能做的主管不要去做,部属能说的主管不要说</h5><h5 id="部属能想的你就不要想,即便在想了也要隐蔽你的想法,让他想,让他讲。主管要启发,不能用力"><a href="#部属能想的你就不要想,即便在想了也要隐蔽你的想法,让他想,让他讲。主管要启发,不能用力" class="headerlink" title="部属能想的你就不要想,即便在想了也要隐蔽你的想法,让他想,让他讲。主管要启发,不能用力"></a>部属能想的你就不要想,即便在想了也要隐蔽你的想法,让他想,让他讲。主管要启发,不能用力</h5><h5 id="主管不要说变就变,要造成对方非变不可"><a href="#主管不要说变就变,要造成对方非变不可" class="headerlink" title="主管不要说变就变,要造成对方非变不可"></a>主管不要说变就变,要造成对方非变不可</h5><h5 id="要动机很纯正,然后来有一些花样"><a href="#要动机很纯正,然后来有一些花样" class="headerlink" title="要动机很纯正,然后来有一些花样"></a>要动机很纯正,然后来有一些花样</h5><h5 id="水有目标,但是没有方向"><a href="#水有目标,但是没有方向" class="headerlink" title="水有目标,但是没有方向"></a>水有目标,但是没有方向</h5><h5 id="要注意小的问题"><a href="#要注意小的问题" class="headerlink" title="要注意小的问题"></a>要注意小的问题</h5><h5 id="越强调一件事情的时候,这个就是你的弱点"><a href="#越强调一件事情的时候,这个就是你的弱点" class="headerlink" title="越强调一件事情的时候,这个就是你的弱点"></a>越强调一件事情的时候,这个就是你的弱点</h5><h5 id="一个慈爱为怀的人不宜当将军,因为下不了决心"><a href="#一个慈爱为怀的人不宜当将军,因为下不了决心" class="headerlink" title="一个慈爱为怀的人不宜当将军,因为下不了决心"></a>一个慈爱为怀的人不宜当将军,因为下不了决心</h5><h5 id="有情有义的狠,就是合理"><a href="#有情有义的狠,就是合理" class="headerlink" title="有情有义的狠,就是合理"></a>有情有义的狠,就是合理</h5><h5 id="要正心,把心摆在中间"><a href="#要正心,把心摆在中间" class="headerlink" title="要正心,把心摆在中间"></a>要正心,把心摆在中间</h5><h5 id="心里是非分明,嘴里含含糊糊"><a href="#心里是非分明,嘴里含含糊糊" class="headerlink" title="心里是非分明,嘴里含含糊糊"></a>心里是非分明,嘴里含含糊糊</h5><h5 id="为目的而行动,不可为了行动而行动,不能为了细节却忽略了主题(决策就是大小轻重缓急)"><a href="#为目的而行动,不可为了行动而行动,不能为了细节却忽略了主题(决策就是大小轻重缓急)" class="headerlink" title="为目的而行动,不可为了行动而行动,不能为了细节却忽略了主题(决策就是大小轻重缓急)"></a>为目的而行动,不可为了行动而行动,不能为了细节却忽略了主题(决策就是大小轻重缓急)</h5><h5 id="性相近,习相远"><a href="#性相近,习相远" class="headerlink" title="性相近,习相远"></a>性相近,习相远</h5><h5 id="对人立法严,执法宽"><a href="#对人立法严,执法宽" class="headerlink" title="对人立法严,执法宽"></a>对人立法严,执法宽</h5><h2 id="中国的兵法的特征"><a href="#中国的兵法的特征" class="headerlink" title="中国的兵法的特征"></a>中国的兵法的特征</h2><blockquote><p>以人为中心,掌握人性<br> 以水为对象,模拟学习<br> 以中为标准,力求合理</p></blockquote><h2 id="等待是一种艺术"><a href="#等待是一种艺术" class="headerlink" title="等待是一种艺术"></a>等待是一种艺术</h2><blockquote><p>急事要缓办</p></blockquote><h2 id="四治"><a href="#四治" class="headerlink" title="四治"></a>四治</h2><h4 id="治心:治理员工的心"><a href="#治心:治理员工的心" class="headerlink" title="治心:治理员工的心"></a>治心:治理员工的心</h4><h6 id="治心-关怀导向"><a href="#治心-关怀导向" class="headerlink" title="治心-关怀导向"></a>治心-关怀导向</h6><blockquote><p>自己安定,待敌混乱<br> 自己沉着,待敌浮躁<br> 自己情绪稳定,凡事谋定而后动</p></blockquote><h4 id="治力:治理员工的力量"><a href="#治力:治理员工的力量" class="headerlink" title="治力:治理员工的力量"></a>治力:治理员工的力量</h4><h6 id="治力"><a href="#治力" class="headerlink" title="治力"></a>治力</h6><blockquote><p>利用地形,待敌来攻<br> 以逸待劳,以饱待饥<br> 利用形势少用权力,谆谆善诱不费力</p></blockquote><h4 id="治变:怎么让他自动的变,而不是我叫他变"><a href="#治变:怎么让他自动的变,而不是我叫他变" class="headerlink" title="治变:怎么让他自动的变,而不是我叫他变"></a>治变:怎么让他自动的变,而不是我叫他变</h4><h6 id="治变"><a href="#治变" class="headerlink" title="治变"></a>治变</h6><blockquote><p>不要正面冲突,出其不意<br> 自己立场先站稳,造成情势引导员工变动</p></blockquote><h4 id="治气:怎么把士气诱导到最有利的方向去"><a href="#治气:怎么把士气诱导到最有利的方向去" class="headerlink" title="治气:怎么把士气诱导到最有利的方向去"></a>治气:怎么把士气诱导到最有利的方向去</h4><h6 id="治气"><a href="#治气" class="headerlink" title="治气"></a>治气</h6><blockquote><p>士气旺盛,退避<br> 士气低落,攻击<br> 多用正气,阳气,维持正常士气</p></blockquote><h2 id="布局造势摆平"><a href="#布局造势摆平" class="headerlink" title="布局造势摆平"></a>布局造势摆平</h2><blockquote><p>示形之术(诱敌之术)设法让员工/顾客自发自动<br> 激流之计(加速效果)引发潜在能力,提高绩效<br> 两面手法(持续发挥)知己知彼才能百战不殆</p></blockquote><h2 id="兵势篇"><a href="#兵势篇" class="headerlink" title="兵势篇"></a>兵势篇</h2><blockquote><p>要操作敌人,必须造成一种状况,使敌人自动自发地行动,如能灵活地加以运用,则敌人将不战自败。</p></blockquote><h2 id="虚实篇"><a href="#虚实篇" class="headerlink" title="虚实篇"></a>虚实篇</h2><blockquote><p>让敌人依照我方的安排行动,不断攻击下来,须让他们自认为对本身有利,而不让对方觉察不利,否则敌人便不会来,强制不如诱敌。</p></blockquote><h2 id="地形篇"><a href="#地形篇" class="headerlink" title="地形篇"></a>地形篇</h2><blockquote><p>知己知彼,百胜不殆(中心思想)<br> 知天知地,胜利无穷</p></blockquote><h2 id="将有五危"><a href="#将有五危" class="headerlink" title="将有五危"></a>将有五危</h2><h5 id="必死"><a href="#必死" class="headerlink" title="必死"></a>必死</h5><p>无谓的牺牲</p><h5 id="必有援兵"><a href="#必有援兵" class="headerlink" title="必有援兵"></a>必有援兵</h5><p>就会被俘</p><h5 id="必怒"><a href="#必怒" class="headerlink" title="必怒"></a>必怒</h5><p>不能忍辱,易陷入敌计</p><h5 id="过分爱名"><a href="#过分爱名" class="headerlink" title="过分爱名"></a>过分爱名</h5><p>易被造谣中伤</p><h5 id="过分爱民"><a href="#过分爱民" class="headerlink" title="过分爱民"></a>过分爱民</h5><p>影响作战</p><h2 id="领导用人之道"><a href="#领导用人之道" class="headerlink" title="领导用人之道"></a>领导用人之道</h2><blockquote><p>不拘小节,能综合看大体<br> 不拘泥相对性的一面<br> 不因小失大,看近不看远</p></blockquote><h2 id="人事管理八大要领"><a href="#人事管理八大要领" class="headerlink" title="人事管理八大要领"></a>人事管理八大要领</h2><h5 id="进退(好聚好散)"><a href="#进退(好聚好散)" class="headerlink" title="进退(好聚好散)"></a>进退(好聚好散)</h5><h5 id="奖惩(先奖下面先罚上面)"><a href="#奖惩(先奖下面先罚上面)" class="headerlink" title="奖惩(先奖下面先罚上面)"></a>奖惩(先奖下面先罚上面)</h5><h5 id="教养"><a href="#教养" class="headerlink" title="教养"></a>教养</h5><h5 id="老死"><a href="#老死" class="headerlink" title="老死"></a>老死</h5>]]></content>
<summary type="html">
人事管理:人的事物的管理,不太主观管人
</summary>
<category term="孙子兵法" scheme="http://blog.jybx.me/categories/%E5%AD%99%E5%AD%90%E5%85%B5%E6%B3%95/"/>
<category term="孙子兵法" scheme="http://blog.jybx.me/tags/%E5%AD%99%E5%AD%90%E5%85%B5%E6%B3%95/"/>
<category term="孙武" scheme="http://blog.jybx.me/tags/%E5%AD%99%E6%AD%A6/"/>
</entry>
</feed>