-
Notifications
You must be signed in to change notification settings - Fork 0
/
search.xml
4163 lines (4103 loc) · 493 KB
/
search.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
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>WordPress使用前置钩子同步文章更新到hexo</title>
<url>/posts/c84bbf5b/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><h2 id="WordPress使用前置钩子同步文章更新到hexo"><a class="header-anchor" href="#WordPress使用前置钩子同步文章更新到hexo">➡️</a>WordPress使用前置钩子同步文章更新到hexo</h2>
<p>这是借助WordPress的钩子系统来实现的操作</p>
<a id="more"></a>
<p>由于WordPress官方对定义钩子的位置设定不够明确,我就自己在<code>/wp-admin/post.php</code>文件位置自己做了一个引入</p>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 引入hooks文件</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">include</span> dirname( <span class="keyword">__FILE__</span> ) . <span class="string">'/user/hooks.php'</span>;</span><br></pre></td></tr></table></figure>
<p>并且在<code>/wp-admin/user/</code>下新建了一个<code>hooks.php</code>文件.<br>
这样前期钩子的准备就准备好了</p>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line">add_action( <span class="string">'save_post'</span>, <span class="string">'usr_admin_add_content_before'</span>, <span class="variable">$priority</span> = <span class="number">10</span>, <span class="variable">$accepted_args</span> =<span class="number">1</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="function"><span class="keyword">function</span> <span class="title">usr_admin_add_content_before</span>(<span class="params"><span class="variable">$post_ID</span></span>)</span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"> <span class="variable">$hexoRoot</span> = <span class="string">''</span>;<span class="comment">//这里填写自己的hexo路径</span></span><br><span class="line"> <span class="variable">$more</span> = <span class="string">''</span>;<span class="comment">//由于WordPress没有more标签,这里填写自己自定义的替换more标签用的标签</span></span><br><span class="line"> <span class="variable">$content</span> = get_post(<span class="variable">$post_ID</span>);</span><br><span class="line"> <span class="variable">$path</span> = <span class="variable">$hexoRoot</span></span><br><span class="line"> . <span class="string">'/source/_posts'</span></span><br><span class="line"> . <span class="string">'/'</span>.date(<span class="string">'Y-m-d'</span>,</span><br><span class="line"> strtotime(<span class="variable">$content</span>->post_date))</span><br><span class="line"> . preg_replace(<span class="string">'/[\x{4e00}-\x{9fa5}]+/u'</span>,</span><br><span class="line"> <span class="string">'-'</span>,</span><br><span class="line"> <span class="variable">$content</span>->post_title)</span><br><span class="line"> . <span class="string">'.md'</span>;</span><br><span class="line"> <span class="variable">$title</span> = <span class="variable">$content</span>->post_title;</span><br><span class="line"> <span class="variable">$url</span> = <span class="variable">$post_ID</span>.<span class="string">'.com'</span>;</span><br><span class="line"> <span class="variable">$id</span> = <span class="variable">$post_ID</span>;</span><br><span class="line"> <span class="variable">$date</span> = <span class="variable">$content</span>->post_date;</span><br><span class="line"></span><br><span class="line"> <span class="variable">$category</span> = <span class="string">''</span>;</span><br><span class="line"> <span class="keyword">foreach</span> (get_the_category(<span class="variable">$post_ID</span>) <span class="keyword">as</span> <span class="variable">$v</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="variable">$category</span> .= <span class="string">'</span></span><br><span class="line"><span class="string"> - '</span>.<span class="variable">$v</span>->name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="variable">$tags</span> = <span class="string">''</span>;</span><br><span class="line"> <span class="keyword">foreach</span> (wp_get_post_tags(<span class="variable">$post_ID</span>) <span class="keyword">as</span> <span class="variable">$v</span>)</span><br><span class="line"> {</span><br><span class="line"> <span class="variable">$tags</span> .= <span class="string">'</span></span><br><span class="line"><span class="string"> - '</span>.<span class="variable">$v</span>->name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//这里填more标签</span></span><br><span class="line"> <span class="variable">$content</span> = str_replace(<span class="variable">$more</span>, <span class="string">'<!--more-->'</span>, <span class="variable">$content</span>->post_content_filtered);</span><br><span class="line"> <span class="variable">$con</span> = <<<con</span><br><span class="line">---</span><br><span class="line">title: <span class="variable">$title</span></span><br><span class="line">tags: <span class="variable">$tags</span></span><br><span class="line">url: <span class="variable">$url</span></span><br><span class="line">id: <span class="variable">$id</span></span><br><span class="line">categories: <span class="variable">$category</span></span><br><span class="line">date: <span class="variable">$date</span></span><br><span class="line">---</span><br><span class="line"><span class="variable">$content</span></span><br><span class="line">con;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span>(file_exists(<span class="variable">$path</span>)){</span><br><span class="line"> unlink(<span class="variable">$path</span>);</span><br><span class="line"> }</span><br><span class="line"> file_put_contents(<span class="variable">$path</span>, <span class="variable">$con</span>);</span><br><span class="line"></span><br><span class="line"> <span class="variable">$reload</span> = <span class="string">'cd $hexoRoot &&'</span><span class="comment">//这里填写需要执行的hexo命令</span></span><br><span class="line"> . <span class="string">' hexo clean &&'</span></span><br><span class="line"> . <span class="string">' hexo d &&'</span></span><br><span class="line"> . <span class="string">' pm2 reload app'</span>;</span><br><span class="line"> exec(<span class="variable">$reload</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>]]></content>
<tags>
<tag>PHP</tag>
<tag>WordPress</tag>
</tags>
</entry>
<entry>
<title>PHP的非swoole异步操作</title>
<url>/posts/398018bd/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><p>在前几天对WordPress进行同步更新文章的改造之后,每次更新文章都需要花费较长的时间,这很显然是不合理的.<br>
更新文章主要都把时间花费在了一条shell指令上面.</p>
<a id="more"></a>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line">exec(<span class="string">'cd 目录 && hexo clean && hexo d && pm2 reload app'</span>);</span><br></pre></td></tr></table></figure>
<p>引用原文地址:</p>
<ol>
<li><a href="http://www.laruence.com/2008/04/14/318.html" title="PHP实现异步调用方法研究">PHP实现异步调用方法研究</a></li>
<li><a href="https://www.jianshu.com/p/3f8a43b22dd8" title="PHP异步的的玩法">PHP异步的的玩法</a></li>
</ol>
<h3 id="先说说鸟哥文章中的几种玩法:"><a class="header-anchor" href="#先说说鸟哥文章中的几种玩法:">➡️</a>先说说鸟哥文章中的几种玩法:</h3>
<ol>
<li>
<p>通过渲染前端页面,使用js执行Ajax,这种方式现在还适用。只是受限于业务场景,因为只能在浏览器中调用,遇到接口请求就不行了。</p>
</li>
<li>
<p>通过popen()方法打开一个指向进程的管道,每个请求会多起一个进程。忽略进程来看最主要的原因是数据的传输特别不方便,使用场景有限。</p>
</li>
<li>
<p>使用CURL扩展,通过设置timeout超时参数,能实现离弦之箭的效果。不过这种方法会主动断开连接。被调用的服务如果有做连接检测,也会中断服务端脚本的执行。比如我们请求 微信的某个费时接口(20s),我们调用1s就断开连接,微信端是否会维持请求执行20S是不可控的。所以在curl别的网站的时候这种方法不推荐大家使用,但如果只是curl自己还是很好用的。</p>
</li>
<li>
<p>与CURL类似,通过fsockopen创建socket连接访问远程服务,不循环获取请求结果。一样会有三中连接被断开的问题。</p>
</li>
</ol>
<h3 id="PHP关于异步的改进"><a class="header-anchor" href="#PHP关于异步的改进">➡️</a>PHP关于异步的改进</h3>
<ol>
<li>
<p>CURL扩展已支持毫秒配置,将 CURLOPT_TIMEOUT 改为 CURLOPT_TIMEOUT_MS 即可生效(cURL 版本 >= libcurl/7.21.0,老服务器要检查版本),但还是我前面说的需要服务端配合,不然接口的调用成功失败不可控。</p>
</li>
<li>
<p>CURL扩展已支持并发,我们能一次访问N个接口,执行时间取最长接口的时间。比如我们能一次访问 京东支付(1s),微信支付(1.2s),支付宝(0.8s)不同服务的三个接口,总耗时才1.2s。详细用法 curl_multi_init</p>
</li>
<li>
<p>类似Node.js的异步IO框架Swoole,能很好的实现异步调用;不过Swoole理论上不能算PHP框架,他算是PHP功能的扩展。所以除非项目都用Swoole写,不然也是享受不到异步IO的福利。</p>
</li>
<li>
<p>对yield的支持,能实现调度器的功能,写单进程的服务时能大展拳脚,特别是实现协程,异步更不在话下。不过在多进程的web服务上没有太大的使用场景,看未来会不会有新的玩法吧。</p>
</li>
</ol>
<h3 id="关于web异步的解决方案"><a class="header-anchor" href="#关于web异步的解决方案">➡️</a>关于web异步的解决方案</h3>
<p>这个主要是针对那些需要异步而且并不太看中异步操作的结果的特殊场景</p>
<ol>
<li>curl配合较短的等待时间.</li>
<li>写一个swoole项目,需要异步时发送相应指令到相关端口</li>
<li>使用以下插件</li>
</ol>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Arrow</span></span>{</span><br><span class="line"></span><br><span class="line"> <span class="built_in">static</span> <span class="variable">$instance</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> static</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="built_in">static</span> <span class="function"><span class="keyword">function</span> <span class="title">getInstance</span>(<span class="params"></span>)</span>{</span><br><span class="line"> <span class="keyword">if</span> (<span class="literal">null</span> == Arrow::<span class="variable">$instance</span>)</span><br><span class="line"> Arrow::<span class="variable">$instance</span> = <span class="keyword">new</span> Arrow();</span><br><span class="line"> <span class="keyword">return</span> Arrow::<span class="variable">$instance</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">run</span>(<span class="params"><span class="variable">$rb</span></span>)</span>{</span><br><span class="line"></span><br><span class="line"> <span class="variable">$pid</span> = pcntl_fork();</span><br><span class="line"> <span class="keyword">if</span>(<span class="variable">$pid</span> > <span class="number">0</span>){</span><br><span class="line"> pcntl_wait(<span class="variable">$status</span>);</span><br><span class="line"> }<span class="keyword">elseif</span>(<span class="variable">$pid</span> == <span class="number">0</span>){</span><br><span class="line"> <span class="variable">$cid</span> = pcntl_fork();</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span>(<span class="variable">$cid</span> == <span class="number">0</span>){</span><br><span class="line"> <span class="variable">$rb</span>();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">exit</span>();</span><br><span class="line"> }<span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</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">*调用</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="variable">$time_out</span> = <span class="number">30</span>;</span><br><span class="line">Arrow::getInstance()->run(<span class="function"><span class="keyword">function</span>(<span class="params"></span>) <span class="title">use</span> (<span class="params"><span class="variable">$time_out</span></span>)</span>{</span><br><span class="line"> <span class="comment">//这里写我们要执行的代码</span></span><br><span class="line"> sleep(<span class="variable">$time_out</span>);</span><br><span class="line">});</span><br></pre></td></tr></table></figure>
<p>最终事实证明还是curl稳定,通过pcntl_fork()拉出的子进程和孙进程会影响到web的正常返回</p>
]]></content>
<tags>
<tag>PHP</tag>
<tag>异步</tag>
</tags>
</entry>
<entry>
<title>ps 进程查看器</title>
<url>/posts/f1c6d624/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><h2 id="ps-进程查看器"><a class="header-anchor" href="#ps-进程查看器">➡️</a>ps 进程查看器</h2>
<p>Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。</p>
<p>要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。</p>
<a id="more"></a>
<p>ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用 top linux下的任务管理器 工具。</p>
<p>注:kill -9 命令用于杀死进程。<br>
原文地址:<br>
<a href="https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/ps.html" title="ps 进程查看器">ps 进程查看器</a></p>
<h3 id="linux上进程有5种状态"><a class="header-anchor" href="#linux上进程有5种状态">➡️</a>linux上进程有5种状态:</h3>
<p>运行(正在运行或在运行队列中等待)<br>
中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)<br>
不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)<br>
僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)<br>
停止(进程收到SIGSTOP, SIGTSTP, SIGTTIN, SIGTTOU信号后停止运行运行)<br>
ps工具标识进程的5种状态码:</p>
<ol>
<li>D 不可中断 uninterruptible sleep (usually IO)</li>
<li>R 运行 runnable (on run queue)</li>
<li>S 中断 sleeping</li>
<li>T 停止 traced or stopped</li>
<li>Z 僵死 a defunct (”zombie”) process</li>
</ol>
<h3 id="命令参数"><a class="header-anchor" href="#命令参数">➡️</a>命令参数</h3>
<ol>
<li>a 显示所有进程</li>
<li>-a 显示同一终端下的所有程序</li>
<li>-A 显示所有进程</li>
<li>c 显示进程的真实名称</li>
<li>-N 反向选择</li>
<li>-e 等于“-A”</li>
<li>e 显示环境变量</li>
<li>f 显示程序间的关系</li>
<li>-H 显示树状结构</li>
<li>r 显示当前终端的进程</li>
<li>T 显示当前终端的所有程序</li>
<li>u 指定用户的所有进程</li>
<li>-au 显示较详细的资讯</li>
<li>-aux 显示所有包含其他使用者的行程</li>
<li>-C<命令> 列出指定命令的状况</li>
<li>–lines<行数> 每页显示的行数</li>
<li>–width<字符数> 每页显示的字符数</li>
<li>–help 显示帮助信息</li>
<li>–version 显示版本显示</li>
</ol>
<h3 id="输出列的含义"><a class="header-anchor" href="#输出列的含义">➡️</a>输出列的含义</h3>
<ol>
<li>F 代表这个程序的旗标 (flag), 4 代表使用者为 super user</li>
<li>S 代表这个程序的状态 (STAT),关于各 STAT 的意义将在内文介绍</li>
<li>UID 程序被该 UID 所拥有</li>
<li>PID 进程的ID</li>
<li>PPID 则是其上级父程序的ID</li>
<li>C CPU 使用的资源百分比</li>
<li>PRI 这个是 Priority (优先执行序) 的缩写,详细后面介绍</li>
<li>NI 这个是 Nice 值,在下一小节我们会持续介绍</li>
<li>ADDR 这个是 kernel function,指出该程序在内存的那个部分。如果是个 running的程序,一般就是 “-“</li>
<li>SZ 使用掉的内存大小</li>
<li>WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作</li>
<li>TTY 登入者的终端机位置</li>
<li>TIME 使用掉的 CPU 时间。</li>
<li>CMD 所下达的指令为何</li>
</ol>
<h3 id="实例"><a class="header-anchor" href="#实例">➡️</a>实例</h3>
<h4 id="显示所有进程信息"><a class="header-anchor" href="#显示所有进程信息">➡️</a>显示所有进程信息</h4>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@lilis ~]# ps -A</span><br><span class="line"> PID TTY TIME CMD</span><br><span class="line"> 1 ? 00:00:02 systemd</span><br><span class="line"> 2 ? 00:00:00 kthreadd</span><br><span class="line"> 3 ? 00:00:00 ksoftirqd/0</span><br><span class="line"> 5 ? 00:00:00 kworker/0:0H</span><br><span class="line"> 7 ? 00:00:00 migration/0</span><br><span class="line"> 8 ? 00:00:00 rcu_bh</span><br><span class="line"> 9 ? 00:00:03 rcu_sched</span><br><span class="line"> 10 ? 00:00:00 lru-add-drain</span><br></pre></td></tr></table></figure>
<h4 id="显示指定用户信息"><a class="header-anchor" href="#显示指定用户信息">➡️</a>显示指定用户信息</h4>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@lilis ~]# ps -u root</span><br><span class="line"> PID TTY TIME CMD</span><br><span class="line"> 1 ? 00:00:02 systemd</span><br><span class="line"> 2 ? 00:00:00 kthreadd</span><br><span class="line"> 3 ? 00:00:00 ksoftirqd/0</span><br><span class="line"> 5 ? 00:00:00 kworker/0:0H</span><br><span class="line"> 7 ? 00:00:00 migration/0</span><br><span class="line"> 8 ? 00:00:00 rcu_bh</span><br><span class="line"> 9 ? 00:00:03 rcu_sched</span><br><span class="line"> 10 ? 00:00:00 lru-add-drain</span><br></pre></td></tr></table></figure>
<h4 id="显示所有进程信息,连同命令行"><a class="header-anchor" href="#显示所有进程信息,连同命令行">➡️</a>显示所有进程信息,连同命令行</h4>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@lilis ~]# ps -ef</span><br><span class="line">UID PID PPID C STIME TTY TIME CMD</span><br><span class="line">root 1 0 0 Aug16 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22</span><br><span class="line">root 2 0 0 Aug16 ? 00:00:00 [kthreadd]</span><br><span class="line">root 3 2 0 Aug16 ? 00:00:00 [ksoftirqd/0]</span><br><span class="line">root 5 2 0 Aug16 ? 00:00:00 [kworker/0:0H]</span><br><span class="line">root 7 2 0 Aug16 ? 00:00:00 [migration/0]</span><br><span class="line">root 8 2 0 Aug16 ? 00:00:00 [rcu_bh]</span><br><span class="line">root 9 2 0 Aug16 ? 00:00:03 [rcu_sched]</span><br><span class="line">root 10 2 0 Aug16 ? 00:00:00 [lru-add-drain]</span><br></pre></td></tr></table></figure>
<h4 id="ps-与grep-组合使用,查找特定进程"><a class="header-anchor" href="#ps-与grep-组合使用,查找特定进程">➡️</a>ps 与grep 组合使用,查找特定进程</h4>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@lilis ~]# ps -ef | grep php</span><br><span class="line">root 899 1 0 Aug16 ? 00:00:03 php-fpm: master process (/usr/local/php/php71/etc/php-fpm.conf)</span><br><span class="line">www 900 899 0 Aug16 ? 00:00:00 php-fpm: pool www</span><br><span class="line">www 901 899 0 Aug16 ? 00:00:00 php-fpm: pool www</span><br><span class="line">root 906 1 0 Aug16 ? 00:00:03 php-fpm: master process (/usr/local/php/php56/etc/php-fpm.conf)</span><br><span class="line">www 907 906 0 Aug16 ? 00:00:00 php-fpm: pool www</span><br><span class="line">www 908 906 0 Aug16 ? 00:00:00 php-fpm: pool www</span><br><span class="line">root 3801 1 0 16:59 ? 00:00:00 php-fpm: master process (/usr/local/php/php72/etc/php-fpm.conf)</span><br><span class="line">www 3803 3801 0 16:59 ? 00:00:01 php-fpm: pool www</span><br><span class="line">www 3908 3801 0 17:02 ? 00:00:01 php-fpm: pool www</span><br><span class="line">www 4137 3801 0 17:08 ? 00:00:00 php-fpm: pool www</span><br><span class="line">root 4173 18277 0 17:09 pts/0 00:00:00 grep --color=auto php</span><br></pre></td></tr></table></figure>
<h4 id="将与这次登入的-PID-与相关信息列示出来"><a class="header-anchor" href="#将与这次登入的-PID-与相关信息列示出来">➡️</a>将与这次登入的 PID 与相关信息列示出来</h4>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@lilis ~]# ps -l</span><br><span class="line">F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD</span><br><span class="line">0 R 0 4334 18277 0 80 0 - 38292 - pts/0 00:00:00 ps</span><br><span class="line">4 S 0 18277 18275 0 80 0 - 28892 do_wai pts/0 00:00:00 bash</span><br></pre></td></tr></table></figure>
<h4 id="列出目前所有的正在内存中的程序"><a class="header-anchor" href="#列出目前所有的正在内存中的程序">➡️</a>列出目前所有的正在内存中的程序</h4>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[root@lilis ~]# ps aux</span><br><span class="line">USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND</span><br><span class="line">root 1 0.0 0.2 43416 2500 ? Ss Aug16 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22</span><br><span class="line">root 2 0.0 0.0 0 0 ? S Aug16 0:00 [kthreadd]</span><br><span class="line">root 3 0.0 0.0 0 0 ? S Aug16 0:00 [ksoftirqd/0]</span><br><span class="line">root 5 0.0 0.0 0 0 ? S< Aug16 0:00 [kworker/0:0H]</span><br><span class="line">root 7 0.0 0.0 0 0 ? S Aug16 0:00 [migration/0]</span><br><span class="line">root 8 0.0 0.0 0 0 ? S Aug16 0:00 [rcu_bh]</span><br><span class="line">root 9 0.0 0.0 0 0 ? R Aug16 0:03 [rcu_sched]</span><br><span class="line">root 10 0.0 0.0 0 0 ? S< Aug16 0:00 [lru-add-drain]</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>centos修改Hostname</title>
<url>/posts/e0a8795/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><p>hostname主要用于区分自己所连接的服务器<br>
当自己连接在多台服务器是不至于只能看ip区分服务器</p>
<a id="more"></a>
<p>临时修改hostname:</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">hostname lilis</span><br></pre></td></tr></table></figure>
<p>永久修改hostname</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">vim /etc/sysconfig/network</span><br><span class="line"><span class="meta">#</span><span class="bash"> 修改或添加</span></span><br><span class="line"> HOSTNAME=lilis</span><br></pre></td></tr></table></figure>]]></content>
<tags>
<tag>Linux</tag>
</tags>
</entry>
<entry>
<title>CentOS 7安装TCP BBR拥塞算法</title>
<url>/posts/907e528c/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><h4 id="认识BBR拥塞算法"><a class="header-anchor" href="#认识BBR拥塞算法">➡️</a>认识BBR拥塞算法</h4>
<p>从 4.9 开始,Linux 内核已经用上了该算法。根据以往的传统,Google 总是先在自家的生产环境上线运用后,才会将代码开源,此次也不例外。<br>
根据实地测试,在部署了最新版内核并开启了 TCP BBR 的机器上,网速甚至可以提升好几个数量级。</p>
<a id="more"></a>
<p><code>TCP BBR拥塞算法</code>致力于解决两个问题:</p>
<ol>
<li>在有一定丢包率的网络链路上充分利用带宽。</li>
<li>降低网络链路上的 buffer 占用率,从而降低延迟。</li>
</ol>
<p>在标准<code>TCP</code>通讯的情况下,为了充分利用带宽所采用的方案是:不断增加发送窗口,直到开始丢包,然后较快地减小发送窗口。<br>
这种做法在一般情况下没什么问题,但是在存在传输错误导致的丢包地情况下就没那么好使了。<br>
在有一定的丢包率的延迟高、宽带大的链路上标准的<code>TCP拥塞控制</code>就会把发送窗口收敛到很小。<br>
同时在网络中也有很多缓存空间用来吸收网络中的流量波动。由于标准的<code>TCP拥塞控制</code>是通过灌满带宽的方式来估算需要的发送窗口的,在连接的开始阶段,网络中的缓存空间就倾向于被占满。后续缓存空间会被逐渐释放,但并不会消失。客户端估计的水管容积总是略大于网络中除去缓存空间的实际容量。这个问题又被称之为<code>缓存区膨胀</code>。<br>
<code>缓存区膨胀</code>主要带来了两个问题:</p>
<ol>
<li>增加网络延迟。</li>
<li>在连接数较多时容易导致缓存区被填满导致丢包。</li>
</ol>
<p><code>TCP BBR</code>是用以下方法解决这两个问题的:</p>
<ol>
<li>既然分不清拥塞丢包和错误丢包那就不考虑丢包问题。</li>
<li>既然管满水管会导致缓存区膨胀那就估计带宽和延迟,不直接估计水管体积。</li>
</ol>
<p>带宽和延迟本身是没法同时测量的,测量最大带宽就需要把缓存区填满,测量最低延迟就需要把缓存区清空。<code>TCP BBR</code>所采用的方案是交替测量,用一段时间内的最大带宽和另一段时间内的最低延迟作为估计值。<br>
在连接刚开始建立时,它采用了和标准<code>TCP</code>类似的慢启动,指数增长发送速率。而标准的<code>TCP拥塞控制</code>会在遇到任何一个丢包就立刻开始减速,开始拥塞避免。这时,标准<code>TCP拥塞控制</code>本意是达到带宽的最大值开始进行网络控制,但是在有一定的丢包率的情况下也有可能是单纯的网络丢包,这时网络并没有达到带宽的最大值;如果网络中存在缓存区,它也会一直到把缓存区填满才会放弃。<br>
<code>TCP BBR</code>则是根据收到的确认包,发现有效带宽不再增长时开始拥塞避免。这时,只要链路的丢包率不算特别高,对<code>BBR</code>就几乎没什么影响;当发送速率增长到开始占用缓存区时(这时可以通过延迟的增加判断出来),<code>BBR</code>就及时的放弃了(这时占用的是3倍带宽,相当于有2倍在占用缓存区,但<code>BBR</code>本身还有一个排空阶段,在排空阶段下它会指数降低发送速率),这样就不会把缓存区占满。<br>
排空阶段过后就是稳定运行状态,交替探测带宽和延迟,以此来作为基准进行发包。</p>
<a href="#">Post not found: https://www.zhihu.com/question/53559433 Linux Kernel 4.9 中的 BBR 算法与之前的 TCP 拥塞控制相比有什么优势?</a>
<h4 id="安装TCP-BBR拥塞算法"><a class="header-anchor" href="#安装TCP-BBR拥塞算法">➡️</a>安装TCP BBR拥塞算法</h4>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">cat /etc/redhat-release #查看系统版本,输出的release数值大于7.3即可。</span><br></pre></td></tr></table></figure>
<ol>
<li>自动安装,使用一键安装脚本</li>
</ol>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh && chmod +x bbr.sh && ./bbr.sh</span><br></pre></td></tr></table></figure>
<ol start="2">
<li>手动安装</li>
</ol>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 使用下面命令安装elrepo并升级内核</span></span><br><span class="line">rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org</span><br><span class="line">rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm</span><br><span class="line">yum --enablerepo=elrepo-kernel install kernel-ml -y</span><br><span class="line"><span class="meta">#</span><span class="bash"> 更新grub文件并重启(reboot后,ssh会断开,稍等一会儿重新连接)</span></span><br><span class="line">egrep ^menuentry /etc/grub2.cfg | cut -f 2 -d \'</span><br><span class="line">grub2-set-default 0</span><br><span class="line">grub2-mkconfig -o /boot/grub2/grub.cfg</span><br><span class="line">reboot</span><br><span class="line"><span class="meta">#</span><span class="bash"> 开机后查看内核是否已经升级</span></span><br><span class="line">uname -r</span><br><span class="line"><span class="meta">#</span><span class="bash"> 启动BBR</span></span><br><span class="line">echo "net.core.default_qdisc = fq" >> /etc/sysctl.conf</span><br><span class="line">echo "net.ipv4.tcp_congestion_control = bbr" >> /etc/sysctl.conf</span><br><span class="line">sysctl -p </span><br></pre></td></tr></table></figure>
<p>验证bbr是否已经开启</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sysctl net.ipv4.tcp_available_congestion_control #验证当前TCP控制算法的命令</span><br><span class="line">sysctl net.ipv4.tcp_congestion_control #验证BBR是否已经启动</span><br><span class="line">lsmod | grep bbr #返回值有 tcp_bbr 模块即说明 bbr 已启动。</span><br></pre></td></tr></table></figure>]]></content>
<tags>
<tag>Linux</tag>
<tag>CentOS</tag>
<tag>TCP</tag>
<tag>BBR</tag>
<tag>拥塞算法</tag>
</tags>
</entry>
<entry>
<title>HTML-页面嵌入测试</title>
<url>/posts/2649187286/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><h2 id="这是一个测试页面,测试iframe标签效果"><a class="header-anchor" href="#这是一个测试页面,测试iframe标签效果">➡️</a>这是一个测试页面,测试iframe标签效果</h2>
<a id="more"></a>
<div class="iframeContentBody" data-iframe-src="./embed_page/" data-iframe-ismobile="true" data-iframe-title="合成大西瓜(魔改版)"></div>
<div class="iframeContentBody" data-iframe-src="https://www.bing.com/" data-iframe-ismobile="false" data-iframe-title="必应"></div>]]></content>
</entry>
<entry>
<title>Hash索引和B-Tree索引</title>
<url>/posts/294f33b7/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><p>索引是帮助mysql获取数据的数据结构。最常见的索引是Btree索引和Hash索引。</p>
<p>不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引;而Mermory默认的索引是Hash索引。</p>
<a id="more"></a>
<p>原文链接:<br>
<a href="https://blog.csdn.net/u014307117/article/details/47325091" title="Hash索引和BTree索引">Hash索引和BTree索引</a></p>
<h3 id="Hash索引"><a class="header-anchor" href="#Hash索引">➡️</a>Hash索引</h3>
<p>所谓Hash索引,当我们要给某张表某列增加索引时,将这张表的这一列进行哈希算法计算,得到哈希值,排序在哈希数组上。所以Hash索引可以一次定位,其效率很高,而Btree索引需要经过多次的磁盘IO,但是innodb和myisam之所以没有采用它,是因为它存在着好多缺点:<br>
因为Hash索引比较的是经过Hash计算的值,所以只能进行等式比较,不能用于范围查询</p>
<ul>
<li>每次都要全表扫描</li>
<li>由于哈希值是按照顺序排列的,但是哈希值映射的真正数据在哈希表中就不一定按照顺序排列,所以无法利用Hash索引来加速任何排序操作</li>
<li>不能用部分索引键来搜索,因为组合索引在计算哈希值的时候是一起计算的。</li>
<li>当哈希值大量重复且数据量非常大时,其检索效率并没有Btree索引高的。</li>
</ul>
<h3 id="B-Tree索引"><a class="header-anchor" href="#B-Tree索引">➡️</a>B-Tree索引</h3>
<p>至于Btree索引,它是以B+树为存储结构实现的。</p>
<p>但是Btree索引的存储结构在Innodb和MyISAM中有很大区别。</p>
<p>在MyISAM中,我们如果要对某张表的某列建立Btree索引的话,如图:<br>
<img src="https://img-blog.csdn.net/20150806231335315"><br>
所以我们经常会说MyISAM中数据文件和索引文件是分开的。</p>
<p>因此MyISAM的索引方式也称为非聚集,Innodb的索引方式成为聚集索引。</p>
<p>至于辅助索引,类似于主索引,唯一区别就是主索引上的值不能重复,而辅助索引可以重复。</p>
]]></content>
<tags>
<tag>MySQL</tag>
<tag>数据结构</tag>
</tags>
</entry>
<entry>
<title>LaravelS开发记录</title>
<url>/posts/45ef7ac/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><p>主要记录了由普通PHP开发者初步接触laravelS是所遇到的一些小坑</p>
<a id="more"></a>
<h3 id="LaravelS介绍"><a class="header-anchor" href="#LaravelS介绍">➡️</a>LaravelS介绍</h3>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"> _ _ _____</span><br><span class="line">| | | |/ ____|</span><br><span class="line">| | __ _ _ __ __ ___ _____| | (___</span><br><span class="line">| | / _` | '__/ _` \ \ / / _ \ |\___ \</span><br><span class="line">| |___| (_| | | | (_| |\ V / __/ |____) |</span><br><span class="line">|______\__,_|_| \__,_| \_/ \___|_|_____/</span><br></pre></td></tr></table></figure>
<p>LaravelS是一个能够使普通的laravel项目尽快的享受上swoole的优势的laravel插件<br>
官方描述:<br>
🚀LaravelS是一个胶水项目,用于快速集成Swoole到Laravel或Lumen,然后赋予它们更好的性能、更多可能性。</p>
<p>GitHub地址:</p>
<div style="text-align: center">
<div class="github-card" data-user="hhxsv5" data-repo="laravel-s" data-height="200px" data-width="100%" data-theme="default" data-target="blank" data-client-id data-client-secret></div>
</div>
<script src="/github-card-lib/githubcard.js"></script>
<p>文档地址:<br>
<a href="https://github.com/hhxsv5/laravel-s/blob/master/README-CN.md" title="laravel-s/README-CN.md">laravel-s/README-CN.md</a><br>
Laravel-China地址:<br>
<a href="https://laravel-china.org/articles/8050/laravels-speed-up-laravellumen-through-swoole" title="LaravelS - 基于 Swoole 加速 Laravel/Lumen - 带你飞 🚀">LaravelS - 基于 Swoole 加速 Laravel/Lumen - 带你飞 🚀</a></p>
<h3 id="安装"><a class="header-anchor" href="#安装">➡️</a>安装</h3>
<h4 id="安装要求"><a class="header-anchor" href="#安装要求">➡️</a>安装要求</h4>
<table>
<thead>
<tr>
<th>依赖</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>PHP</td>
<td>>= 5.5.9 推荐PHP7+</td>
</tr>
<tr>
<td>Swoole</td>
<td>>= 1.7.19 从2.0.12开始不再支持PHP5 推荐4.2.3+</td>
</tr>
<tr>
<td>Laravel/Lumen</td>
<td>>= 5.1 推荐5.6+</td>
</tr>
</tbody>
</table>
<h4 id="安装swoole"><a class="header-anchor" href="#安装swoole">➡️</a>安装swoole</h4>
<p>详细请参考 <a href="https://hexo.lilis.xin/2018/07/26/install-swoole/" title="swoole安装">swoole安装</a></p>
<h4 id="安装laravel"><a class="header-anchor" href="#安装laravel">➡️</a>安装laravel</h4>
<p>可以通过composer直接安装,或者安装安装器或者直接从GitHub拷贝源代码来安装</p>
<h4 id="安装laravelS"><a class="header-anchor" href="#安装laravelS">➡️</a>安装laravelS</h4>
<ol>
<li>通过Composer安装</li>
</ol>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">composer require "hhxsv5/laravel-s:~3.0" -vvv</span><br><span class="line"><span class="meta">#</span><span class="bash"> 确保你的composer.lock文件是在版本控制中</span></span><br></pre></td></tr></table></figure>
<ol start="2">
<li>注册<code>Service Provider</code>
<ul>
<li>Laravel: 修改文件<code>config/app.php</code>,Laravel 5.5+支持包自动发现,你应该跳过这步</li>
</ul>
</li>
</ol>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="string">'providers'</span> => [</span><br><span class="line"> <span class="comment">//...</span></span><br><span class="line"> Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class,</span><br><span class="line">],</span><br></pre></td></tr></table></figure>
<pre><code>- Lumen: 修改文件`bootstrap/app.php`
</code></pre>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="variable">$app</span>->register(Hhxsv5\LaravelS\Illuminate\LaravelSServiceProvider::class);</span><br></pre></td></tr></table></figure>
<ol start="3">
<li>发布配置文件.</li>
</ol>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">php artisan laravels publish</span><br></pre></td></tr></table></figure>
<p>如果你用的是<code>lumen</code>,不需要加载<code>config/laravels.php</code></p>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="comment">//这个可有可无</span></span><br><span class="line"><span class="variable">$app</span>->configure(<span class="string">'laravels'</span>);</span><br></pre></td></tr></table></figure>
<ol start="4">
<li>修改配置<code>config/laravels.php</code><br>
请参考<code>laravelS配置项</code></li>
</ol>
<h4 id="运行"><a class="header-anchor" href="#运行">➡️</a>运行</h4>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line">php artisan laravels {start|stop|restart|reload|publish}</span><br></pre></td></tr></table></figure>
<table>
<thead>
<tr>
<th>命令</th>
<th>说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>start</td>
<td>启动<code>LaravelS</code>。选项<code>-d</code>或<code>--daemonize</code>以守护进程的方式运行,此选项将覆盖<code>laravels.php</code>中<code>swoole.daemonize</code>设置</td>
</tr>
<tr>
<td>stop</td>
<td>停止<code>LaravelS</code></td>
</tr>
<tr>
<td>restart</td>
<td>重启<code>LaravelS</code>,支持选项<code>-d</code>或<code>--daemonize</code></td>
</tr>
<tr>
<td>reload</td>
<td>平滑重启所有<code>worker</code>进程,这些<code>worker</code>进程内包含你的业务代码和框架(<code>Laravel/Lumen</code>)代码,不会重启<code>master/manger</code>进程</td>
</tr>
<tr>
<td>publish</td>
<td>发布配置文件到你的项目中<code>config/laravels.php</code></td>
</tr>
</tbody>
</table>
<p>ps:展示已经启动的项目:<br>
<code>ps -ef|grep laravels</code></p>
<h4 id="配置nginx"><a class="header-anchor" href="#配置nginx">➡️</a>配置nginx</h4>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">gzip on;</span><br><span class="line">gzip_min_length 1024;</span><br><span class="line">gzip_comp_level 2;</span><br><span class="line">gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml application/x-httpd-php image/jpeg image/gif image/png font/ttf font/otf image/svg+xml;</span><br><span class="line">gzip_vary on;</span><br><span class="line">gzip_disable "msie6";</span><br><span class="line">upstream laravels {</span><br><span class="line"> # By IP:Port</span><br><span class="line"> server 127.0.0.1:9100 weight=5 max_fails=3 fail_timeout=30s; #这里配置的是laravelS监听的接口参数</span><br><span class="line"> # By UnixSocket Stream file</span><br><span class="line"> #server unix:/xxxpath/laravel-s-test/storage/laravels.sock weight=5 max_fails=3 fail_timeout=30s;</span><br><span class="line"> #server 192.168.1.1:5200 weight=3 max_fails=3 fail_timeout=30s;</span><br><span class="line"> #server 192.168.1.2:5200 backup;</span><br><span class="line">}</span><br><span class="line">server {</span><br><span class="line"> listen 80;</span><br><span class="line"> server_name laravels.com;</span><br><span class="line"><span class="meta"> #</span><span class="bash">为了给nginx定位静态资源</span></span><br><span class="line"> root /xxxpath/laravel-s-test/public;</span><br><span class="line"><span class="meta"> #</span><span class="bash"> Nginx处理静态资源(建议开启gzip),LaravelS处理动态资源。</span></span><br><span class="line"> location / {</span><br><span class="line"> try_files $uri @laravels;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> location @laravels {</span><br><span class="line"> proxy_connect_timeout 60s;</span><br><span class="line"> proxy_send_timeout 60s;</span><br><span class="line"> proxy_read_timeout 120s;</span><br><span class="line"> proxy_set_header Connection "keep-alive";</span><br><span class="line"> proxy_set_header X-Real-IP $remote_addr;</span><br><span class="line"> proxy_set_header X-Real-PORT $remote_port;</span><br><span class="line"> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</span><br><span class="line"> proxy_set_header Host $http_host;</span><br><span class="line"> proxy_set_header Scheme $scheme;</span><br><span class="line"> proxy_set_header Server-Protocol $server_protocol;</span><br><span class="line"> proxy_set_header Server-Name $server_name;</span><br><span class="line"> proxy_set_header Server-Addr $server_addr;</span><br><span class="line"> proxy_set_header Server-Port $server_port;</span><br><span class="line"> proxy_pass http://laravels;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h4 id="配置Apache"><a class="header-anchor" href="#配置Apache">➡️</a>配置Apache</h4>
<p>ps:我用的是nginx,没有实际配置过,就直接把官方文档里的拿过来了</p>
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line">LoadModule proxy_module /yyypath/modules/mod_deflate.so</span><br><span class="line"><span class="tag"><<span class="name">IfModule</span> <span class="attr">deflate_module</span>></span></span><br><span class="line"> SetOutputFilter DEFLATE</span><br><span class="line"> DeflateCompressionLevel 2</span><br><span class="line"> AddOutputFilterByType DEFLATE text/html text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml application/x-httpd-php image/jpeg image/gif image/png font/ttf font/otf image/svg+xml</span><br><span class="line"><span class="tag"></<span class="name">IfModule</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">VirtualHost</span> *<span class="attr">:80</span>></span></span><br><span class="line"> # 别忘了绑Host哟</span><br><span class="line"> ServerName www.laravels.com</span><br><span class="line"> ServerAdmin hhxsv5@sina.com</span><br><span class="line"></span><br><span class="line"> DocumentRoot /xxxpath/laravel-s-test/public;</span><br><span class="line"> DirectoryIndex index.html index.htm</span><br><span class="line"> <span class="tag"><<span class="name">Directory</span> "/"></span></span><br><span class="line"> AllowOverride None</span><br><span class="line"> Require all granted</span><br><span class="line"> <span class="tag"></<span class="name">Directory</span>></span></span><br><span class="line"></span><br><span class="line"> LoadModule proxy_module /yyypath/modules/mod_proxy.so</span><br><span class="line"> LoadModule proxy_module /yyypath/modules/mod_proxy_balancer.so</span><br><span class="line"> LoadModule proxy_module /yyypath/modules/mod_lbmethod_byrequests.so.so</span><br><span class="line"> LoadModule proxy_module /yyypath/modules/mod_proxy_http.so.so</span><br><span class="line"> LoadModule proxy_module /yyypath/modules/mod_slotmem_shm.so</span><br><span class="line"> LoadModule proxy_module /yyypath/modules/mod_rewrite.so</span><br><span class="line"></span><br><span class="line"> ProxyRequests Off</span><br><span class="line"> ProxyPreserveHost On</span><br><span class="line"> <span class="tag"><<span class="name">Proxy</span> <span class="attr">balancer:</span>//<span class="attr">laravels</span>></span></span><br><span class="line"> BalancerMember http://192.168.1.1:8011 loadfactor=7</span><br><span class="line"> #BalancerMember http://192.168.1.2:8011 loadfactor=3</span><br><span class="line"> #BalancerMember http://192.168.1.3:8011 loadfactor=1 status=+H</span><br><span class="line"> ProxySet lbmethod=byrequests</span><br><span class="line"> <span class="tag"></<span class="name">Proxy</span>></span></span><br><span class="line"> #ProxyPass / balancer://laravels/</span><br><span class="line"> #ProxyPassReverse / balancer://laravels/</span><br><span class="line"></span><br><span class="line"> # Apache处理静态资源,LaravelS处理动态资源。</span><br><span class="line"> RewriteEngine On</span><br><span class="line"> RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-d</span><br><span class="line"> RewriteCond %{DOCUMENT_ROOT}%{REQUEST_FILENAME} !-f</span><br><span class="line"> RewriteRule ^/(.*)$ balancer://laravels/%{REQUEST_URI} [P,L]</span><br><span class="line"></span><br><span class="line"> ErrorLog ${APACHE_LOG_DIR}/www.laravels.com.error.log</span><br><span class="line"> CustomLog ${APACHE_LOG_DIR}/www.laravels.com.access.log combined</span><br><span class="line"><span class="tag"></<span class="name">VirtualHost</span>></span></span><br></pre></td></tr></table></figure>
<h4 id="自定义的异步任务"><a class="header-anchor" href="#自定义的异步任务">➡️</a>自定义的异步任务</h4>
<p>此特性依赖<code>Swoole</code>的<code>AsyncTask</code>,必须先设置<code>config/laravels.php</code>的<code>swoole.task_worker_num</code>。<br>
异步事件的处理能力受<code>Task</code>进程数影响,需合理设置<code>task_worker_num</code>。<br>
任务结构</p>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="keyword">namespace</span> <span class="title">App</span>\<span class="title">Task</span>\<span class="title">Message</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">use</span> <span class="title">App</span>\<span class="title">Traits</span>\<span class="title">Push</span>;</span><br><span class="line"><span class="keyword">use</span> <span class="title">Hhxsv5</span>\<span class="title">LaravelS</span>\<span class="title">Swoole</span>\<span class="title">Task</span>\<span class="title">Task</span>;</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Reply</span> <span class="keyword">extends</span> <span class="title">Task</span></span></span><br><span class="line"><span class="class"></span>{</span><br><span class="line"> <span class="keyword">private</span> <span class="variable">$data</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">__construct</span>(<span class="params"><span class="variable">$data</span></span>)</span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="keyword">$this</span>->data = <span class="variable">$data</span>;</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"> * 任务逻辑</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="function"><span class="keyword">function</span> <span class="title">handle</span>(<span class="params"></span>)</span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="comment">//Do something</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>ps: 任务里没有依赖注入这种便捷的东西<br>
投递任务</p>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="comment">// 实例化$action并通过deliver投递</span></span><br><span class="line"><span class="comment">//此操作是异步的,投递后立即返回</span></span><br><span class="line"><span class="comment">//由Task进程继续处理$action中的handle逻辑</span></span><br><span class="line"><span class="variable">$task</span> = <span class="keyword">new</span> \App\Task\Message\Reply(<span class="variable">$dat</span>);</span><br><span class="line"><span class="comment">// $task->delay(3);// 延迟3秒投放任务</span></span><br><span class="line">\Hhxsv5\LaravelS\Swoole\Task\Task::deliver(<span class="variable">$task</span>);</span><br></pre></td></tr></table></figure>
<h4 id="laravelS配置项"><a class="header-anchor" href="#laravelS配置项">➡️</a>laravelS配置项</h4>
<ul>
<li>
<p><code>listen_ip</code>:<code>string</code> 监听的IP,监听本机<code>127.0.0.1</code>(IPv4) <code>::1</code>(IPv6),监听所有地址 <code>0.0.0.0</code>(IPv4) ::(IPv6), 默认<code>127.0.0.1</code>。</p>
</li>
<li>
<p><code>listen_port</code>:<code>int</code> 监听的端口,如果端口小于1024则需要root权限,<code>default 5200</code>。</p>
</li>
<li>
<p><code>socket_type</code>:默认<code>SWOOLE_SOCK_TCP</code>。通常情况下,无需关心这个配置。若需Nginx代理至<code>UnixSocket Stream</code>文件,则需修改为<code>SWOOLE_SOCK_UNIX_STREAM</code>,此时<code>listen_ip</code>则是<code>UnixSocket Stream</code>文件的路径。</p>
</li>
<li>
<p><code>enable_gzip</code>:bool 当通过LaravelS响应数据时,是否启用gzip压缩响应的内容,依赖库<code>zlib</code>,通过命令<code>php --ri swoole|grep zlib</code>检查<code>gzip</code>是否可用。如果开启则会自动加上头部<code>Content-Encoding</code>,默认<code>false</code>。如果存在代理服务器(例如Nginx),建议代理服务器开启<code>gzip</code>,<code>LaravelS</code>关闭gzip,避免重复<code>gzip</code>压缩。</p>
</li>
<li>
<p><code>server</code>:<code>string</code> 当通过<code>LaravelS</code>响应数据时,设置<code>HTTP</code>头部<code>Server</code>的值,若为空则不设置,<code>default LaravelS</code>。</p>
</li>
<li>
<p><code>handle_static</code>:<code>bool</code> 是否开启<code>LaravelS</code>处理静态资源(要求 <code>Swoole >= 1.7.21</code>,若<code>Swoole >= 1.9.17</code>则由Swoole自己处理),默认<code>false</code>,建议<code>Nginx</code>处理静态资源,<code>LaravelS</code>仅处理动态资源。静态资源的默认路径为<code>base_path('public')</code>,可通过修改<code>swoole.document_root</code>变更。</p>
</li>
<li>
<p><code>laravel_base_path</code>:<code>string</code> <code>Laravel/Lumen</code>的基础路径,默认<code>base_path()</code>,可用于配置符号链接。</p>
</li>
<li>
<p><code>inotify_reload.enable</code>:<code>bool</code> 是否开启<code>Inotify Reload</code>,用于当修改代码后实时<code>Reload</code>所有<code>worker</code>进程,依赖库<code>inotify</code>,通过命令<code>php --ri inotify</code>检查是否可用,默认<code>false</code>,建议仅开发环境开启,修改监听数上限。</p>
</li>
<li>
<p><code>inotify_reload.watch_path</code>:<code>string</code> <code>Inotify</code> 监控的文件路径,默认有<code>base_path()</code>。</p>
</li>
<li>
<p><code>inotify_reload.file_types</code>:<code>array</code> <code>Inotify</code> 监控的文件类型,默认有<code>.php</code>。</p>
</li>
<li>
<p><code>inotify_reload.log</code>:<code>bool</code> 是否输出<code>Reload</code>的日志,默认<code>true</code>。</p>
</li>
<li>
<p><code>websocket.enable</code>:<code>bool</code> 是否启用<code>WebSocket</code>服务器。启用后<code>WebSocket</code>服务器监听的<code>IP</code>和端口与<code>Http</code>服务器相同,默认<code>false</code>。</p>
</li>
<li>
<p><code>websocket.handler</code>:<code>string</code> <code>WebSocket</code>逻辑处理的类名,需实现接口<code>WebSocketHandlerInterface</code>,参考示例。</p>
</li>
<li>
<p><code>sockets</code>:<code>array</code> 配置<code>TCP/UDP</code>套接字列表,参考示例。</p>
</li>
<li>
<p><code>processes</code>:<code>array</code> 配置自定义进程列表,参考示例。</p>
</li>
<li>
<p><code>events</code>:<code>array</code> 自定义的异步事件和监听的绑定列表,参考示例。</p>
</li>
<li>
<p><code>swoole_tables</code>:<code>array</code> 定义的<code>swoole_table</code>列表,参考示例。</p>
</li>
<li>
<p><code>register_providers</code>:<code>array</code> 每次请求需要重新注册的<code>Service Provider</code>列表,若存在<code>boot()</code>方法,会自动执行。一般用于清理注册了单例的<code>ServiceProvider</code>。</p>
</li>
</ul>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="comment">//...</span></span><br><span class="line"><span class="string">'register_providers'</span> => [</span><br><span class="line"> <span class="comment">//例如:重新注册jwt的ServiceProvider</span></span><br><span class="line"> \Tymon\JWTAuth\Providers\LaravelServiceProvider::class,</span><br><span class="line">],</span><br><span class="line"><span class="comment">//...</span></span><br></pre></td></tr></table></figure>
<ul>
<li>swoole:<code>array</code> <code>Swoole</code>的原始配置项,请参考<a href="https://wiki.swoole.com/wiki/page/274.html" title="Swoole配置项">Swoole配置项</a>。</li>
</ul>
]]></content>
<tags>
<tag>PHP</tag>
<tag>异步</tag>
<tag>laravel</tag>
<tag>LaravelS</tag>
<tag>Lumen</tag>
<tag>swoole</tag>
</tags>
</entry>
<entry>
<title>MySQL常用语法</title>
<url>/posts/fad88b6d/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><h2 id="数据表相关"><a class="header-anchor" href="#数据表相关">➡️</a>数据表相关</h2>
<h4 id="创建数据表"><a class="header-anchor" href="#创建数据表">➡️</a>创建数据表</h4>
<a id="more"></a>
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">create</span> database laravelS</span><br><span class="line"> <span class="keyword">DEFAULT</span> <span class="type">CHARACTER</span> <span class="keyword">SET</span> utf8mb4</span><br><span class="line"> <span class="keyword">DEFAULT</span> <span class="keyword">COLLATE</span> utf8mb4_general_ci;</span><br></pre></td></tr></table></figure>
<h4 id="清空数据表"><a class="header-anchor" href="#清空数据表">➡️</a>清空数据表</h4>
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">truncate</span> <span class="keyword">table</span> 表名</span><br></pre></td></tr></table></figure>
<h4 id="导出数据"><a class="header-anchor" href="#导出数据">➡️</a>导出数据</h4>
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line">mysql<span class="operator">></span> <span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> runoob_tbl</span><br><span class="line"> <span class="operator">-</span><span class="operator">></span> <span class="keyword">INTO</span> OUTFILE <span class="string">'/tmp/runoob.txt'</span>;</span><br><span class="line">mysqldump <span class="operator">-</span>u root <span class="operator">-</span>p RUNOOB runoob_tbl <span class="operator">></span> dump.txt</span><br></pre></td></tr></table></figure>]]></content>
<tags>
<tag>MySQL</tag>
<tag>代码</tag>
<tag>备忘</tag>
</tags>
</entry>
<entry>
<title>PHP动态gif验证码</title>
<url>/posts/491b8778/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><p>最近感觉自己的项目上的验证码太low了,决定换一个有意思的动态gif验证码</p>
<a id="more"></a>
<p>效果<br>
<img src="https://blog.lilis.xin/wp-admin/Captcha.php" alt="Captcha" title="Captcha"><br>
废话不多说,直接上源码</p>
<h4 id="源码"><a class="header-anchor" href="#源码">➡️</a>源码</h4>
<p>主函数:<br>
<a href="https://blog.lilis.xin/wp-admin/fonts/comic.ttf" title="comic.ttf">comic.ttf</a></p>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">ImageCode</span>(<span class="params"></span></span></span><br><span class="line"><span class="function"><span class="params"> <span class="variable">$string</span>=<span class="string">''</span>, <span class="variable">$frames</span> = <span class="number">60</span>,</span></span></span><br><span class="line"><span class="function"><span class="params"> <span class="variable">$time</span> = <span class="number">1</span>,<span class="variable">$width</span>=<span class="number">75</span>,</span></span></span><br><span class="line"><span class="function"><span class="params"> <span class="variable">$height</span>=<span class="number">25</span>, <span class="variable">$font</span> = <span class="number">6</span>,</span></span></span><br><span class="line"><span class="function"><span class="params"> <span class="variable">$loops</span> = <span class="number">0</span></span></span></span><br><span class="line"><span class="function"><span class="params"> </span>) </span>{</span><br><span class="line"> <span class="variable">$authstr</span> = <span class="variable">$string</span>?:((time()%<span class="number">2</span>==<span class="number">0</span>)?mt_rand(<span class="number">1000</span>,<span class="number">9999</span>):mt_rand(<span class="number">10000</span>,<span class="number">99999</span>));</span><br><span class="line"> <span class="variable">$authlen</span> = strlen(<span class="variable">$authstr</span>);</span><br><span class="line"> <span class="variable">$board_width</span>=<span class="variable">$width</span>;</span><br><span class="line"> <span class="variable">$board_height</span>=<span class="variable">$height</span>;</span><br><span class="line"> <span class="variable">$delay</span> = <span class="variable">$time</span>*<span class="number">100</span>/<span class="variable">$frames</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 生成一个n帧的GIF动画</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="variable">$i</span>=<span class="number">0</span>;<span class="variable">$i</span><<span class="variable">$frames</span>;<span class="variable">$i</span>++){</span><br><span class="line"> ob_start();</span><br><span class="line"> <span class="variable">$image</span>=imagecreate(<span class="variable">$board_width</span>,<span class="variable">$board_height</span>);</span><br><span class="line"> imagecolorallocate(<span class="variable">$image</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"> <span class="comment">// 设定文字颜色数组</span></span><br><span class="line"> <span class="variable">$colorList</span>[]=imagecolorallocate(<span class="variable">$image</span>,<span class="number">15</span>,<span class="number">73</span>,<span class="number">210</span>);</span><br><span class="line"> <span class="variable">$colorList</span>[]=imagecolorallocate(<span class="variable">$image</span>,<span class="number">0</span>,<span class="number">64</span>,<span class="number">0</span>);</span><br><span class="line"> <span class="variable">$colorList</span>[]=imagecolorallocate(<span class="variable">$image</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">64</span>);</span><br><span class="line"> <span class="variable">$colorList</span>[]=imagecolorallocate(<span class="variable">$image</span>,<span class="number">0</span>,<span class="number">128</span>,<span class="number">128</span>);</span><br><span class="line"> <span class="variable">$colorList</span>[]=imagecolorallocate(<span class="variable">$image</span>,<span class="number">27</span>,<span class="number">52</span>,<span class="number">47</span>);</span><br><span class="line"> <span class="variable">$colorList</span>[]=imagecolorallocate(<span class="variable">$image</span>,<span class="number">51</span>,<span class="number">0</span>,<span class="number">102</span>);</span><br><span class="line"> <span class="variable">$colorList</span>[]=imagecolorallocate(<span class="variable">$image</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">145</span>);</span><br><span class="line"> <span class="variable">$colorList</span>[]=imagecolorallocate(<span class="variable">$image</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">113</span>);</span><br><span class="line"> <span class="variable">$colorList</span>[]=imagecolorallocate(<span class="variable">$image</span>,<span class="number">0</span>,<span class="number">51</span>,<span class="number">51</span>);</span><br><span class="line"> <span class="variable">$colorList</span>[]=imagecolorallocate(<span class="variable">$image</span>,<span class="number">158</span>,<span class="number">180</span>,<span class="number">35</span>);</span><br><span class="line"> <span class="variable">$colorList</span>[]=imagecolorallocate(<span class="variable">$image</span>,<span class="number">59</span>,<span class="number">59</span>,<span class="number">59</span>);</span><br><span class="line"> <span class="variable">$colorList</span>[]=imagecolorallocate(<span class="variable">$image</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>);</span><br><span class="line"> <span class="variable">$colorList</span>[]=imagecolorallocate(<span class="variable">$image</span>,<span class="number">1</span>,<span class="number">128</span>,<span class="number">180</span>);</span><br><span class="line"> <span class="variable">$colorList</span>[]=imagecolorallocate(<span class="variable">$image</span>,<span class="number">0</span>,<span class="number">153</span>,<span class="number">51</span>);</span><br><span class="line"> <span class="variable">$colorList</span>[]=imagecolorallocate(<span class="variable">$image</span>,<span class="number">60</span>,<span class="number">131</span>,<span class="number">1</span>);</span><br><span class="line"> <span class="variable">$colorList</span>[]=imagecolorallocate(<span class="variable">$image</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">0</span>);</span><br><span class="line"> <span class="variable">$gray</span>=imagecolorallocate(<span class="variable">$image</span>,<span class="number">245</span>,<span class="number">245</span>,<span class="number">245</span>);</span><br><span class="line"> imagefill(<span class="variable">$image</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="variable">$gray</span>);</span><br><span class="line"> <span class="variable">$space</span>=<span class="variable">$font</span>*<span class="number">0.65</span>;<span class="comment">// 字符间距</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span>(<span class="variable">$k</span>=<span class="number">0</span>;<span class="variable">$k</span><<span class="variable">$authlen</span>;<span class="variable">$k</span>++){</span><br><span class="line"> <span class="variable">$colorRandom</span>=mt_rand(<span class="number">0</span>,sizeof(<span class="variable">$colorList</span>)<span class="number">-1</span>);</span><br><span class="line"> <span class="variable">$float_top</span>=rand(<span class="number">0</span>,<span class="number">4</span>);</span><br><span class="line"> <span class="variable">$float_left</span>=rand(<span class="number">1</span>,<span class="number">4</span>);</span><br><span class="line"> imagettftext(</span><br><span class="line"> <span class="variable">$image</span>, <span class="variable">$font</span>, <span class="number">0</span>,</span><br><span class="line"> <span class="variable">$space</span>*<span class="variable">$k</span>+<span class="variable">$float_left</span>, <span class="variable">$font</span>+<span class="variable">$float_top</span>,</span><br><span class="line"> <span class="variable">$colorList</span>[<span class="variable">$colorRandom</span>],</span><br><span class="line"> <span class="string">'./fonts/comic.ttf'</span>,</span><br><span class="line"> substr(<span class="variable">$authstr</span>,<span class="variable">$k</span>,<span class="number">1</span>)</span><br><span class="line"> );</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="variable">$k</span>=<span class="number">0</span>;<span class="variable">$k</span><<span class="number">20</span>;<span class="variable">$k</span>++){</span><br><span class="line"> <span class="variable">$colorRandom</span>=mt_rand(<span class="number">0</span>,sizeof(<span class="variable">$colorList</span>)<span class="number">-1</span>);</span><br><span class="line"> imagesetpixel(<span class="variable">$image</span>,rand()%<span class="number">70</span>,rand()%<span class="number">15</span>,<span class="variable">$colorList</span>[<span class="variable">$colorRandom</span>]);</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="keyword">for</span>(<span class="variable">$k</span>=<span class="number">0</span>;<span class="variable">$k</span><<span class="number">3</span>;<span class="variable">$k</span>++){</span><br><span class="line"> <span class="variable">$colorRandom</span>=mt_rand(<span class="number">0</span>,sizeof(<span class="variable">$colorList</span>)<span class="number">-1</span>);</span><br><span class="line"> <span class="variable">$toDrawLine</span>=<span class="number">1</span>;</span><br><span class="line"> <span class="keyword">if</span>(<span class="variable">$toDrawLine</span>){</span><br><span class="line"> imageline(<span class="variable">$image</span>,mt_rand(<span class="number">0</span>,<span class="variable">$board_width</span>),mt_rand(<span class="number">0</span>,<span class="variable">$board_height</span>),mt_rand(<span class="number">0</span>,<span class="variable">$board_width</span>),mt_rand(<span class="number">0</span>,<span class="variable">$board_height</span>),<span class="variable">$colorList</span>[<span class="variable">$colorRandom</span>]);</span><br><span class="line"> }<span class="keyword">else</span>{</span><br><span class="line"> <span class="variable">$w</span>=mt_rand(<span class="number">0</span>,<span class="variable">$board_width</span>);</span><br><span class="line"> <span class="variable">$h</span>=mt_rand(<span class="number">0</span>,<span class="variable">$board_width</span>);</span><br><span class="line"> imagearc(<span class="variable">$image</span>,<span class="variable">$board_width</span>-floor(<span class="variable">$w</span> / <span class="number">2</span>),floor(<span class="variable">$h</span> / <span class="number">2</span>),<span class="variable">$w</span>,<span class="variable">$h</span>, rand(<span class="number">90</span>,<span class="number">180</span>),rand(<span class="number">180</span>,<span class="number">270</span>),<span class="variable">$colorList</span>[<span class="variable">$colorRandom</span>]);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> imagegif(<span class="variable">$image</span>);</span><br><span class="line"> imagedestroy(<span class="variable">$image</span>);</span><br><span class="line"> <span class="variable">$imagedata</span>[]=ob_get_contents();</span><br><span class="line"> <span class="variable">$delays</span>[] = <span class="variable">$delay</span>;</span><br><span class="line"> ob_clean();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> AnimatedGif(<span class="variable">$imagedata</span>, <span class="variable">$delays</span>, <span class="variable">$loops</span>);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<p>AnimatedGif:</p>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> *AnimatedGif类</span></span><br><span class="line"><span class="comment"> **/</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">AnimatedGif</span> </span>{</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * The built gif image</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@var</span> resource</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="variable">$image</span> = <span class="string">''</span>;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * The array of images to stack</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@var</span> array</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="variable">$buffer</span> = <span class="keyword">Array</span>();</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * How many times to loop? 0 = infinite</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@var</span> int</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="variable">$number_of_loops</span> = <span class="number">0</span>;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@var</span> int</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="variable">$DIS</span> = <span class="number">2</span>;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Which colour is transparent</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@var</span> int</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="variable">$transparent_colour</span> = <span class="number">-1</span>;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Is this the first frame</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@var</span> int</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="variable">$first_frame</span> = <span class="literal">TRUE</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Encode an animated gif</span></span><br><span class="line"><span class="comment"> * AnimatedGif constructor.</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> array $source_images</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> array $image_delays</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> $number_of_loops</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">__construct</span>(<span class="params"></span></span></span><br><span class="line"><span class="function"><span class="params"> <span class="keyword">array</span> <span class="variable">$source_images</span>,</span></span></span><br><span class="line"><span class="function"><span class="params"> <span class="keyword">array</span> <span class="variable">$image_delays</span>,</span></span></span><br><span class="line"><span class="function"><span class="params"> <span class="variable">$number_of_loops</span></span></span></span><br><span class="line"><span class="function"><span class="params"> </span>) </span>{</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * I have no idea what these even do, they appear to do nothing to the image so far</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="variable">$transparent_colour_red</span> = <span class="number">0</span>;</span><br><span class="line"> <span class="variable">$transparent_colour_green</span> = <span class="number">0</span>;</span><br><span class="line"> <span class="variable">$transparent_colour_blue</span> = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">$this</span>->number_of_loops = ( <span class="variable">$number_of_loops</span> > <span class="number">-1</span> ) ? <span class="variable">$number_of_loops</span> : <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">$this</span>->set_transparent_colour(<span class="variable">$transparent_colour_red</span>, <span class="variable">$transparent_colour_green</span>, <span class="variable">$transparent_colour_blue</span>);</span><br><span class="line"> <span class="keyword">$this</span>->buffer_images(<span class="variable">$source_images</span>);</span><br><span class="line"> <span class="keyword">$this</span>->addHeader();</span><br><span class="line"> <span class="keyword">for</span> (<span class="variable">$i</span> = <span class="number">0</span>; <span class="variable">$i</span> < count(<span class="keyword">$this</span>->buffer); <span class="variable">$i</span>++) {</span><br><span class="line"> <span class="keyword">$this</span>->addFrame(<span class="variable">$i</span>, <span class="variable">$image_delays</span> [<span class="variable">$i</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"> * Set the transparent colour</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> int $red</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> int $green</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> int $blue</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="function"><span class="keyword">function</span> <span class="title">set_transparent_colour</span>(<span class="params"><span class="variable">$red</span>, <span class="variable">$green</span>, <span class="variable">$blue</span></span>)</span>{</span><br><span class="line"> <span class="keyword">$this</span>->transparent_colour = ( <span class="variable">$red</span> > <span class="number">-1</span> && <span class="variable">$green</span> > <span class="number">-1</span> && <span class="variable">$blue</span> > <span class="number">-1</span> ) ?</span><br><span class="line"> ( <span class="variable">$red</span> | ( <span class="variable">$green</span> << <span class="number">8</span> ) | ( <span class="variable">$blue</span> << <span class="number">16</span> ) ) : <span class="number">-1</span>;</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"> * Buffer the images and check to make sure they are vaild</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> $source_images</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="function"><span class="keyword">function</span> <span class="title">buffer_images</span>(<span class="params"><span class="variable">$source_images</span></span>) </span>{</span><br><span class="line"> <span class="keyword">for</span> (<span class="variable">$i</span> = <span class="number">0</span>; <span class="variable">$i</span> < count(<span class="variable">$source_images</span>); <span class="variable">$i</span>++) {</span><br><span class="line"> <span class="keyword">$this</span>->buffer [] = <span class="variable">$source_images</span> [<span class="variable">$i</span>];</span><br><span class="line"> <span class="keyword">if</span> (substr(<span class="keyword">$this</span>->buffer [<span class="variable">$i</span>], <span class="number">0</span>, <span class="number">6</span>) != <span class="string">"GIF87a"</span> && substr(<span class="keyword">$this</span>->buffer [<span class="variable">$i</span>], <span class="number">0</span>, <span class="number">6</span>) != <span class="string">"GIF89a"</span>) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="built_in">Exception</span>(<span class="string">'Image at position '</span> . <span class="variable">$i</span>. <span class="string">' is not a gif'</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> (<span class="variable">$j</span> = ( <span class="number">13</span> + <span class="number">3</span> * ( <span class="number">2</span> << ( ord(<span class="keyword">$this</span>->buffer [<span class="variable">$i</span>] { <span class="number">10</span> }) & <span class="number">0x07</span> ) ) ), <span class="variable">$k</span> = <span class="literal">TRUE</span>; <span class="variable">$k</span>; <span class="variable">$j</span>++) {</span><br><span class="line"> <span class="keyword">switch</span> (<span class="keyword">$this</span>->buffer [<span class="variable">$i</span>] { <span class="variable">$j</span> }) {</span><br><span class="line"> <span class="keyword">case</span> <span class="string">"!"</span>:</span><br><span class="line"> <span class="keyword">if</span> (( substr(<span class="keyword">$this</span>->buffer [<span class="variable">$i</span>], ( <span class="variable">$j</span> + <span class="number">3</span>), <span class="number">8</span>) ) == <span class="string">"NETSCAPE"</span>) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="built_in">Exception</span>(<span class="string">'You cannot make an animation from an animated gif.'</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">";"</span>:</span><br><span class="line"> <span class="variable">$k</span> = <span class="literal">FALSE</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</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"> * Add the gif header to the image</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="function"><span class="keyword">function</span> <span class="title">addHeader</span>(<span class="params"></span>) </span>{</span><br><span class="line"> <span class="variable">$cmap</span> = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">$this</span>->image = <span class="string">'GIF89a'</span>;</span><br><span class="line"> <span class="keyword">if</span> (ord(<span class="keyword">$this</span>->buffer [<span class="number">0</span>] { <span class="number">10</span> }) & <span class="number">0x80</span>) {</span><br><span class="line"> <span class="variable">$cmap</span> = <span class="number">3</span> * ( <span class="number">2</span> << ( ord(<span class="keyword">$this</span>->buffer [<span class="number">0</span>] { <span class="number">10</span> }) & <span class="number">0x07</span> ) );</span><br><span class="line"> <span class="keyword">$this</span>->image .= substr(<span class="keyword">$this</span>->buffer [<span class="number">0</span>], <span class="number">6</span>, <span class="number">7</span>);</span><br><span class="line"> <span class="keyword">$this</span>->image .= substr(<span class="keyword">$this</span>->buffer [<span class="number">0</span>], <span class="number">13</span>, <span class="variable">$cmap</span>);</span><br><span class="line"> <span class="keyword">$this</span>->image .= <span class="string">"!\377\13NETSCAPE2.0\3\1"</span> . <span class="keyword">$this</span>->word(<span class="keyword">$this</span>->number_of_loops) . <span class="string">"\0"</span>;</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"> * Add a frame to the animation</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> int $frame The frame to be added</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> int $delay The delay associated with the frame</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="function"><span class="keyword">function</span> <span class="title">addFrame</span>(<span class="params"><span class="variable">$frame</span>, <span class="variable">$delay</span></span>) </span>{</span><br><span class="line"> <span class="variable">$Locals_str</span> = <span class="number">13</span> + <span class="number">3</span> * ( <span class="number">2</span> << ( ord(<span class="keyword">$this</span>->buffer [<span class="variable">$frame</span>] { <span class="number">10</span> }) & <span class="number">0x07</span> ) );</span><br><span class="line"> <span class="variable">$Locals_end</span> = strlen(<span class="keyword">$this</span>->buffer [<span class="variable">$frame</span>]) - <span class="variable">$Locals_str</span> - <span class="number">1</span>;</span><br><span class="line"> <span class="variable">$Locals_tmp</span> = substr(<span class="keyword">$this</span>->buffer [<span class="variable">$frame</span>], <span class="variable">$Locals_str</span>, <span class="variable">$Locals_end</span>);</span><br><span class="line"> <span class="variable">$Global_len</span> = <span class="number">2</span> << ( ord(<span class="keyword">$this</span>->buffer [<span class="number">0</span>] { <span class="number">10</span> }) & <span class="number">0x07</span> );</span><br><span class="line"> <span class="variable">$Locals_len</span> = <span class="number">2</span> << ( ord(<span class="keyword">$this</span>->buffer [<span class="variable">$frame</span>] { <span class="number">10</span> }) & <span class="number">0x07</span> );</span><br><span class="line"> <span class="variable">$Global_rgb</span> = substr(<span class="keyword">$this</span>->buffer [<span class="number">0</span>], <span class="number">13</span>, <span class="number">3</span> * ( <span class="number">2</span> << ( ord(<span class="keyword">$this</span>->buffer [<span class="number">0</span>] { <span class="number">10</span> }) & <span class="number">0x07</span> ) ));</span><br><span class="line"> <span class="variable">$Locals_rgb</span> = substr(<span class="keyword">$this</span>->buffer [<span class="variable">$frame</span>], <span class="number">13</span>, <span class="number">3</span> * ( <span class="number">2</span> << ( ord(<span class="keyword">$this</span>->buffer [<span class="variable">$frame</span>] { <span class="number">10</span> }) & <span class="number">0x07</span> ) ));</span><br><span class="line"> <span class="variable">$Locals_ext</span> = <span class="string">"!\xF9\x04"</span> . chr(( <span class="keyword">$this</span>->DIS << <span class="number">2</span> ) + <span class="number">0</span>) .</span><br><span class="line"> chr(( <span class="variable">$delay</span> >> <span class="number">0</span> ) & <span class="number">0xFF</span>) . chr(( <span class="variable">$delay</span> >> <span class="number">8</span> ) & <span class="number">0xFF</span>) . <span class="string">"\x0\x0"</span>;</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">$this</span>->transparent_colour > <span class="number">-1</span> && ord(<span class="keyword">$this</span>->buffer [<span class="variable">$frame</span>] { <span class="number">10</span> }) & <span class="number">0x80</span>) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="variable">$j</span> = <span class="number">0</span>; <span class="variable">$j</span> < ( <span class="number">2</span> << ( ord(<span class="keyword">$this</span>->buffer [<span class="variable">$frame</span>] { <span class="number">10</span> }) & <span class="number">0x07</span> ) ); <span class="variable">$j</span>++) {</span><br><span class="line"> <span class="keyword">if</span> (</span><br><span class="line"> ord(<span class="variable">$Locals_rgb</span> { <span class="number">3</span> * <span class="variable">$j</span> + <span class="number">0</span> }) == ( ( <span class="keyword">$this</span>->transparent_colour >> <span class="number">16</span> ) & <span class="number">0xFF</span> ) &&</span><br><span class="line"> ord(<span class="variable">$Locals_rgb</span> { <span class="number">3</span> * <span class="variable">$j</span> + <span class="number">1</span> }) == ( ( <span class="keyword">$this</span>->transparent_colour >> <span class="number">8</span> ) & <span class="number">0xFF</span> ) &&</span><br><span class="line"> ord(<span class="variable">$Locals_rgb</span> { <span class="number">3</span> * <span class="variable">$j</span> + <span class="number">2</span> }) == ( ( <span class="keyword">$this</span>->transparent_colour >> <span class="number">0</span> ) & <span class="number">0xFF</span> )</span><br><span class="line"> ) {</span><br><span class="line"> <span class="variable">$Locals_ext</span> = <span class="string">"!\xF9\x04"</span> . chr(( <span class="keyword">$this</span>->DIS << <span class="number">2</span> ) + <span class="number">1</span>) .</span><br><span class="line"> chr(( <span class="variable">$delay</span> >> <span class="number">0</span> ) & <span class="number">0xFF</span>) . chr(( <span class="variable">$delay</span> >> <span class="number">8</span> ) & <span class="number">0xFF</span>) . chr(<span class="variable">$j</span>) . <span class="string">"\x0"</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">switch</span> (<span class="variable">$Locals_tmp</span> { <span class="number">0</span> }) {</span><br><span class="line"> <span class="keyword">case</span> <span class="string">"!"</span>:</span><br><span class="line"> <span class="variable">$Locals_img</span> = substr(<span class="variable">$Locals_tmp</span>, <span class="number">8</span>, <span class="number">10</span>);</span><br><span class="line"> <span class="variable">$Locals_tmp</span> = substr(<span class="variable">$Locals_tmp</span>, <span class="number">18</span>, strlen(<span class="variable">$Locals_tmp</span>) - <span class="number">18</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">","</span>:</span><br><span class="line"> <span class="variable">$Locals_img</span> = substr(<span class="variable">$Locals_tmp</span>, <span class="number">0</span>, <span class="number">10</span>);</span><br><span class="line"> <span class="variable">$Locals_tmp</span> = substr(<span class="variable">$Locals_tmp</span>, <span class="number">10</span>, strlen(<span class="variable">$Locals_tmp</span>) - <span class="number">10</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (ord(<span class="keyword">$this</span>->buffer [<span class="variable">$frame</span>] { <span class="number">10</span> }) & <span class="number">0x80</span> && <span class="keyword">$this</span>->first_frame === <span class="literal">FALSE</span>) {</span><br><span class="line"> <span class="keyword">if</span> (<span class="variable">$Global_len</span> == <span class="variable">$Locals_len</span>) {</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">$this</span>->blockCompare(<span class="variable">$Global_rgb</span>, <span class="variable">$Locals_rgb</span>, <span class="variable">$Global_len</span>)) {</span><br><span class="line"> <span class="keyword">$this</span>->image .= ( <span class="variable">$Locals_ext</span> . <span class="variable">$Locals_img</span> . <span class="variable">$Locals_tmp</span> );</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="variable">$byte</span> = ord(<span class="variable">$Locals_img</span> { <span class="number">9</span> });</span><br><span class="line"> <span class="variable">$byte</span> |= <span class="number">0x80</span>;</span><br><span class="line"> <span class="variable">$byte</span> &= <span class="number">0xF8</span>;</span><br><span class="line"> <span class="variable">$byte</span> |= ( ord(<span class="keyword">$this</span>->buffer [<span class="number">0</span>] { <span class="number">10</span> }) & <span class="number">0x07</span> );</span><br><span class="line"> <span class="variable">$Locals_img</span> { <span class="number">9</span> } = chr(<span class="variable">$byte</span>);</span><br><span class="line"> <span class="keyword">$this</span>->image .= ( <span class="variable">$Locals_ext</span> . <span class="variable">$Locals_img</span> . <span class="variable">$Locals_rgb</span> . <span class="variable">$Locals_tmp</span> );</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="variable">$byte</span> = ord(<span class="variable">$Locals_img</span> { <span class="number">9</span> });</span><br><span class="line"> <span class="variable">$byte</span> |= <span class="number">0x80</span>;</span><br><span class="line"> <span class="variable">$byte</span> &= <span class="number">0xF8</span>;</span><br><span class="line"> <span class="variable">$byte</span> |= ( ord(<span class="keyword">$this</span>->buffer [<span class="variable">$frame</span>] { <span class="number">10</span> }) & <span class="number">0x07</span> );</span><br><span class="line"> <span class="variable">$Locals_img</span> { <span class="number">9</span> } = chr(<span class="variable">$byte</span>);</span><br><span class="line"> <span class="keyword">$this</span>->image .= ( <span class="variable">$Locals_ext</span> . <span class="variable">$Locals_img</span> . <span class="variable">$Locals_rgb</span> . <span class="variable">$Locals_tmp</span> );</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">$this</span>->image .= ( <span class="variable">$Locals_ext</span> . <span class="variable">$Locals_img</span> . <span class="variable">$Locals_tmp</span> );</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">$this</span>->first_frame = <span class="literal">FALSE</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Add the gif footer</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="function"><span class="keyword">function</span> <span class="title">addFooter</span>(<span class="params"></span>) </span>{</span><br><span class="line"> <span class="keyword">$this</span>->image .= <span class="string">";"</span>;</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"> * Compare gif blocks? What is a block?</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> $GlobalBlock</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> $LocalBlock</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> $Len</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> int</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="function"><span class="keyword">function</span> <span class="title">blockCompare</span>(<span class="params"><span class="variable">$GlobalBlock</span>, <span class="variable">$LocalBlock</span>, <span class="variable">$Len</span></span>) </span>{</span><br><span class="line"> <span class="keyword">for</span> (<span class="variable">$i</span> = <span class="number">0</span>; <span class="variable">$i</span> < <span class="variable">$Len</span>; <span class="variable">$i</span>++) {</span><br><span class="line"> <span class="keyword">if</span> (</span><br><span class="line"> <span class="variable">$GlobalBlock</span> { <span class="number">3</span> * <span class="variable">$i</span> + <span class="number">0</span> } != <span class="variable">$LocalBlock</span> { <span class="number">3</span> * <span class="variable">$i</span> + <span class="number">0</span> } ||</span><br><span class="line"> <span class="variable">$GlobalBlock</span> { <span class="number">3</span> * <span class="variable">$i</span> + <span class="number">1</span> } != <span class="variable">$LocalBlock</span> { <span class="number">3</span> * <span class="variable">$i</span> + <span class="number">1</span> } ||</span><br><span class="line"> <span class="variable">$GlobalBlock</span> { <span class="number">3</span> * <span class="variable">$i</span> + <span class="number">2</span> } != <span class="variable">$LocalBlock</span> { <span class="number">3</span> * <span class="variable">$i</span> + <span class="number">2</span> }</span><br><span class="line"> ) {</span><br><span class="line"> <span class="keyword">return</span> ( <span class="number">0</span> );</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> ( <span class="number">1</span> );</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * No clue</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> int $int</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> string the char you meant?</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="function"><span class="keyword">function</span> <span class="title">word</span>(<span class="params"><span class="variable">$int</span></span>) </span>{</span><br><span class="line"> <span class="keyword">return</span> ( chr(<span class="variable">$int</span> & <span class="number">0xFF</span>) . chr(( <span class="variable">$int</span> >> <span class="number">8</span> ) & <span class="number">0xFF</span>) );</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"> * Return the animated gif</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> resource</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">getAnimation</span>(<span class="params"></span>) </span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">$this</span>->image;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Return the animated gif</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@echo</span> image</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">display</span>(<span class="params"></span>) </span>{</span><br><span class="line"> <span class="comment">//late footer add</span></span><br><span class="line"> <span class="keyword">$this</span>->addFooter();</span><br><span class="line"> header(<span class="string">'Content-type:image/gif'</span>);</span><br><span class="line"> <span class="keyword">echo</span> <span class="keyword">$this</span>->image;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>使用示例代码:</p>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line"><span class="variable">$str</span> = <span class="string">'abcdefghijkmnpqrstuvwxy3456789'</span>;</span><br><span class="line"><span class="variable">$len</span> = strlen(<span class="variable">$str</span>) - <span class="number">1</span>;</span><br><span class="line"><span class="variable">$text</span> = <span class="string">''</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="variable">$i</span> = <span class="number">0</span>; <span class="variable">$i</span> < <span class="number">6</span>; <span class="variable">$i</span>++) {</span><br><span class="line"> <span class="variable">$text</span> .= <span class="variable">$str</span>[rand(<span class="number">0</span>, <span class="variable">$len</span>)];</span><br><span class="line">}</span><br><span class="line"><span class="variable">$gif</span> = ImageCode(</span><br><span class="line"> <span class="variable">$text</span>, <span class="number">8</span>, <span class="number">1</span>,</span><br><span class="line"> <span class="number">100</span>, <span class="number">35</span>,</span><br><span class="line"> <span class="number">23</span></span><br><span class="line">);</span><br><span class="line"><span class="variable">$gif</span>->display();</span><br></pre></td></tr></table></figure>]]></content>
<tags>
<tag>PHP</tag>
<tag>代码</tag>
<tag>captcha</tag>
<tag>gif</tag>
</tags>
</entry>
<entry>
<title>R7000刷Merlin</title>
<url>/posts/50136e28/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><p>之前买了一个Netgear R7000 路由器,到手后就感觉忍受不了它的那个超不好用的web ui,所以就没上手两分钟果断刷机成Merlin了.</p>
<a id="more"></a>
<h3 id="主要步骤"><a class="header-anchor" href="#主要步骤">➡️</a>主要步骤</h3>
<ol>
<li>刷机到<code>Merlin</code>和<code>Netgear</code>之间的一个过渡固件(这其实就是一些玩家做的<code>Netgear</code>版的<code>Merlin</code>固件包,是一个完整版的<code>Merlin</code>,只是版本比较老)</li>
<li>刷机到最新版的<code>Merlin</code></li>
</ol>
<h3 id="所需材料"><a class="header-anchor" href="#所需材料">➡️</a>所需材料</h3>
<p><a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R7000_380.70_0-X7.9.1-koolshare.chk" title="R7000_380.70_0-X7.9.1-koolshare.chk">R7000_380.70_0-X7.9.1-koolshare.chk</a><br>
<a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R7000_380.70_0-X7.9.1-koolshare.trx" title="R7000_380.70_0-X7.9.1-koolshare.trx">R7000_380.70_0-X7.9.1-koolshare.trx</a></p>
<h3 id="刷机方法"><a class="header-anchor" href="#刷机方法">➡️</a>刷机方法</h3>
<ul>
<li><a href="http://xn--www-0v1e42ucr2b2w5b9xj.routerlogin.net">浏览器输入www.routerlogin.net</a></li>
<li>进入<code>高级</code>—<code>管理</code>—<code>固件更新</code>,上传 <code>R7000_380.70_0-X7.9.1-koolshare.chk</code> 固件,点更新(有很多教程说要在这一步之前恢复出厂设置,不过我这边没有恢复也可以,如果有玩家不放心恢复出厂设置也可以)<br>
更新固件过程中路由器可能要重启几次</li>
<li>再输入<a href="http://router.asus.com/" title="http://router.asus.com/">http://router.asus.com/</a>访问新的固件的控制面板</li>
<li>恢复一次出厂设置(这一次恢复出厂设置和格式化jffs分区也不是是必须的)</li>
<li>格式化jffs分区 进入路由管理界面 -<code>系统管理</code>- <code>系统设置</code>,勾选<code>Format JFFS partition at next boot</code>,点击应用本页面设置后重启路由器</li>
<li>进入路由器设置。<code>系统管理</code>—<code>固件升级</code>,选择 <code>R7000_380.70_0-X7.9.1-koolshare.trx</code> 上传后更新。</li>
<li>再恢复一次出厂设置就可以正常使用了</li>
</ul>
<h5 id="清配置说明"><a class="header-anchor" href="#清配置说明">➡️</a>清配置说明</h5>
<table>
<thead>
<tr>
<th>A 刷 B</th>
<th>(B)X6.x</th>
<th>(B)X7.x</th>
<th>(B)X7.9.1</th>
</tr>
</thead>
<tbody>
<tr>
<td>(A)X6.x</td>
<td>保持</td>
<td>清配置+格式化jffs</td>
<td>清配置+格式化jffs</td>
</tr>
<tr>
<td>(A)X7.x</td>
<td>清配置+格式化jffs</td>
<td>保持</td>
<td>保持</td>
</tr>
<tr>
<td>(A)X7.9.1</td>
<td>清配置+格式化jffs</td>
<td>仅格式化jffs</td>
<td>保持</td>
</tr>
</tbody>
</table>
<h5 id="固件双清方法"><a class="header-anchor" href="#固件双清方法">➡️</a>固件双清方法</h5>
<p>如果固件出现问题,一时找不到解决办法,可以尝试双清并手动配置,方法如下</p>
<ul>
<li>格式化jffs分区:方法同上;</li>
<li>恢复出厂设置:进入路由管理界面 -【【系统管理】- 【恢复/导出/上传设置】- 【原厂默认值】,点击原厂默认值一栏的【恢复】按钮;</li>
<li>建议完成双清后手动配置路由,而不是用以前备份的配置,以避免可能的问题;</li>
</ul>
<h3 id="资源下载"><a class="header-anchor" href="#资源下载">➡️</a>资源下载</h3>
<ul>
<li>X7.9.1 固件 (trx)</li>
<li><a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R6300V2_380.70_0-X7.9.1-koolshare.trx" title="R6300V2">R6300V2</a></li>
<li><a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R6400_380.70_0-X7.9.1-koolshare.trx" title="R6400">R6400</a></li>
<li><a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R7000_380.70_0-X7.9.1-koolshare.trx" title="R6900/R7000">R6900/R7000</a></li>
<li><a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R8000_380.70_0-X7.9.1-koolshare.trx" title="R8000">R8000</a></li>
<li><a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R8500_380.70_0-X7.9.1-koolshare.trx" title="R8500">R8500</a></li>
<li>X7.9.1 过渡固件 (chk)</li>
<li><a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R6300V2_380.70_0-X7.9.1-koolshare.chk" title="R6300V2">R6300V2</a></li>
<li><a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R6400_380.70_0-X7.9.1-koolshare.chk" title="R6400">R6400</a></li>
<li><a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R7000_380.70_0-X7.9.1-koolshare.chk" title="R6900/R7000">R6900/R7000</a></li>
<li><a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R8000_380.70_0-X7.9.1-koolshare.chk" title="R8000">R8000</a></li>
<li><a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R8500_380.70_0-X7.9.1-koolshare.chk" title="R8500">R8500</a></li>
<li>X7.9</li>
<li><a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R6300V2_380.70_0-X7.9-koolshare.trx" title="R6300V2">R6300V2</a></li>
<li><a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R6400_380.70_0-X7.9-koolshare.trx" title="R6400">R6400</a></li>
<li><a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R7000_380.70_0-X7.9-koolshare.trx" title="R6900/R7000">R6900/R7000</a></li>
<li><a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R8000_380.70_0-X7.9-koolshare.trx" title="R8000">R8000</a></li>
<li><a href="https://blog.lilis.xin/pixivTop50/plugin/file/Router/R8500_380.70_0-X7.9-koolshare.trx" title="R8500">R8500</a></li>
</ul>
]]></content>
<tags>
<tag>Merlin</tag>
<tag>R7000</tag>
<tag>路由器</tag>
</tags>
</entry>
<entry>
<title>WordPress获取文章所有信息</title>
<url>/posts/9cdcaf4d/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><p>首先得得知当前请求的文章ID:</p>
<a id="more"></a>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line">get_the_ID(); <span class="comment">//会返回当前文章ID</span></span><br></pre></td></tr></table></figure>
<p>那么我们得知文章ID后,可以使用wordpress内置函数来获取文章的所有信息:</p>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line">get_post(<span class="variable">$id</span>); <span class="comment">//会返回id文章的所有信息</span></span><br></pre></td></tr></table></figure>
<p>获取到了些什么信息,我们可以看看获取的结果意义,可以得到你想要的文章任何信息:</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">post_author:(整数)文章作者的编号</span><br><span class="line"></span><br><span class="line">post_date:(字符)文章发表的日期和时间(YYYY-MM-DD HH-MM-SS)</span><br><span class="line"></span><br><span class="line">post_date_gmt:(字符)文章发表的格林尼治标准时间(GMT) (YYYY-MM-DD HH-MM-SS)</span><br><span class="line"></span><br><span class="line">post_content:(字符)文章内容</span><br><span class="line"></span><br><span class="line">post_title:(字符)文章标题</span><br><span class="line"></span><br><span class="line">post_category:(整数)文章类别的编号。注意:该值在WordPress 2.1之后的版本总为0。定义文章的类别时可使用 get_the_category()函数。</span><br><span class="line"></span><br><span class="line">post_excerpt:(字符)文章摘要</span><br><span class="line"></span><br><span class="line">post_status:(字符)文章状态(publish|pending|draft|private|static|object|attachment|inherit|future)</span><br><span class="line"></span><br><span class="line">comment_status:(字符)评论状态(open|closed|registered_only)</span><br><span class="line"></span><br><span class="line">ping_status:(字符)pingback/trackback状态(open|closed)</span><br><span class="line"></span><br><span class="line">post_password:(字符)文章密码</span><br><span class="line"></span><br><span class="line">post_name:(字符)文章的URL嵌套</span><br><span class="line"></span><br><span class="line">to_ping:(字符)要引用的URL链接</span><br><span class="line"></span><br><span class="line">pinged:(字符)引用过的链接</span><br><span class="line"></span><br><span class="line">post_modified:(字符)文章最后修改时间(YYYY-MM-DD HH-MM-SS)</span><br><span class="line"></span><br><span class="line">post_modified_gmt:(字符)文章最后修改GMT时间(YYYY-MM-DD HH-MM-SS)</span><br><span class="line"></span><br><span class="line">post_parent:(整数)父级文章编号(供附件等)</span><br><span class="line"> </span><br><span class="line">guid:(字符)文章的一个链接。注意:不能将GUID作为永久链接(虽然在2.5之前的版本中它的确被当作永久链接),也不能将它作为文章的可用链接。GUID是一种独有的标识符,只是目前恰巧成为文章的一个链接。</span><br><span class="line"> </span><br><span class="line">post_type:(字符)(日志 | 页面 | 附件)</span><br><span class="line"> </span><br><span class="line">post_mime_type:(字符)Mime类型(供附件等)</span><br><span class="line"> </span><br><span class="line">comment_count:(整数)评论总数</span><br></pre></td></tr></table></figure>
<p>原文链接:<br>
<a href="http://www.cleey.com/blog/single/id/508.html" title="WordPress获取文章所有信息">WordPress获取文章所有信息</a></p>
]]></content>
<tags>
<tag>PHP</tag>
<tag>WordPress</tag>
</tags>
</entry>
<entry>
<title>Centos下配置安装javaWeb环境</title>
<url>/posts/e3ac84e4/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><h2 id="搭建-Java-开发环境"><a class="header-anchor" href="#搭建-Java-开发环境">➡️</a>搭建 Java 开发环境</h2>
<h3 id="安装-JDK"><a class="header-anchor" href="#安装-JDK">➡️</a>安装 JDK</h3>
<p>JDK 是开发Java程序必须安装的软件,我们查看一下 yum 源里面的 JDK:</p>
<pre><code>yum list | grep jdk
</code></pre>
<a id="more"></a>
<p>选择适合本机的JDK,并安装:</p>
<pre><code>yum install java-1.8.0-openjdk* -y
</code></pre>
<p>安装完成后,查看是否安装成功(安装成功回显示jdk的版本号):</p>
<pre><code>java -version
openjdk version "1.8.0_171"
OpenJDK Runtime Environment (build 1.8.0_171-b10)
OpenJDK 64-Bit Server VM (build 25.171-b10, mixed mode)
</code></pre>
<h2 id="安装Tomcat"><a class="header-anchor" href="#安装Tomcat">➡️</a>安装Tomcat</h2>
<p>下载Tomcat,并解压到指定目录中。 <a href="http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.10/bin/apache-tomcat-9.0.10.tar.gz" title="Tomcat-9.0.10.tar.gz">Tomcat-9.0.10.tar.gz</a></p>
<pre><code>tar zxvf apache-tomcat-9.0.10.tar.gz
mv apache-tomcat-9.0.10/ /usr/local/tomcat9
#修改权限
chmod -R 777 /usr/local/tomcat9/bin
#启动Tomcat
/usr/local/tomcat9/bin/startup.sh
#修改nginx配置
location ~ .+\.jsp($|/) {
proxy_pass http://127.0.0.1:8080; #转发端口
proxy_set_header Host $host;
client_max_body_size 10m;
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数。
proxy_connect_timeout 90; #Nginx跟后端服务器连接超时时间。
proxy_read_timeout 90; #连接成功后,后端服务器响应时间。
proxy_buffer_size 4k; #设置代理服务器保存用户头信息的缓冲区大小。
proxy_buffers 6 32k; #proxy_buffers缓冲区。
proxy_busy_buffers_size 64k; #高负荷下缓冲大小。
proxy_temp_file_write_size 64k;#设定缓存文件夹大小。
}
#访问相关域名+/index.php即可看到Tomcat主页
</code></pre>
<h3 id="动静分离"><a class="header-anchor" href="#动静分离">➡️</a>动静分离</h3>
<p>新建一个<code>location</code>来专门转发静态文件</p>
<pre><code>location ~ \.(html|js|css|gif|jpg|png|bmp|swf)$ {
expires 30d;
root /usr/local/tomcat9/webapps/ROOT;
}</code></pre>
]]></content>
<tags>
<tag>java</tag>
<tag>javaWeb</tag>
</tags>
</entry>
<entry>
<title>./configure: error: SSL modules require the OpenSSL library.</title>
<url>/posts/62587966/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><p>CentOS 7.2 下 ./configure Nginx 时出现以下错误 ./configure: error: SSL modules require the OpenSSL library. 解决方法: 执行以下命令:</p>
<a id="more"></a>
<p>yum -y install openssl openssl-devel</p>
]]></content>
<tags>
<tag>configure</tag>
<tag>OpenSSL</tag>
</tags>
</entry>
<entry>
<title>和谐代码</title>
<url>/posts/43788fe5/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><h1>和谐代码</h1>
<a id="more"></a>
<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">var</span> a_idx = <span class="number">0</span>;</span><br><span class="line"> jQuery(<span class="built_in">document</span>).ready(<span class="function"><span class="keyword">function</span> (<span class="params">$</span>) </span>{</span><br><span class="line"> $(<span class="string">"body"</span>).click(<span class="function"><span class="keyword">function</span> (<span class="params">e</span>) </span>{</span><br><span class="line"> <span class="keyword">var</span> a = [</span><br><span class="line"> <span class="string">"富强"</span>, <span class="string">"民主"</span>, <span class="string">"文明"</span>, <span class="string">"和谐"</span>,</span><br><span class="line"> <span class="string">"自由"</span>, <span class="string">"平等"</span>, <span class="string">"公正"</span>,<span class="string">"法治"</span>, </span><br><span class="line"> <span class="string">"爱国"</span>, <span class="string">"敬业"</span>, <span class="string">"诚信"</span>, <span class="string">"友善"</span></span><br><span class="line"> ];</span><br><span class="line"> <span class="keyword">var</span> $i = $(<span class="string">"<span/>"</span>).text(a[a_idx]);</span><br><span class="line"> a_idx = (a_idx + <span class="number">1</span>) % a.length;</span><br><span class="line"> <span class="keyword">var</span> x = e.pageX,</span><br><span class="line"> y = e.pageY;</span><br><span class="line"> $i.css({</span><br><span class="line"> <span class="string">"z-index"</span>: <span class="number">9999999</span>,</span><br><span class="line"> <span class="string">"top"</span>: y - <span class="number">20</span>,</span><br><span class="line"> <span class="string">"left"</span>: x,</span><br><span class="line"> <span class="string">"position"</span>: <span class="string">"absolute"</span>,</span><br><span class="line"> <span class="string">"font-weight"</span>: <span class="string">"bold"</span>,</span><br><span class="line"> <span class="string">"color"</span>: <span class="string">"#ff6651"</span></span><br><span class="line"> });</span><br><span class="line"> $(<span class="string">"body"</span>).append($i);</span><br><span class="line"> $i.animate({</span><br><span class="line"> <span class="string">"top"</span>: y - <span class="number">180</span>,</span><br><span class="line"> <span class="string">"opacity"</span>: <span class="number">0</span></span><br><span class="line"> },</span><br><span class="line"> <span class="number">1500</span>,</span><br><span class="line"> <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>{</span><br><span class="line"> $i.remove();</span><br><span class="line"> });</span><br><span class="line"> });</span><br><span class="line"> });</span><br></pre></td></tr></table></figure>]]></content>
<tags>
<tag>JavaScript</tag>
</tags>
</entry>
<entry>
<title>gd-输出图片流</title>
<url>/posts/faad097e/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><p>最近在搞laravels项目,由于laravels是通过swoole来加速laravel的,php-fpm模式下的一些输出函数受到了干扰,比如:header(),在laravels下返回输出和header头的设定需要由response()来完成.但是gd的输出就比较特别了,它要么输出网页,要么输出文件.如果想要输出二进制流再交给PHP就比较麻烦了,网上普遍的方案就是先把gd图像输出到缓存文件里,再读取出来.可是在要有占用了太多的磁盘I/O</p>
<a id="more"></a>
<h4 id="问题"><a class="header-anchor" href="#问题">➡️</a>问题</h4>
<p><code>gd</code>直接输出到网页我们后台无法很好的设置<code>header</code>来标注文件类型.</p>
<h4 id="方案"><a class="header-anchor" href="#方案">➡️</a>方案</h4>
<p><code>gd</code>先输出到文件,在用<code>file_get_contents</code>读取.<br>
缺陷:太过于占用磁盘<code>I/O</code><br>
<code>gd</code>的输出先由<code>ob</code>缓存下来,再用<code>ob_get_contents</code>获取.<br>
代码:</p>
<figure class="highlight php"><table><tr><td class="code"><pre><span class="line">ob_start();</span><br><span class="line"><span class="keyword">switch</span> (<span class="variable">$type</span>) {</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'jpg'</span>:</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'jpeg'</span>:</span><br><span class="line"> <span class="variable">$type</span> = <span class="string">'image/jpeg'</span>;</span><br><span class="line"> imagejpeg(<span class="keyword">$this</span>->image, <span class="string">''</span>, <span class="number">0.5</span>);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'png'</span>:</span><br><span class="line"> <span class="variable">$type</span> = <span class="string">'image/png'</span>;</span><br><span class="line"> imagepng(<span class="keyword">$this</span>->image);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'bmp'</span>:</span><br><span class="line"> <span class="variable">$type</span> = <span class="string">'image/vnd.wap.wbmp'</span>;</span><br><span class="line"> imagewbmp(<span class="keyword">$this</span>->image);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'gif'</span>:</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="variable">$type</span> = <span class="string">'image/gif'</span>;</span><br><span class="line"> imagegif(<span class="keyword">$this</span>->image);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line"><span class="variable">$contents</span> = ob_get_contents();</span><br><span class="line">ob_end_clean();</span><br><span class="line"><span class="keyword">return</span> response(<span class="variable">$content</span>)</span><br><span class="line"> ->header(<span class="string">'Content-type'</span>, <span class="variable">$type</span>);</span><br></pre></td></tr></table></figure>]]></content>
<tags>
<tag>PHP</tag>
<tag>gd</tag>
<tag>ob</tag>
</tags>
</entry>
<entry>
<title>git 操作</title>
<url>/posts/150d1834/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><p>收集一些不怎么常用的<code>git</code>操作,以做记录</p>
<a id="more"></a>
<h3 id="git-合并操作"><a class="header-anchor" href="#git-合并操作">➡️</a>git 合并操作</h3>
<p>通过<code>git log</code>查看提交记录及其commitId<br>
再通过<code>git reset --soft commitId</code>来回退版本(–soft 和 --hard的区别就是 --soft是软回退,会将你这次commitId之后的提交全部回退到暂存区中,–hard会将你<br>
这次commitId之后的提交全部清除掉)<br>
此时你这次commitId之后的提交都会回到暂存区中<br>
git commit -m 随便写注释</p>
<h3 id="git-忽略文件操作"><a class="header-anchor" href="#git-忽略文件操作">➡️</a>git 忽略文件操作</h3>
<p><code>git</code>忽略文件文件可以用<code>.gitignore</code>文件来实现,但如果一个文件已经被跟踪,再加入<code>.gitignore</code>文件就无效了。<br>
这时可以<code>git rm --cached</code>,再更新<code>.gitignore</code>,忽略掉目标文件,最后再提交。<br>
使用命令<code>git update-index --assume-unchanged 文件</code>来标记文件,使<code>git</code>停止关注这个需要被忽略的文件,这样也可以达成效果,但是这是一种不合理不规范的做法。<br>
原因如下:<br>
首先,<code>git update-index</code>的定义是:</p>
<div class="note primary"><p>Register file contents in the working tree to the index(把工作区下的文件内容注册到索引区)</p>
</div>
<p>也就是说<code>update-index</code>针对的是<code>git</code>数据库里被记录的文件,而不是那些需要忽略的文件。<br>
接着看关于<code>--assume-unchanged</code>的描述:</p>
<div class="note primary"><p>When the “assume unchanged” bit is on, Git stops checking the working tree files for possible modifications, so you need to manually unset the bit to tell Git when you change the working tree file. This is sometimes helpful when working with a big project on a filesystem that has very slow lstat(2) system call (e.g. cifs).<br>
应用了该标识之后,Git 停止查看工作区文件可能发生的改变,所以你必须 手动 重置该标识以便 Git 知道你想要恢复对文件改变的追踪。当你工作在一个大型项目中,这在文件系统的<code>lstat</code>系统调用非常迟钝的时候会很有用。</p>
</div>
<p>也就是说这个命令本身只是一种让<code>git</code>暂时忽略文件变动的操作。<br>
主要是在修改一些大型文件时,防止<code>git</code>来回计算文件变化并更新工作区造成卡顿。<br>
<code>git update-index --assume-unchanged</code>的官方推荐用法是这样的:</p>
<ol>
<li>你正在修改一个巨大的文件,你先对其<code>git update-index --assume-unchanged</code>,这样<code>Git</code>暂时不会理睬你对文件做的修改;</li>
<li>当你的工作告一段落决定可以提交的时候,重置改标识:<code>git update-index --no-assume-unchanged</code>,于是<code>Git</code>只需要做一次更新,这是完全可以接受的了;</li>
<li>提交推送。</li>
</ol>
<p>另外,根据文档的进一步描述:</p>
<div class="note primary"><p>This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked files (akin to what .gitignore does for untracked files).</p>
</div>
<p>也就是说官方并不推荐这种做法,样的事情更应该用<code>.gitignore</code>文件来实现(针对未追踪的文件)。<br>
随之而来的新问题是,为什么已经被跟踪的文件<code>.gitignore</code>会失去效果?<br>
这是因为我们误解了<code>.gitignore</code>文件的用途,该文件只能作用于<code>Untracked Files</code>,也就是那些从来没有被<code>git</code>记录过的文件(自添加以后,从未 add 及 commit 过的文件)。<br>
之所以你的规则不生效,是因为那些文件曾经被<code>git</code>记录过,因此<code>.gitignore</code>对它们完全无效。<br>
因此,正确的做法应该先是<code>git rm --cached</code>,再更新<code>.gitignore</code>,忽略掉目标文件,最后再提交。</p>
<h3 id="git-撤回合并"><a class="header-anchor" href="#git-撤回合并">➡️</a>git 撤回合并</h3>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">git merge --abort</span><br></pre></td></tr></table></figure>]]></content>
</entry>
<entry>
<title>git本地仓库和裸仓库</title>
<url>/posts/ac107f22/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><h4 id="git-初始化"><a class="header-anchor" href="#git-初始化">➡️</a>git 初始化</h4>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">git init #git目录初始化</span><br><span class="line">git init <repo> #本地初始化,并且建立一个名为repo的空仓库</span><br><span class="line">git init --bare #git裸仓库初始化</span><br><span class="line">git init --bare <repo> #指定某个目录成为中心仓库(裸仓库)</span><br></pre></td></tr></table></figure>
<p><code>git init</code>这个命令执行后会在本地生成一个 .git 的文件夹,用来追踪仓库的所有变更。<br>
<code>--bare</code>: 使用 --bare 参数初始化的仓库,我们一般称之为裸仓库, 因为这样创建的仓库并不包含 工作区 , 也就是说,我们并不能在这个目录下执行我们一般使用的 Git 命令。</p>
<a id="more"></a>
<h5 id="对比"><a class="header-anchor" href="#对比">➡️</a>对比</h5>
<ul>
<li>直接 git init 创建的仓库:</li>
</ul>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[core]</span><br><span class="line"> repositoryformatversion = 0</span><br><span class="line"> filemode = true</span><br><span class="line"> bare = false</span><br><span class="line"> logallrefupdates = true</span><br><span class="line"> ignorecase = true</span><br><span class="line"> precomposeunicode = true</span><br></pre></td></tr></table></figure>
<ul>
<li>加了<code>--bare</code>创建的裸仓库:</li>
</ul>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">[core]</span><br><span class="line"> repositoryformatversion = 0</span><br><span class="line"> filemode = true</span><br><span class="line"> bare = true</span><br><span class="line"> ignorecase = true</span><br><span class="line"> precomposeunicode = true</span><br></pre></td></tr></table></figure>
<p>可以看到最直观的差异在于<code>bare</code>配置项是否为<code>true</code>, 此外不加<code>--bare</code>创建的本地仓库配置中有一项<code>logallrefupdates = true</code>, 作用根据名字就可以看出来, 记录所有的<code>ref</code>(引用) 更新, 关于<code>ref</code>的部分之后有时间可以再写,这个配置可以理解为是 Git 的一道防线。</p>
<h4 id="功能差异"><a class="header-anchor" href="#功能差异">➡️</a>功能差异</h4>
<p>我们可以使用最简单的例子演示一下。</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta">#</span><span class="bash"> 直接创建本地仓库</span></span><br><span class="line">git ➤ git init repo</span><br><span class="line"><span class="meta">#</span><span class="bash"> 创建裸仓库</span></span><br><span class="line">git ➤ git init --bare repo.git</span><br><span class="line"><span class="meta">#</span><span class="bash"> 分别 <span class="built_in">clone</span> 两个仓库</span></span><br><span class="line">git ➤ git clone repo test1</span><br><span class="line">正克隆到 'test1'...</span><br><span class="line">warning: 您似乎克隆了一个空版本库。</span><br><span class="line">完成。</span><br><span class="line">git ➤ git clone repo.git test2</span><br><span class="line">正克隆到 'test2'...</span><br><span class="line">warning: 您似乎克隆了一个空版本库。</span><br><span class="line">完成。</span><br><span class="line">git ➤</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 进入 test1 仓库</span></span><br><span class="line">git ➤ cd test1</span><br><span class="line">test1 ➤ touch test git:master</span><br><span class="line">test1 ➤ git add . git:master*</span><br><span class="line">test1 ➤ git commit -m '测试提交' git:master*</span><br><span class="line">[master(根提交) 456cf23] 测试提交</span><br><span class="line"> 1 file changed, 0 insertions(+), 0 deletions(-)</span><br><span class="line"> create mode 100644 test</span><br><span class="line">test1 ➤ git push origin master git:master</span><br><span class="line">Counting objects: 3, done.</span><br><span class="line">Writing objects: 100% (3/3), 217 bytes | 0 bytes/s, done.</span><br><span class="line">Total 3 (delta 0), reused 0 (delta 0)</span><br><span class="line">remote: error: refusing to update checked out branch: refs/heads/master</span><br><span class="line">remote: error: By default, updating the current branch in a non-bare repository</span><br><span class="line">remote: error: is denied, because it will make the index and work tree inconsistent</span><br><span class="line">remote: error: with what you pushed, and will require 'git reset --hard' to match</span><br><span class="line">remote: error: the work tree to HEAD.</span><br><span class="line">remote: error:</span><br><span class="line">remote: error: You can set 'receive.denyCurrentBranch' configuration variable to</span><br><span class="line">remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into</span><br><span class="line">remote: error: its current branch; however, this is not recommended unless you</span><br><span class="line">remote: error: arranged to update its work tree to match what you pushed in some</span><br><span class="line">remote: error: other way.</span><br><span class="line">remote: error:</span><br><span class="line">remote: error: To squelch this message and still keep the default behaviour, set</span><br><span class="line">remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.</span><br><span class="line">To /home/git/repo</span><br><span class="line"> ! [remote rejected] master -> master (branch is currently checked out)</span><br><span class="line">error: 无法推送一些引用到 '/home/git/repo'</span><br><span class="line"></span><br><span class="line"><span class="meta">#</span><span class="bash"> 进入 test2 仓库重复执行</span></span><br><span class="line">test1 ➤ cd ../test2 git:master</span><br><span class="line">test2 ➤ touch test git:master</span><br><span class="line">test2 ➤ git add . git:master*</span><br><span class="line">test2 ➤ git commit -m '再次测试提交' git:master*</span><br><span class="line">[master(根提交) c56efe8] 再次测试提交</span><br><span class="line"> 1 file changed, 0 insertions(+), 0 deletions(-)</span><br><span class="line"> create mode 100644 test</span><br><span class="line">test2 ➤ git push origin master git:master</span><br><span class="line">Counting objects: 3, done.</span><br><span class="line">Writing objects: 100% (3/3), 223 bytes | 0 bytes/s, done.</span><br><span class="line">Total 3 (delta 0), reused 0 (delta 0)</span><br><span class="line">To /home/git/repo.git</span><br><span class="line"> * [new branch] master -> master</span><br><span class="line">test2 ➤</span><br></pre></td></tr></table></figure>
<p>从裸仓库中<code>clone</code>下来的本地仓库可以正常的<code>push</code>操作,这也正是裸仓库的存在意义</p>
<p>原文链接:<br>
<a href="https://moelove.info/2016/12/04/Git-%E6%9C%AC%E5%9C%B0%E4%BB%93%E5%BA%93%E5%92%8C%E8%A3%B8%E4%BB%93%E5%BA%93/" title="Git 本地仓库和裸仓库">Git 本地仓库和裸仓库</a></p>
]]></content>
</entry>
<entry>
<title>hexo 插件</title>
<url>/posts/54690ca6/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><p>搜集整理常用的<code>hexo</code>插件</p>
<a id="more"></a>
<h4 id="hexo-helper-live2d"><a class="header-anchor" href="#hexo-helper-live2d">➡️</a>hexo-helper-live2d</h4>
<p>在hexo博客里增加纸片人</p>
<div style="text-align: center">
<div class="github-card" data-user="EYHN" data-repo="hexo-helper-live2d" data-height="200px" data-width="100%" data-theme="default" data-target="blank" data-client-id data-client-secret></div>
</div>
<script src="/github-card-lib/githubcard.js"></script>
<h4 id="hexo-tag-aplayer"><a class="header-anchor" href="#hexo-tag-aplayer">➡️</a>hexo-tag-aplayer</h4>
<p><code>APlayer</code>播放器的<code>Hexo</code>标签插件</p>
<div style="text-align: center">
<div class="github-card" data-user="MoePlayer" data-repo="hexo-tag-aplayer" data-height="200px" data-width="100%" data-theme="default" data-target="blank" data-client-id data-client-secret></div>
</div>
<script src="/github-card-lib/githubcard.js"></script>
<p>效果:</p>
<div id="aplayer0" class="aplayer" style="margin-bottom: 20px;"></div>
<script>
var options = {"narrow":false,"autoplay":false,"showlrc":3,"mode":"random","mutex":true,"theme":"#e6d0b2","preload":"metadata","listmaxheight":"100%","music":[{"title":"トリカゴ","author":"XX:me","url":"https://cn-south-17-aplayer-46154810.oss.dogecdn.com/darling.mp3","pic":"https://cn-south-17-aplayer-46154810.oss.dogecdn.com/darling.jpg","lrc":"https://cn-south-17-aplayer-46154810.oss.dogecdn.com/darling.lrc"},{"title":"前前前世","author":"RADWIMPS","url":"https://cn-south-17-aplayer-46154810.oss.dogecdn.com/yourname.mp3","pic":"https://cn-south-17-aplayer-46154810.oss.dogecdn.com/yourname.jpg","lrc":"https://cn-south-17-aplayer-46154810.oss.dogecdn.com/yourname.lrc"},{"title":"光るなら","author":"Goose house","url":"https://cn-south-17-aplayer-46154810.oss.dogecdn.com/hikarunara.mp3","pic":"https://cn-south-17-aplayer-46154810.oss.dogecdn.com/hikarunara.jpg","lrc":"https://cn-south-17-aplayer-46154810.oss.dogecdn.com/hikarunara.lrc"}]};
options.element = document.getElementById("aplayer0");
new APlayer(options);
</script>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">#安装</span><br><span class="line">yarn add hexo-tag-aplayer</span><br><span class="line">#使用</span><br><span class="line">{% aplayer title author url [picture_url, narrow, autoplay, width:xxx, lrc:xxx] %}</span><br></pre></td></tr></table></figure>
<p>标签参数</p>
<ul>
<li><code>title</code> : 曲目标题</li>
<li><code>author</code>: 曲目作者</li>
<li><code>url</code>: 音乐文件 URL 地址</li>
<li><code>picture_url</code>: (可选) 音乐对应的图片地址</li>
<li><code>narrow</code>: (可选)播放器袖珍风格</li>
<li><code>autoplay</code>: (可选) 自动播放,移动端浏览器暂时不支持此功能</li>
<li><code>width</code>:xxx: (可选) 播放器宽度 (默认: 100%)</li>
<li><code>lrc</code>:xxx: (可选)歌词文件 URL 地址</li>
</ul>
<h4 id="hexo-github-card"><a class="header-anchor" href="#hexo-github-card">➡️</a>hexo-github-card</h4>
<div style="text-align: center">
<div class="github-card" data-user="Gisonrg" data-repo="hexo-github-card" data-height="200px" data-width="100%" data-theme="default" data-target="blank" data-client-id data-client-secret></div>
</div>
<script src="/github-card-lib/githubcard.js"></script>
<p>使用这个插件可以像上面这样👆显示逼格较高的GitHub链接<br>
使用时只需要插入下面👇这个🏷️就可以了</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">{% githubCard user:your_user [repo:your_repo] [width:400] [height:200] [theme:default] [client_id:your_client_id] [client_secret:your_client_secret] [align:text-align_position] %}</span><br><span class="line">//这是上面那个卡片🏷️</span><br><span class="line">{% githubCard user:Gisonrg repo:hexo-github-card %}</span><br></pre></td></tr></table></figure>
<p>这个插件的默认宽度感觉有点不够美观,每次使用都需要自定义宽度也有点费事,而且默认打开方式是在当前页面页打开很不人性化,受不了的话可以选择修改文件</p>
<figure class="highlight javascript"><figcaption><span>node_modules/hexo-github-card/index.js</span></figcaption><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> user = argsObj.user,</span><br><span class="line"> repo = argsObj.repo,</span><br><span class="line"> width = argsObj.width || <span class="string">'100%'</span>,<span class="comment">//宽度自适应</span></span><br><span class="line"> height = argsObj.height || <span class="string">'200'</span>,</span><br><span class="line"> theme = argsObj.theme || <span class="string">'default'</span>,</span><br><span class="line"> client_id = argsObj.client_id || <span class="string">''</span>,</span><br><span class="line"> client_secret = argsObj.client_secret || <span class="string">''</span>,</span><br><span class="line"> align = argsObj.align || <span class="string">'center'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> payload = {</span><br><span class="line"> user,</span><br><span class="line"> repo,</span><br><span class="line"> height,</span><br><span class="line"> width,</span><br><span class="line"> theme,</span><br><span class="line"> client_id,</span><br><span class="line"> client_secret,</span><br><span class="line"> style: <span class="string">`text-align: <span class="subst">${align}</span>`</span>,</span><br><span class="line"> target: <span class="string">'blank'</span>,<span class="comment">//加上这个可以在其他标签页打开链接</span></span><br><span class="line">};</span><br></pre></td></tr></table></figure>
<p>由于直接在原文件上修改,后面再进行<code>yarn</code>的一些相关操作时<code>yarn</code>总是会自动把代码还原回去,<code>yarn</code>还不支持<code>ignore</code>名单功能,我就在原来的插件基础上进行了小的修改,使它的默认值配置更加人性化一点,有需要的小伙伴可以直接看看这个👇</p>
<div style="text-align: center">
<div class="github-card" data-user="l552121229" data-repo="hexo-github-card-customize" data-height="200px" data-width="100%" data-theme="default" data-target="blank" data-client-id data-client-secret></div>
</div>
<script src="/github-card-lib/githubcard.js"></script>
<p>这个修改过的插件可以配置默认设置</p>
<figure class="highlight yaml"><figcaption><span>_config.yml</span></figcaption><table><tr><td class="code"><pre><span class="line"><span class="attr">github_card:</span></span><br><span class="line"> <span class="attr">width:</span> <span class="number">100</span><span class="string">%</span></span><br><span class="line"> <span class="attr">height:</span> <span class="string">200px</span></span><br><span class="line"> <span class="attr">theme:</span> <span class="string">default</span></span><br><span class="line"> <span class="attr">align:</span> <span class="string">center</span></span><br><span class="line"> <span class="attr">target:</span> <span class="string">blank</span></span><br></pre></td></tr></table></figure>
<h4 id="基于next的插件"><a class="header-anchor" href="#基于next的插件">➡️</a>基于<code>next</code>的插件</h4>
<div class="note warning"><p>我现在使用的<code>next</code>是<code>7.4.0</code>版本的,下面的几个插件都是基于这个版本确认可用的,其他版本需要具体看相应的<code>GitHub</code>链接的说明</p>
</div>
<h5 id="theme-next-canvas-nest"><a class="header-anchor" href="#theme-next-canvas-nest">➡️</a>theme-next-canvas-nest</h5>
<div style="text-align: center">
<div class="github-card" data-user="theme-next" data-repo="theme-next-canvas-nest" data-height="200px" data-width="100%" data-theme="default" data-target="blank" data-client-id data-client-secret></div>
</div>
<script src="/github-card-lib/githubcard.js"></script>
<p>进入主题目录并clone代码</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">cd themes/next</span><br><span class="line">git clone https://github.com/theme-next/theme-next-canvas-nest source/lib/canvas-nest</span><br></pre></td></tr></table></figure>
<p>配置</p>
<figure class="highlight yaml"><figcaption><span>themes/next/_config.yml</span></figcaption><table><tr><td class="code"><pre><span class="line"><span class="attr">canvas_nest:</span></span><br><span class="line"> <span class="attr">enable:</span> <span class="literal">true</span></span><br><span class="line"> <span class="attr">onmobile:</span> <span class="literal">true</span> <span class="comment"># display on mobile or not</span></span><br><span class="line"> <span class="attr">color:</span> <span class="string">'0,0,255'</span> <span class="comment"># RGB values, use ',' to separate</span></span><br><span class="line"> <span class="attr">opacity:</span> <span class="number">0.5</span> <span class="comment"># the opacity of line: 0~1</span></span><br><span class="line"> <span class="attr">zIndex:</span> <span class="number">-1</span> <span class="comment"># z-index property of the background</span></span><br><span class="line"> <span class="attr">count:</span> <span class="number">99</span> <span class="comment"># the number of lines</span></span><br></pre></td></tr></table></figure>
<p>更新</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">cd themes/next/source/lib/canvas-nest</span><br><span class="line">git pull</span><br></pre></td></tr></table></figure>
<h5 id="theme-next-pjax"><a class="header-anchor" href="#theme-next-pjax">➡️</a>theme-next-pjax</h5>
<p>在<code>hexo</code>上使用<code>pjax</code>,优化访问速度,这个插件基于主题<code>next</code>实现</p>
<div style="text-align: center">
<div class="github-card" data-user="theme-next" data-repo="theme-next-pjax" data-height="200px" data-width="100%" data-theme="default" data-target="blank" data-client-id data-client-secret></div>
</div>
<script src="/github-card-lib/githubcard.js"></script>
<p>使用</p>
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">cd themes/next</span><br><span class="line">git clone https://github.com/theme-next/theme-next-pjax source/lib/pjax</span><br></pre></td></tr></table></figure>
<p>修改文件</p>
<figure class="highlight yaml"><figcaption><span>themes/next/_config.yml</span></figcaption><table><tr><td class="code"><pre><span class="line"><span class="attr">pjax:</span> <span class="literal">true</span></span><br><span class="line"><span class="string">...</span></span><br><span class="line"><span class="attr">vendors:</span></span><br><span class="line"> <span class="string">...</span></span><br><span class="line"> <span class="attr">pjax:</span> <span class="string">//cdn.jsdelivr.net/gh/theme-next/theme-next-pjax@0/pjax.min.js</span></span><br></pre></td></tr></table></figure>
<h4 id="比较有意思的git库"><a class="header-anchor" href="#比较有意思的git库">➡️</a>比较有意思的git库</h4>
<h5 id="91porn-php"><a class="header-anchor" href="#91porn-php">➡️</a>91porn_php</h5>
<div style="text-align: center">
<div class="github-card" data-user="zzjzz9266a" data-repo="91porn_php" data-height="200px" data-width="100%" data-theme="default" data-target="blank" data-client-id data-client-secret></div>
</div>
<script src="/github-card-lib/githubcard.js"></script>
]]></content>
</entry>
<entry>
<title>hexo 配置gitalk</title>
<url>/posts/44125ab6/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><p>我现在用的博客是静态网页,没有独立的后端服务器来支撑,为了实现评论功能,需要对接第三方的评论插件,经过各种考虑,决定使用<code>gitalk</code>。<br>
这是一个基于<code>GitHub</code>的<code>issues</code>来实现的评论工具。</p>
<a id="more"></a>
<p>这个功能使用到了以下插件</p>
<div style="text-align: center">
<div class="github-card" data-user="gitalk" data-repo="gitalk" data-height="200px" data-width="100%" data-theme="default" data-target="blank" data-client-id data-client-secret></div>
</div>
<script src="/github-card-lib/githubcard.js"></script>
<div style="text-align: center">
<div class="github-card" data-user="blueimp" data-repo="JavaScript-MD5" data-height="200px" data-width="100%" data-theme="default" data-target="blank" data-client-id data-client-secret></div>
</div>
<script src="/github-card-lib/githubcard.js"></script>
<h4 id="GitHub"><a class="header-anchor" href="#GitHub">➡️</a>GitHub</h4>
<p>首先得有一个<code>GitHub</code>账号,然后打开链接↙️<br>
<a href="https://github.com/settings/applications/new">New OAuth application</a><br>
注册一个<code>OAuth App</code><br>
具体填写参考如下:</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">Application name //应用名称</span><br><span class="line">Homepage URL //填自己的博客地址就可以了</span><br><span class="line">Application description //应用描述</span><br><span class="line">Authorization callback URL //填写自己要用 gitalk 的博客地址</span><br></pre></td></tr></table></figure>
<p>在这里填写完成之后你就会得到<code>Client ID</code>和<code>Client Secret</code>。</p>
<h4 id="文件修改"><a class="header-anchor" href="#文件修改">➡️</a>文件修改</h4>
<p>在主题目录下建立<code>/layout/_third-party/gitalk.swig</code>文件并添加以下代码</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">{% if page.comments && theme.gitalk.enable %}</span><br><span class="line"></span><br><span class="line"> <link rel="stylesheet" href="https://unpkg.com/gitalk/dist/gitalk.css"></span><br><span class="line"> <script src="https://unpkg.com/gitalk/dist/gitalk.min.js"></script></span><br><span class="line"> <script src="https://cdn.bootcss.com/blueimp-md5/2.12.0/js/md5.min.js"></script></span><br><span class="line"></span><br><span class="line"> <script type="text/javascript"></span><br><span class="line"> var gitalk = new Gitalk({</span><br><span class="line"> clientID: '{{ theme.gitalk.ClientID }}',</span><br><span class="line"> clientSecret: '{{ theme.gitalk.ClientSecret }}',</span><br><span class="line"> repo: '{{ theme.gitalk.repo }}',</span><br><span class="line"> owner: '{{ theme.gitalk.owner }}',</span><br><span class="line"> admin: '{{ theme.gitalk.adminUser }}',</span><br><span class="line"> id: md5({{ theme.gitalk.ID }}),</span><br><span class="line"> labels: {{ theme.gitalk.labels }},</span><br><span class="line"> perPage: {{ theme.gitalk.perPage }},</span><br><span class="line"> pagerDirection: '{{ theme.gitalk.pagerDirection }}',</span><br><span class="line"> createIssueManually: {{ theme.gitalk.createIssueManually }},</span><br><span class="line"> distractionFreeMode: {{ theme.gitalk.distractionFreeMode }}</span><br><span class="line"> })</span><br><span class="line"> gitalk.render('gitalk-container')</span><br><span class="line"> </script></span><br><span class="line">{% endif %}</span><br></pre></td></tr></table></figure>
<p>在主题的<code>/layout/_scripts/commons.swig</code>中添加以下代码</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">{% include '../_third-party/comments/gitalk.swig' %}</span><br></pre></td></tr></table></figure>
<p>接着,在主题的<code>/layout/_partials/comments.swig</code>中找到</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">{% elseif theme.valine.appid and theme.valine.appkey %}</span><br><span class="line"> <div class="comments" id="comments"></span><br><span class="line"> </div></span><br><span class="line">{% endif %}</span><br></pre></td></tr></table></figure>
<p>并添加以下代码</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">{% if theme.gitalk.enable %}</span><br><span class="line"> <div id="gitalk-container"></div></span><br><span class="line">{% endif %}</span><br></pre></td></tr></table></figure>
<h4 id="进行配置"><a class="header-anchor" href="#进行配置">➡️</a>进行配置</h4>
<p>在主题的配置文件中,添加一下内容</p>
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">gitalk:</span></span><br><span class="line"> <span class="attr">enable:</span> <span class="literal">true</span> <span class="comment"># 是否启动</span></span><br><span class="line"> <span class="attr">ClientID:</span> <span class="string">xxxxxx</span> <span class="comment"># 之前的Client ID</span></span><br><span class="line"> <span class="attr">ClientSecret:</span> <span class="string">xxxxxxxxxxxx</span> <span class="comment"># 之前的Client Secret</span></span><br><span class="line"> <span class="attr">repo:</span> <span class="string">gitalk</span> <span class="comment"># 留言板内容需要存放的仓库名称</span></span><br><span class="line"> <span class="attr">owner:</span> <span class="string">l552121229</span> <span class="comment"># 你 github 的帐号 eg: www.github.com/zhongxia245 ,帐号就是245</span></span><br><span class="line"> <span class="attr">adminUser:</span> [<span class="string">'l552121229'</span>] <span class="comment"># 管理员用户</span></span><br><span class="line"> <span class="attr">ID:</span> <span class="string">location.pathname</span></span><br><span class="line"> <span class="attr">labels:</span> <span class="string">'["gitalk"]'</span> <span class="comment"># issue 的标签</span></span><br><span class="line"> <span class="attr">perPage:</span> <span class="number">15</span> <span class="comment"># 每页展示条数</span></span><br><span class="line"> <span class="attr">pagerDirection:</span> <span class="string">last</span> <span class="comment"># 排序方式是从旧到新(first)还是从新到旧(last)</span></span><br><span class="line"> <span class="attr">createIssueManually:</span> <span class="literal">true</span> <span class="comment">#如果当前页面没有相应的 isssue ,且登录的用户属于 admin,则会自动创建 issue。如果设置为 true,则显示一个初始化页面,创建 issue 需要点击 init 按钮。</span></span><br><span class="line"> <span class="attr">distractionFreeMode:</span> <span class="literal">true</span> <span class="comment">#是否启用快捷键(cmd|ctrl + enter) 提交评论.</span></span><br></pre></td></tr></table></figure>
<ul>
<li>因为我们上面配置的<code>gitalk</code>是用<code>location.pathname</code>来作为项目标签区分的,如果这个文章名超过50个字就会报错,为了保险起见,我们通过引入<code>md5.min.js</code>来防止<code>lables</code>过长。</li>
</ul>
]]></content>
<tags>
<tag>hexo</tag>
<tag>gitalk</tag>
<tag>评论</tag>
<tag>node</tag>
</tags>
</entry>
<entry>
<title>源码编译安装mariadb数据库</title>
<url>/posts/9f7c77f/</url>
<content><![CDATA[<script src="/assets/js/APlayer.min.js"> </script><h2 id="源码安装CMake"><a class="header-anchor" href="#源码安装CMake">➡️</a>源码安装CMake</h2>
<a id="more"></a>
<h3 id="1-获取CMake源码包"><a class="header-anchor" href="#1-获取CMake源码包">➡️</a>1.获取CMake源码包</h3>
<p><a href="https://cmake.org/files/v3.12/cmake-3.12.0.tar.gz" title="cmake-3.12.0.tar.gz">cmake-3.12.0.tar.gz</a></p>
<h3 id="2-解压、编译、安装Cmake"><a class="header-anchor" href="#2-解压、编译、安装Cmake">➡️</a>2.解压、编译、安装Cmake</h3>
<pre><code>tar -xzvf cmake-3.12.0.tar.gz
cd cmake-3.12.0
./bootstrap
make
make install
</code></pre>
<h3 id="备注"><a class="header-anchor" href="#备注">➡️</a>备注</h3>
<p>cmake 会默认安装在 <code>usr/local/bin</code> 下面 <code>./bootstrap</code> 需要<code>gcc,gcc-c++</code>环境时</p>
<pre><code>yum install -y gcc gcc-c++
</code></pre>
<h2 id="源码安装mariadb"><a class="header-anchor" href="#源码安装mariadb">➡️</a>源码安装mariadb</h2>
<h3 id="1-获取源码包"><a class="header-anchor" href="#1-获取源码包">➡️</a>1.获取源码包</h3>
<p><a href="https://downloads.mariadb.org/f/mariadb-10.3.8/source/mariadb-10.3.8.tar.gz/from/http%3A//ftp.utexas.edu/mariadb" title="mariadb-10.3.8.tar.gz">mariadb-10.3.8.tar.gz</a></p>
<h3 id="2-编译环境准备"><a class="header-anchor" href="#2-编译环境准备">➡️</a>2.编译环境准备</h3>
<pre><code>yum groupinstall -y Development Tools ncurses-devel openssl-devel openssl
</code></pre>
<h3 id="3-创建mysql用户"><a class="header-anchor" href="#3-创建mysql用户">➡️</a>3.创建mysql用户</h3>
<pre><code>groupadd mysql
useradd -s /sbin/nologin -g mysql -M mysql
id mysql
# uid=500(mysql) gid=500(mysql) groups=500(mysql)
#创建数据库数据存放目录;
mkdir /mydata/data -pv
chown mysql:mysql /mydata/data/ -R
</code></pre>
<h3 id="4-编译安装MariaDB"><a class="header-anchor" href="#4-编译安装MariaDB">➡️</a>4.编译安装MariaDB</h3>
<pre><code>cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/mydata/data \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci
#编译完成后安装数据库:
make
make install
</code></pre>
<h3 id="5-配置安装MariaDB"><a class="header-anchor" href="#5-配置安装MariaDB">➡️</a>5.配置安装MariaDB</h3>
<pre><code>cd /usr/local/mysql/
scripts/mysql_install_db --user=mysql --datadir=/mydata/data
ls /mydata/data/
aria_log.00000001 ib_logfile0 mysql-bin.000001 mysql-bin.state
aria_log_control ib_logfile1 mysql-bin.000002 performance_schema
ibdata1 mysql mysql-bin.index test
</code></pre>
<h3 id="6-mariadb配置文件创建及更改,没有模版"><a class="header-anchor" href="#6-mariadb配置文件创建及更改,没有模版">➡️</a>6.mariadb配置文件创建及更改,没有模版</h3>
<pre><code>mkdir /etc/mysql
vim /etc/mysql/my.cnf
[mysqld]
port = 3306
datadir = /mydata/data
socket = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 256M
max_allowed_packet = 1M
table_open_cache = 256
sort_buffer_size = 1M
read_buffer_size = 1M
read_rnd_buffer_size = 4M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size= 16M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8
innodb_file_per_table = on
skip_name_resolve = on
</code></pre>
<p>创建服务脚本:</p>
<pre><code>cp support-files/mysql.server /etc/rc.d/init.d/mysqld
chkconfig --list mysqld
chkconfig --add mysqld
</code></pre>
<p>启动mysqld服务,测试启动</p>
<pre><code>service mysqld start
Starting MySQL. [ OK ]
</code></pre>
<h3 id="7-设置环境变量"><a class="header-anchor" href="#7-设置环境变量">➡️</a>7.设置环境变量</h3>
<pre><code>vim /etc/profile.d/mysqld.sh
MYSQL_HOME=/usr/local/mysql
export PATH=$MYSQL_HOME/bin:$PATH
</code></pre>
<h4 id="加载环境变量:"><a class="header-anchor" href="#加载环境变量:">➡️</a>加载环境变量:</h4>
<pre><code>source /etc/profile.d/mysqld.sh
</code></pre>
<h3 id="8-修改Mysql的root用户密码以及打开远程连接-可选"><a class="header-anchor" href="#8-修改Mysql的root用户密码以及打开远程连接-可选">➡️</a>8.修改Mysql的root用户密码以及打开远程连接(可选)</h3>
<pre><code>mysql