-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
3729 lines (3537 loc) · 288 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>9段PHP实用功能的代码推荐</title>
<url>/2018/02/24/9%E6%AE%B5PHP%E5%AE%9E%E7%94%A8%E5%8A%9F%E8%83%BD%E7%9A%84%E4%BB%A3%E7%A0%81%E6%8E%A8%E8%8D%90/</url>
<content><![CDATA[<a id="more"></a>
<blockquote>
<p> 一、查看邮件是否已被阅读</p>
</blockquote>
<p>当你在发送邮件时,你或许很想知道该邮件是否被对方已阅读。这里有段非常有趣的代码片段能够显示对方IP地址记录阅读的实际日期和时间。</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"><?php</span><br><span class="line">error_reporting(0);</span><br><span class="line">Header("Content-Type: image/jpeg");</span><br><span class="line">//Get IP</span><br><span class="line">if (!empty($_SERVER['HTTP_CLIENT_IP']))</span><br><span class="line">{</span><br><span class="line"> $ip=$_SERVER['HTTP_CLIENT_IP'];</span><br><span class="line">}</span><br><span class="line">elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR']))</span><br><span class="line">{</span><br><span class="line"> $ip=$_SERVER['HTTP_X_FORWARDED_FOR'];</span><br><span class="line">}</span><br><span class="line">else</span><br><span class="line">{</span><br><span class="line"> $ip=$_SERVER['REMOTE_ADDR'];</span><br><span class="line">}</span><br><span class="line">//Time</span><br><span class="line">$actual_time = time();</span><br><span class="line">$actual_day = date('Y.m.d', $actual_time);</span><br><span class="line">$actual_day_chart = date('d/m/y', $actual_time);</span><br><span class="line">$actual_hour = date('H:i:s', $actual_time);</span><br><span class="line">//GET Browser</span><br><span class="line">$browser = $_SERVER['HTTP_USER_AGENT'];</span><br><span class="line">//LOG</span><br><span class="line">$myFile = "log.txt";</span><br><span class="line">$fh = fopen($myFile, 'a+');</span><br><span class="line">$stringData = $actual_day . ' ' . $actual_hour . ' ' . $ip . ' ' . $browser . ' ' . "\r\n";</span><br><span class="line">fwrite($fh, $stringData);</span><br><span class="line">fclose($fh);</span><br><span class="line">//Generate Image (Es. dimesion is 1x1)</span><br><span class="line">$newimage = ImageCreate(1,1);</span><br><span class="line">$grigio = ImageColorAllocate($newimage,255,255,255);</span><br><span class="line">ImageJPEG($newimage);</span><br><span class="line">ImageDestroy($newimage);</span><br><span class="line">?></span><br></pre></td></tr></table></figure>
<blockquote>
<p> 二、从网页中提取关键字</p>
</blockquote>
<p>一段伟大的代码片段能够轻松的从网页中提取关键字。</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"><?php</span><br><span class="line">$meta = get_meta_tags('http://www.emoticode.net/');</span><br><span class="line">$keywords = $meta['keywords'];</span><br><span class="line">// Split keywords</span><br><span class="line">$keywords = explode(',', $keywords );</span><br><span class="line">// Trim them</span><br><span class="line">$keywords = array_map( 'trim', $keywords );</span><br><span class="line">// Remove empty values</span><br><span class="line">$keywords = array_filter( $keywords );</span><br><span class="line">print_r( $keywords );</span><br></pre></td></tr></table></figure>
<blockquote>
<p> 三、查找页面上的所有链接</p>
</blockquote>
<p>使用DOM,你可以轻松从任何页面上抓取链接,代码示例如下:</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"><?php</span><br><span class="line">$html = file_get_contents('http://www.example.com');</span><br><span class="line">$dom = new DOMDocument();</span><br><span class="line">@$dom->loadHTML($html);</span><br><span class="line">// grab all the on the page</span><br><span class="line">$xpath = new DOMXPath($dom);</span><br><span class="line">$hrefs = $xpath->evaluate("/html/body//a");</span><br><span class="line"></span><br><span class="line">for ($i = 0; $i < $hrefs->length; $i++) {</span><br><span class="line"> $href = $hrefs->item($i);</span><br><span class="line"> $url = $href->getAttribute('href');</span><br><span class="line"> echo $url.'<br />';</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<blockquote>
<p> 四、自动转换URL,跳转至超链接</p>
</blockquote>
<p>在WordPress中,如果你想自动转换URL,跳转至超链接页面,你可以利用内置的函数make_clickable()执行此操作。如果你想基于WordPress之外操作该程序,那么你可以参考wp-includes/formatting.php源代码。</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"><?php</span><br><span class="line">function _make_url_clickable_cb($matches) {</span><br><span class="line"> $ret = '';</span><br><span class="line"> $url = $matches[2];</span><br><span class="line"></span><br><span class="line"> if ( empty($url) )</span><br><span class="line"> return $matches[0];</span><br><span class="line"> // removed trailing [.,;:] from URL</span><br><span class="line"> if ( in_array(substr($url, -1), array('.', ',', ';', ':')) === true ) {</span><br><span class="line"> $ret = substr($url, -1);</span><br><span class="line"> $url = substr($url, 0, strlen($url)-1);</span><br><span class="line"> }</span><br><span class="line"> return $matches[1] . "<a href=\"$url\" rel=\"nofollow\">$url</a>" . $ret;</span><br><span class="line">}</span><br><span class="line">function _make_web_ftp_clickable_cb($matches) {</span><br><span class="line"> $ret = '';</span><br><span class="line"> $dest = $matches[2];</span><br><span class="line"> $dest = 'http://' . $dest;</span><br><span class="line"> if ( empty($dest) )</span><br><span class="line"> return $matches[0];</span><br><span class="line"> // removed trailing [,;:] from URL</span><br><span class="line"> if ( in_array(substr($dest, -1), array('.', ',', ';', ':')) === true ) {</span><br><span class="line"> $ret = substr($dest, -1);</span><br><span class="line"> $dest = substr($dest, 0, strlen($dest)-1);</span><br><span class="line"> }</span><br><span class="line"> return $matches[1] . "<a href=\"$dest\" rel=\"nofollow\">$dest</a>" . $ret;</span><br><span class="line">}</span><br><span class="line">function _make_email_clickable_cb($matches) {</span><br><span class="line"> $email = $matches[2] . '@' . $matches[3];</span><br><span class="line"> return $matches[1] . "<a href=\"mailto:$email\">$email</a>";</span><br><span class="line">}</span><br><span class="line">function make_clickable($ret) {</span><br><span class="line"> $ret = ' ' . $ret;</span><br><span class="line"> // in testing, using arrays here was found to be faster</span><br><span class="line"> $ret = preg_replace_callback('#([\s>])([\w]+?://[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]*)#is', '_make_url_clickable_cb', $ret);</span><br><span class="line"> $ret = preg_replace_callback('#([\s>])((www|ftp)\.[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]*)#is', '_make_web_ftp_clickable_cb', $ret);</span><br><span class="line"> $ret = preg_replace_callback('#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', '_make_email_clickable_cb', $ret);</span><br><span class="line"></span><br><span class="line"> // this one is not in an array because we need it to run last, for cleanup of accidental links within links</span><br><span class="line"> $ret = preg_replace("#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i", "$1$3</a>", $ret);</span><br><span class="line"> $ret = trim($ret);</span><br><span class="line"> return $ret;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<blockquote>
<p> 五、创建数据URL</p>
</blockquote>
<p>数据URL可以直接嵌入到HTML/CSS/JS中,以节省大量的 HTTP请求。 下面的这段代码可利用$file轻松创建数据URL</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"><?php</span><br><span class="line">function data_uri($file, $mime) {</span><br><span class="line"> $contents=file_get_contents($file);</span><br><span class="line"> $base64=base64_encode($contents);</span><br><span class="line"> echo "data:$mime;base64,$base64";</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<blockquote>
<p> 六、从服务器上下载&保存一个远程图片</p>
</blockquote>
<p>当你在搭建网站时,从远程服务器下载某张图片并且将其保存在自己的服务器上,这一操作会经常用到。代码如下:</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"><?php</span><br><span class="line">$image = file_get_contents('http://www.url.com/image.jpg');</span><br><span class="line">file_put_contents('/images/image.jpg', $image); //Where to save the image</span><br></pre></td></tr></table></figure>
<blockquote>
<p> 七、移除Remove Microsoft Word HTML Tag</p>
</blockquote>
<p>当你使用Microsoft Word会创建许多Tag,比如font,span,style,class等。这些标签对于Word本身而言是非常有用的,但是当你从Word粘贴至网页时,你会发现很多无用的Tag。因此,下面的这段代码可帮助你删除所有无用的Word HTML Tag。</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"><?php</span><br><span class="line">function cleanHTML($html) {</span><br><span class="line">/// <summary></span><br><span class="line">/// Removes all FONT and SPAN tags, and all Class and Style attributes.</span><br><span class="line">/// Designed to get rid of non-standard Microsoft Word HTML tags.</span><br><span class="line">/// </summary></span><br><span class="line">// start by completely removing all unwanted tags</span><br><span class="line"></span><br><span class="line">$html = ereg_replace("<(/)?(font|span|del|ins)[^>]*>","",$html);</span><br><span class="line"></span><br><span class="line">// then run another pass over the html (twice), removing unwanted attributes</span><br><span class="line"></span><br><span class="line">$html = ereg_replace("<([^>]*)(class|lang|style|size|face)=("[^"]*"|'[^']*'|[^>]+)([^>]*)>","<\1>",$html);</span><br><span class="line">$html = ereg_replace("<([^>]*)(class|lang|style|size|face)=("[^"]*"|'[^']*'|[^>]+)([^>]*)>","<\1>",$html);</span><br><span class="line">return $html</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<blockquote>
<p> 八、检测浏览器语言</p>
</blockquote>
<p>如果你的网站上有多种语言,那么可以使用这段代码作为默认的语言来检测浏览器语言。该段代码将返回浏览器客户端使用的初始语言。</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"><?php</span><br><span class="line">function get_client_language($availableLanguages, $default='en'){</span><br><span class="line"> if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {</span><br><span class="line"> $langs=explode(',',$_SERVER['HTTP_ACCEPT_LANGUAGE']);</span><br><span class="line"></span><br><span class="line"> foreach ($langs as $value){</span><br><span class="line"> $choice=substr($value,0,2);</span><br><span class="line"> if(in_array($choice, $availableLanguages)){</span><br><span class="line"> return $choice;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> } </span><br><span class="line"> return $default;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<blockquote>
<p> 九、显示Facebook 粉丝数量 </p>
</blockquote>
<p>如果你的网站或者博客上有内链的Facebook页面,你或许想知道拥有多少粉丝。这段代码将帮助你查看Facebook粉丝数,记住,别忘了在你的页面ID第二行添加该段代码</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"><?php</span><br><span class="line"> $page_id = "YOUR PAGE-ID";</span><br><span class="line"> $xml = @simplexml_load_file("http://api.facebook.com/restserver.php?method=facebook.fql.query&query=SELECT%20fan_count%20FROM%20page%20WHERE%20page_id=".$page_id."") or die ("a lot");</span><br><span class="line"> $fans = $xml->page->fan_count;</span><br><span class="line"> echo $fans;</span><br><span class="line">?></span><br></pre></td></tr></table></figure>
<hr>
<ul>
<li><strong>Notice</strong></li>
</ul>
<blockquote>
<p> 如若需要,请戳 <a href="https://shunhua.github.io/about/" target="_blank">[ About ]</a> 下联系我 欢迎联系.ok,enjoy it ! ~~</p>
</blockquote>
]]></content>
<tags>
<tag>php</tag>
</tags>
</entry>
<entry>
<title>CentOS 7 Git服务器搭建及配置公钥</title>
<url>/2018/04/08/CentOS-7-Git%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%90%AD%E5%BB%BA%E5%8F%8A%E9%85%8D%E7%BD%AE%E5%85%AC%E9%92%A5/</url>
<content><![CDATA[<a id="more"></a>
<p><strong>一、Git服务器搭建</strong></p>
<p>a. 安装Git</p>
<blockquote>
<p>yum install -y git</p>
</blockquote>
<p>b. 添加新用户、为用户设置密码</p>
<blockquote>
<p>adduser git<br>passwd git</p>
</blockquote>
<p>c. 创建空的Git仓库</p>
<blockquote>
<p>cd /home/git<br>git init --bare test.git<br>chown -R git:git ../git</p>
</blockquote>
<p>d. 在服务器端打开RSA认证</p>
<blockquote>
<p>cd /home/git<br>mkdir .ssh<br>cd .ssh<br>touch authorized_keys </p>
</blockquote>
<p>e. 命令行创建SSH key</p>
<blockquote>
<p>ssh-keygen -t rsa -C “<a href="mailto:x@qq.com">x@qq.com</a>“</p>
</blockquote>
<p>Linux 家目录/.ssh/:id_rsa、id_rsa.pub。<br>windows C:\Users\Administrator.ssh\</p>
<p>f.把步骤5生成的公钥导入服务器</p>
<blockquote>
<p>cat id_rsa.pub >> /home/git/.ssh/authorized_keys</p>
</blockquote>
<p>简单操作:windows 打开 Git-Gui->Help->Show SSH Key 直接复制key到Linux authorized_keys文件中 </p>
<p><strong>二、配置钩子</strong></p>
<p>a. 设置clone帐号的SSH key<br>我用的lnmp的环境 用户为 www</p>
<blockquote>
<p>sudo -u www ssh-keygen -t rsa -C “<a href="mailto:b@qq.com">b@qq.com</a>“<br>cat id_rsa.pub >> /home/git/.ssh/authorized_keys</p>
</blockquote>
<p>b. 设置Git用户使用www用户clone<br>设置了 /etc/sudoers 添加:</p>
<blockquote>
<p>git ALL=(ALL) NOPASSWD: ALL</p>
</blockquote>
<p>进入网站目录拉取<br>su git<br>sudo -u www git clone ssh://[email protected]/home/git/test.git </p>
<p>c. 配置钩子[主要]</p>
<blockquote>
<p>cd /home/git/test.git/hooks/<br>vim post-receive</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">#!/bin/bash</span><br><span class="line">export LANG=zh_CN.UTF-8</span><br><span class="line">cd /home/wwwroot/www/test/</span><br><span class="line">unset GIT_DIR </span><br><span class="line">sudo -u www git pull origin master</span><br></pre></td></tr></table></figure>
<blockquote>
<p>chown git:git post-receive<br>chmod +x post-receive</p>
</blockquote>
<p>在本地clone拉取远程git仓库</p>
<blockquote>
<p>git clone ssh://[email protected]/home/git/test.git</p>
</blockquote>
<p><strong>git 回滚到任意版本操作</strong></p>
<blockquote>
<p>git reset –hard xxx[版本号]<br>git push -f origin master</p>
</blockquote>
<p><strong>git known_hosts</strong></p>
<blockquote>
<p>sudo -u www ssh-keygen -R 127.0.0.1<br>sudo -u www git pull origin master</p>
</blockquote>
]]></content>
<tags>
<tag>CentOS 7</tag>
<tag>git</tag>
</tags>
</entry>
<entry>
<title>Alipay 开放平台支付</title>
<url>/2018/10/26/Alipay-%E5%BC%80%E6%94%BE%E5%B9%B3%E5%8F%B0%E6%94%AF%E4%BB%98/</url>
<content><![CDATA[<a id="more"></a>
<p>参考文档 <a href="https://docs.open.alipay.com/291/" target="_blank">[ 开放平台文档中心 ]</a></p>
<blockquote>
<p>生成RSA密钥</p>
</blockquote>
<p>a. 应用公钥2048<br>b. 应用私钥2048</p>
<blockquote>
<p>上传应用公钥并获取支付宝公钥</p>
</blockquote>
<p>支付宝公钥应用于开发中</p>
<blockquote>
<p>使用应用私钥生成请求签名</p>
</blockquote>
<p>应用私钥应用于开发中</p>
<blockquote>
<p>使用支付宝公钥验签</p>
</blockquote>
<p>支付宝公钥应用于开发中</p>
]]></content>
<tags>
<tag>Alipay</tag>
<tag>开放平台</tag>
</tags>
</entry>
<entry>
<title>CentOS 7 安装 Nginx 1.11.x</title>
<url>/2018/03/21/CentOS-7-%E5%AE%89%E8%A3%85-Nginx-1-11-x/</url>
<content><![CDATA[<p><strong>Centos下安装Nginx</strong> </p>
<a id="more"></a>
<p>一、准备工作 安装必备工具</p>
<blockquote>
<p>yum install -y gcc gcc-c++ autoconf automake<br>yum install -y zlib zlib-devel openssl openssl-devel pcre-devel</p>
</blockquote>
<p>不安装这些依赖库,后面编译的时候会报错,当然你的系统已经有这些包可以跳过。<br>pcre:用来作地址重写的功能。<br>zlib:nginx 的gzip模块,传输数据打包,省流量(但消耗资源)。<br>openssl:提供ssl加密协议。</p>
<p>二、添加nginx用户</p>
<blockquote>
<p>/usr/sbin/groupadd -f www<br>/usr/sbin/useradd -g www www</p>
</blockquote>
<p>三、nginx文件准备及编译</p>
<blockquote>
<p>wget <a href="http://nginx.org/download/nginx-1.11.4.tar.gz">http://nginx.org/download/nginx-1.11.4.tar.gz</a><br>tar -zxvf nginx-1.11.4.tar.gz<br>cd nginx-1.11.4/<br>./configure –user=www –group=www<br>make && make install</p>
</blockquote>
<p>四、开始firewall端口服务</p>
<blockquote>
<p>firewall-cmd –permanent –zone=public –add-service=http<br>firewall-cmd –reload</p>
</blockquote>
<p>常用命令</p>
<blockquote>
<p>/usr/local/nginx/sbin/nginx -s reload<br>/usr/local/nginx/sbin/nginx -s stop<br>/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf</p>
</blockquote>
]]></content>
<tags>
<tag>Centos</tag>
<tag>Nginx</tag>
</tags>
</entry>
<entry>
<title>CentOS 7 搭建SVN服务器</title>
<url>/2017/09/14/CentOS-7-%E6%90%AD%E5%BB%BASVN%E6%9C%8D%E5%8A%A1%E5%99%A8/</url>
<content><![CDATA[<p><strong> CentOS 7 搭建SVN服务器</strong> </p>
<a id="more"></a>
<p><strong>一、安装subversion</strong></p>
<blockquote>
<p> yum -y install subversion</p>
</blockquote>
<p><strong>二、配置svn</strong></p>
<p>a.建立仓库[repos]</p>
<blockquote>
<p> mkdir -p /home/svn/repos<br> svnadmin create /home/svn/repos/<br> cd /home/svn/repos/conf</p>
</blockquote>
<p>b.添加用户</p>
<blockquote>
<p>vi passwd</p>
</blockquote>
<p>例:添加</p>
<blockquote>
<p> test = 123456 </p>
</blockquote>
<p>c.添加用户权限</p>
<blockquote>
<p>vim authz</p>
</blockquote>
<p>添加</p>
<blockquote>
<p>[/]<br>test = rw</p>
</blockquote>
<p>d.配置文件</p>
<blockquote>
<p>vim svnserve.conf</p>
</blockquote>
<p>修改配置[启用]</p>
<blockquote>
<p>anon-access = none<br>auth-access = write # 授权用户可写<br>password-db = passwd # 使用哪个文件作为账号文件<br>authz-db = authz # 使用哪个文件作为权限文件<br>realm = /home/svn/repos # 认证空间名,版本库所在目录</p>
</blockquote>
<p>e.启动svn</p>
<blockquote>
<p>svnserve -d -r /home/svn # 启动svn版本库<br>svnserve -d -r /home/svn/repos # 启动svn版本库<br>killall svnserve # 停止SVN命令</p>
</blockquote>
<p><strong>三.钩子文件</strong></p>
<p>1.钩子配置</p>
<blockquote>
<p>cd ../hooks/<br>cp post-commit.tmpl post-commit<br>chmod +x post-commit<br>vim post-commit</p>
</blockquote>
<p>2.钩子脚本修改</p>
<blockquote>
<p>WEBPATH=”/home/wwwroot/test/“ # 网站目录<br>export.UTF-8<br>svn update $WEBPATH –username[test] username –password password[123456] –no-auth-cache</p>
</blockquote>
<p>3.拉取文件[在有副本的目录下]</p>
<blockquote>
<p>svn co svn://127.0.0.1/ ./<br>若拉取文件报错,请在有副本目录下拉取一下,然后把隐藏的文件夹 .svn文件放到需要拉取的目录下 就Ok了.</p>
</blockquote>
<p>4.拉取单个文件</p>
<blockquote>
<p>svn up laravel.log</p>
</blockquote>
<hr>
<ul>
<li><strong>Notice</strong></li>
</ul>
<blockquote>
<p> 本地拉取时 checkout地址 svn://ip/repos</p>
</blockquote>
<blockquote>
<p> 如若需要,请戳 <a href="https://shunhua.github.io/about/" target="_blank">[ About ]</a> 下联系我 欢迎联系.ok,enjoy it !!! </p>
</blockquote>
]]></content>
<tags>
<tag>CentOS 7</tag>
<tag>svn</tag>
</tags>
</entry>
<entry>
<title>CentOS 7 安装MySQL5.7</title>
<url>/2018/03/21/CentOS-7-%E5%AE%89%E8%A3%85MySQL5-7/</url>
<content><![CDATA[<p><strong>Centos下安装MySQL</strong> </p>
<a id="more"></a>
<p>官方mysql.com 支持我们使用yum的方式安装mysql 5.7最新版。所以大家根本无需手工编译安装(除非你需要)。CentOS7的yum源中默认好像是没有mysql的。为了解决这个问题,我们要先下载mysql的repo源。<br>一、下载mysql的repo源</p>
<blockquote>
<p>wget <a href="http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm">http://dev.mysql.com/get/mysql57-community-release-el7-9.noarch.rpm</a></p>
</blockquote>
<p>二、 安装mysql57-community-release-el7-9.noarch.rpm包</p>
<blockquote>
<p>rpm -ivh mysql57-community-release-el7-9.noarch.rpm</p>
</blockquote>
<p>三、 安装mysql (下载需要一段时间)</p>
<blockquote>
<p>yum install mysql-community-server</p>
</blockquote>
<p>四、启动mysql</p>
<blockquote>
<p>systemctl start mysqld<br>systemctl enable mysqld.service</p>
</blockquote>
<p>五、第一次启动后,mysql5.7 会生成一个随机root密码 (MySQL 5.7.6以上)</p>
<blockquote>
<p>grep ‘temporary passwor’ /var/log/mysqld.log</p>
</blockquote>
<p>修改root密码</p>
<blockquote>
<p>ALTER USER USER() IDENTIFIED BY ‘123456’;</p>
</blockquote>
<p>外网访问</p>
<blockquote>
<p>mysql -u root -p # 首次登录会修改密码<br>GRANT ALL PRIVILEGES ON <em>.</em> TO ‘root’@’%’ IDENTIFIED BY ‘your_root_password’ WITH GRANT OPTION;</p>
</blockquote>
<p>删除mysql</p>
<blockquote>
<p>rpm -qa|grep mysql;<br>yum remove packages</p>
</blockquote>
<p>端口查看</p>
<blockquote>
<p>ps -aux | grep mysql<br>netstat -apn | grep 3306<br>netstat -apn</p>
</blockquote>
]]></content>
<tags>
<tag>Centos</tag>
<tag>MySQL</tag>
</tags>
</entry>
<entry>
<title>Centos下两种守护进程的配置</title>
<url>/2018/03/21/Centos%E4%B8%8B%E4%B8%A4%E7%A7%8D%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B%E7%9A%84%E9%85%8D%E7%BD%AE/</url>
<content><![CDATA[<a id="more"></a>
<blockquote>
<p>一、php artisan</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">[program:laravel-worker-xx]</span><br><span class="line">process_name=%(program_name)s_%(process_num)02d</span><br><span class="line">command=php /home/wwwroot/www.xxx.com/artisan queue:work --tries=3</span><br><span class="line">autostart=true</span><br><span class="line">autorestart=true</span><br><span class="line">user=www</span><br><span class="line">numprocs=4</span><br><span class="line">redirect_stderr=true</span><br><span class="line">stdout_logfile=/home/wwwroot/www.xxx.com/storage/logs/worker.log</span><br></pre></td></tr></table></figure>
<blockquote>
<p>二、执行node js </p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">[program:laravel-worker-node]</span><br><span class="line">process_name=%(program_name)s_%(process_num)02d</span><br><span class="line">command= node /home/socket/stocket.js</span><br><span class="line">autostart=true</span><br><span class="line">autorestart=true</span><br><span class="line">user=www</span><br><span class="line">numprocs=1</span><br><span class="line">redirect_stderr=true</span><br><span class="line">stdout_logfile=/home/wwwroot/www.xx.com/storage/logs/worker.log</span><br></pre></td></tr></table></figure>
]]></content>
<tags>
<tag>Centos</tag>
</tags>
</entry>
<entry>
<title>Centos7下基于laradock部署laravel5.x</title>
<url>/2018/04/09/Centos7%E4%B8%8B%E5%9F%BA%E4%BA%8Elaradock%E9%83%A8%E7%BD%B2laravel5-x/</url>
<content><![CDATA[<a id="more"></a>
<p><strong>一、安装docker</strong></p>
<p>Go to:<a href="https://download.docker.com/linux/centos/7/x86_64/stable/Packages/" target="_blank">[ .rpm安装路径 ]</a> <a href="https://docs.docker.com/engine/installation/linux/docker-ce/centos/#install-using-the-repository" target="_blank">[ 官方参考 ]</a><br><img src="/assets/blogImg/laradock/1.png" alt="ico原来的样子"></p>
<p>打开路径地址,本文默认安装选择最新版,<br><img src="/assets/blogImg/laradock/2.png" alt="ico原来的样子"><br>下载rpm安装包</p>
<blockquote>
<p> wget <a href="https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm">https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm</a></p>
</blockquote>
<p>安装 Docker CE,执行命令</p>
<blockquote>
<p> $ sudo yum install docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm<br>或者 yum install /path/to/package.rpm </p>
</blockquote>
<p>启动docker –hello[docker run hello-world]</p>
<blockquote>
<p> systemctl start docker<br>systemctl enable docker 开机启动</p>
</blockquote>
<p><strong>二、CentOS 7配置中国镜像</strong></p>
<p><a href="https://yq.aliyun.com/articles/29941" target="_blank">[ 参考配置原文 ]</a> docker –registry-mirror=<a href="https://registry.docker-cn.com/">https://registry.docker-cn.com</a> daemon [提示找不到registry]</p>
<ul>
<li>CentOS的配置方式略微复杂,需要先将默认的配置文件复制出来</li>
<li>/lib/systemd/system/docker.service -> /etc/systemd/system/docker.service</li>
<li>然后再将加速器地址添加到配置文件的启动命令</li>
<li>重启Docker就可以了。</li>
</ul>
<blockquote>
<ul>
<li>sudo cp -n /lib/systemd/system/docker.service /etc/systemd/system/docker.service</li>
<li>sudo sed -i “s|ExecStart=/usr/bin/docker daemon|ExecStart=/usr/bin/docker daemon –registry-mirror=<a href="https://registry.docker-cn.com|g"/">https://registry.docker-cn.com|g"</a> /etc/systemd/system/docker.service</li>
<li>sudo sed -i “s|ExecStart=/usr/bin/dockerd|ExecStart=/usr/bin/dockerd –registry-mirror=<a href="https://registry.docker-cn.com|g"/">https://registry.docker-cn.com|g"</a> /etc/systemd/system/docker.service</li>
<li>sudo systemctl daemon-reload</li>
<li>sudo systemctl restart docker </li>
</ul>
</blockquote>
<p>docker 安装完成!!!</p>
<p><strong>三、拉取 Laradock</strong></p>
<ul>
<li>目录路径[/home/]</li>
<li>git clone <a href="https://github.com/Laradock/laradock.git">https://github.com/Laradock/laradock.git</a> </li>
<li>cp env-example .env </li>
<li>docker-compose up -d nginx mysql phpmyadmin</li>
<li>访问phpmyadmin[<a href="http://ip:8080/]%E9%BB%98%E8%AE%A4%E5%80%BC%E4%B8%BA">http://ip:8080/]默认值为</a> 服务器[mysql] 账号[root] 密码[root]</li>
<li>获取laradock[/home/laradock]后 在同级下创建项目目录[/home/www]</li>
<li>修改[/home/laradock/.env]APPLICATION=../www/</li>
<li>[/home/laradock]下使用root用户docker-compose exec workspace bash</li>
<li>[/home/laradock]下使用laradock用户 docker-compose exec –user=laradock workspace bash</li>
<li>配置中国镜像 composer config -g repo.packagist composer <a href="https://packagist.phpcomposer.com/">https://packagist.phpcomposer.com</a></li>
<li>创建laravel composer create-project laravel/laravel my-app</li>
</ul>
<blockquote>
<p> 安装SVN 配置钩子文件到 [/home/www] </p>
</blockquote>
<p><a href="https://lisonghe.com/detail/19" target="_blank">[ svn安装文档参考 ]</a> </p>
<blockquote>
<p> 安装SVN成功后,服务器开启端口权限,上传代码,修改数据库配置,导入数据库</p>
</blockquote>
<hr>
<ul>
<li><strong>Notice</strong></li>
</ul>
<blockquote>
<p> 如若需要,请戳 <a href="https://shunhua.github.io/about/" target="_blank">[ About ]</a> 下联系我 欢迎联系.ok,enjoy it ! ~~</p>
</blockquote>
]]></content>
<tags>
<tag>laradock</tag>
<tag>centos7</tag>
<tag>laravel5</tag>
<tag>docker</tag>
</tags>
</entry>
<entry>
<title>Docker下实践ELK(Elasticsearch、Logstash、Kibana)</title>
<url>/2021/12/22/Docker%E4%B8%8B%E5%AE%9E%E8%B7%B5ELK-Elasticsearch%E3%80%81Logstash%E3%80%81Kibana/</url>
<content><![CDATA[<p><img src="/assets/blogImg/elk.png" alt="elk"></p>
<a id="more"></a>
<p><strong>什么是 ELK</strong><br><a href="https://www.elastic.co/cn/what-is/elk-stack" target="_blank">[ 官方网址 ]</a> | <a href="https://github.com/deviantony/docker-elk" target="_blank">[ Github资源 ]</a><br><img src="/assets/blogImg/elk.svg" alt="elk"></p>
<ul>
<li>Elasticsearch</li>
</ul>
<blockquote>
<p>Elasticsearch 是一个分布式的 RESTful 风格的 <code>搜索和数据分析引擎</code>,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,它集中<code>存储您的数据</code>,帮助您发现意料之中以及意料之外的情况。</p>
</blockquote>
<ul>
<li>Logstash</li>
</ul>
<blockquote>
<p>Logstash 是开源的服务器端数据处理管道,能够同时 从多个来源 <code>采集数据、转换数据</code>,然后将数据发送到您最喜欢的<code>存储库</code> (存储库是 <code>Elasticsearch</code>)中。</p>
</blockquote>
<ul>
<li>Kibana</li>
</ul>
<blockquote>
<p>Kibana 让您能够<code>可视化 Elasticsearch</code> 中的数据并操作 Elastic Stack。</p>
</blockquote>
<p><img src="/assets/blogImg/elk-lu.svg" alt="elk-lu"><br><strong>整体架构流程图:</strong><br><a href="https://excalidraw.com/" target="_blank">[ 画图工具 ]</a></p>
<ul>
<li>filebeat: 负责将日志数据传输到 redis</li>
<li>Redis:暂时进行缓存</li>
<li>logstash: 收集缓存中的日志数据</li>
<li>elasticsearch: 负责存储日志数据</li>
<li>kibana: 负责显示日志的数据</li>
</ul>
<p><img src="/assets/blogImg/elk1.png" alt="elk"></p>
]]></content>
<tags>
<tag>ELK</tag>
</tags>
</entry>
<entry>
<title>Etcd一文</title>
<url>/2021/11/04/Etcd%E4%B8%80%E6%96%87/</url>
<content><![CDATA[<p><img src="/assets/blogImg/etcd.png" alt="Etcd"></p>
<a id="more"></a>
<p><strong>一、概述</strong></p>
<blockquote>
<p>背景:近期k8s应用中etcd的功能存在一些困惑,对其进行来单独的学习,能更深入理解k8s中的的一些特性。</p>
</blockquote>
<ul>
<li>简单:安装配置简单,而且提供了HTTP API进行交互,使用也很简单</li>
<li>安全:支持SSL证书验证</li>
<li>快速:根据官方提供的benchmark数据,单实例支持每秒2k+读操作</li>
<li>可靠:采用raft算法,实现分布式系统数据的可用性和一致性</li>
</ul>
<p><strong>二、应用场景</strong></p>
<ul>
<li>服务注册与发现</li>
<li>消息发布与订阅</li>
<li>负载均衡</li>
<li>分部署通知与协调</li>
<li>分布式锁</li>
<li>分布式队列</li>
<li>集群与监控与Leader选举</li>
</ul>
<p><strong>三、安装部署</strong></p>
<p>推荐使用yum安装方式</p>
<blockquote>
<p>hostnamectl set-hostname etcd-1<br>wget <a href="http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm">http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm</a><br>rpm -ivh epel-release-latest-7.noarch.rpm</p>
<h1 id="yum-仓库中的etcd版本为3-3-11,如果需要最新版本的etcd可以进行二进制安装"><a href="#yum-仓库中的etcd版本为3-3-11,如果需要最新版本的etcd可以进行二进制安装" class="headerlink" title="yum 仓库中的etcd版本为3.3.11,如果需要最新版本的etcd可以进行二进制安装"></a>yum 仓库中的etcd版本为3.3.11,如果需要最新版本的etcd可以进行二进制安装</h1><p>yum -y install etcd<br>systemctl enable etcd</p>
</blockquote>
<p><strong>四、简单使用</strong></p>
<p>1、增加 set</p>
<blockquote>
<p>$ etcdctl set /testdir/testkey “Hello world”<br>Hello world</p>
</blockquote>
<p>2、删除 rm</p>
<blockquote>
<p>$ etcdctl rm /testdir/testkey<br>PrevNode.Value: Hello</p>
</blockquote>
<p>3、更新 update</p>
<blockquote>
<p>etcdctl update /testdir/testkey “Hello”<br>Hello</p>
</blockquote>
<p>4、查询 get</p>
<blockquote>
<p>etcdctl get /testdir/testkey<br>Hello world</p>
</blockquote>
<p><strong>五、总结</strong></p>
<ul>
<li><p>etcd 默认只保存 1000 个历史事件,所以不适合有大量更新操作的场景,这样会导致数据的丢失。 etcd 典型的应用场景是配置管理和服务发现,这些场景都是读多写少的。</p>
</li>
<li><p>相比于 zookeeper,etcd 使用起来要简单很多。不过要实现真正的服务发现功能,etcd 还需要和其他工具(比如 registrator、confd 等)一起使用来实现服务的自动注册和更新。</p>
</li>
<li><p>目前 etcd 还没有图形化的工具。 </p>
</li>
</ul>
]]></content>
<tags>
<tag>Etcd</tag>
</tags>
</entry>
<entry>
<title>Centos下安装PHP7</title>
<url>/2018/03/21/Centos%E4%B8%8B%E5%AE%89%E8%A3%85PHP7/</url>
<content><![CDATA[<a id="more"></a>
<p>一、安装yum仓库</p>
<blockquote>
<p>yum install epel-release<br>rpm -Uvh <a href="https://mirror.webtatic.com/yum/el7/webtatic-release.rpm">https://mirror.webtatic.com/yum/el7/webtatic-release.rpm</a></p>
</blockquote>
<p>二、安装php7</p>
<blockquote>
<p>yum install php70w<br>php -v</p>
</blockquote>
<p>三、安装php扩展</p>
<blockquote>
<p>yum search php70<br>yum install php70w-xml php70w-soap php70w-xmlrpc<br>yum install php70w-mbstring php70w-json php70w-gd php70w-mcrypt<br>yum install php70w-fpm php70w-mysql php70w-pdo php70w-opcache</p>
</blockquote>
<p>nginx 配置 php</p>
<p>1、启动fpm</p>
<blockquote>
<p>systemctl start php-fpm<br>systemctl enable php-fpm # 开机启动</p>
</blockquote>
<p>2、配置nginx</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">location ~ \.php$ {</span><br><span class="line"> root html; </span><br><span class="line"> fastcgi_pass 127.0.0.1:9000; # 也可以用 socket 进行连接</span><br><span class="line"> fastcgi_index index.php;</span><br><span class="line"> fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;</span><br><span class="line"> include fastcgi_params;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>3、重启nginx</p>
<blockquote>
<p>systemctl restart nginx</p>
</blockquote>
<p>##php 错误日志##<br>nginx是一个web服务器,因此nginx的access日志只有对访问页面的记录,不会有php 的 error log信息。<br>nginx把对php的请求发给php-fpm fastcgi进程来处理,默认的php-fpm只会输出php-fpm的错误信息,在php-fpm的errors log里也看不到php的errorlog<br>原因是php-fpm的配置文件php-fpm.conf中默认是关闭worker进程的错误输出,直接把他们重定向到/dev/null,所以我们在nginx的error log 和php-fpm的errorlog都看不到php的错误日志。</p>
<p>1、修改php-fpm.conf中配置</p>
<blockquote>
<p>catch_workers_output = yes<br>error_log = log/error_log</p>
</blockquote>
<p>2、修改php.ini中配置</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">log_errors = On</span><br><span class="line">error_log = "/var/log/php/error_log" # 填写日志路径</span><br><span class="line">error_reporting = E_ALL&~E_NOTICE</span><br></pre></td></tr></table></figure>
<p>3、重启php-fpm<br>注意:<br>a、php-fpm.conf 中的php_admin_value[error_log] 参数 会覆盖php.ini中的 error_log 参数<br>所以确保你在phpinfo()中看到的最终error_log文件具有可写权限并且没有设置php_admin_value[error_log] 参数,否则错误日志会输出到php-fpm的错误日志里</p>
<p>b、找不到php.ini位置,使用php的phpinfo()结果查看<br>c、如何修改PHP错误日志不输出到页面或屏幕上</p>
<p>修改php.ini</p>
<blockquote>
<p>不显示错误信息(不输出到页面或屏幕上)<br>display_errors = off<br>记录错误信息(保存到日志文件中)<br>log_errors = on<br>捕获所有错误信息<br>error_reporting = E_ALL<br>设置日志文件名<br>error_log = </p>
</blockquote>
<p>程序中修改以上配置</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">ini_set("display_errors", 0)</span><br><span class="line">ini_set("error_reporting", E_ALL); </span><br><span class="line">ini_set("error_log", "<日志文件名>")</span><br><span class="line">ini_set("log_errors", 1);</span><br></pre></td></tr></table></figure>]]></content>
<tags>
<tag>Centos</tag>
<tag>PHP7</tag>
</tags>
</entry>
<entry>
<title>LNMP一键安装包常用命令及配置文件路径</title>
<url>/2017/12/06/LNMP%E4%B8%80%E9%94%AE%E5%AE%89%E8%A3%85%E5%8C%85%E5%B8%B8%E7%94%A8%E5%91%BD%E4%BB%A4%E5%8F%8A%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%B7%AF%E5%BE%84/</url>
<content><![CDATA[<a id="more"></a>
<p><strong>LNMP常用命令</strong></p>
<blockquote>
<p>状态管理LNMP状态管理:</p>
</blockquote>
<p>lnmp [start|stop|reload|restart|kill|status]</p>
<blockquote>
<p>Nginx状态管理:</p>
</blockquote>
<p>/etc/init.d/nginx [start|stop|reload|restart]</p>
<blockquote>
<p>PHP-FPM状态管理:</p>
</blockquote>
<p>/etc/init.d/php-fpm [start|stop|quit|restart|reload|logrotate]</p>
<blockquote>
<p>MySQL状态管理:</p>
</blockquote>
<p>/etc/init.d/mysql [start|stop|restart|reload|force-reload|status]</p>
<blockquote>
<p>Apache状态管理:</p>
</blockquote>
<p>/etc/init.d/httpd [start|stop|restart|graceful|graceful-stop|configtest|status]</p>
<p><strong>配置文件路径</strong></p>
<blockquote>
<p>MySQL目录:</p>
</blockquote>
<p> /usr/local/mysql/</p>
<blockquote>
<p>MySQL配置文件:</p>
</blockquote>
<p>/etc/my.cnf</p>
<hr>
<blockquote>
<p>PHP目录:</p>
</blockquote>
<p> /usr/local/php/</p>
<blockquote>
<p>PHP配置文件:</p>
</blockquote>
<p>/usr/local/php/etc/php.ini</p>
<hr>
<blockquote>
<p>网站目录:</p>
</blockquote>
<p>/home/wwwroot/default/</p>
<blockquote>
<p>Nginx配置文件:</p>
</blockquote>
<p>/usr/local/nginx/conf/nginx.conf</p>
<blockquote>
<p>Nginx日志目录:</p>
</blockquote>
<p>/home/wwwlogs/</p>
<blockquote>
<p>Nginx虚拟主机配置文件:</p>
</blockquote>
<p>/usr/local/nginx/conf/vhost/域名.conf</p>
<blockquote>
<p>常用Linux命令:</p>
</blockquote>
<ul>
<li>top</li>
<li>df -m[k]</li>
<li>find / -type f -size +1G</li>
<li>[> filename]</li>
</ul>
<p><strong>Notice</strong></p>
<blockquote>
<p> 如若需要,请戳 <a href="https://shunhua.github.io/about/" target="_blank">[ About ]</a> 下联系我 欢迎联系.ok,enjoy it ! </p>
</blockquote>
]]></content>
<tags>
<tag>lnmp</tag>
</tags>
</entry>
<entry>
<title>Go 语言基础</title>
<url>/2017/11/08/Go-%E8%AF%AD%E8%A8%80%E5%9F%BA%E7%A1%80/</url>
<content><![CDATA[<a id="more"></a>
<blockquote>
<p> 包、变量、函数</p>
</blockquote>
<ul>
<li><p>包<br>每个 Go 程序都是由包组成的。程序运行的入口是包 <code>main</code><br>这个程序使用并导入了包 “fmt” 和 <code>"math/rand"</code>。如:</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">package main</span><br><span class="line"></span><br><span class="line">import (</span><br><span class="line"> "fmt"</span><br><span class="line"> "math/rand"</span><br><span class="line">)</span><br></pre></td></tr></table></figure>
</li>
<li><p>变量<br>var 语句定义了一个变量的列表 如:</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">var c, python, java bool</span><br><span class="line">var i, j int = 1, 2</span><br><span class="line"></span><br><span class="line">func main() {</span><br><span class="line"> var i int</span><br><span class="line"> /*在函数中,`:=` 简洁赋值语句在明确类型的地方,可以用于替代 var 定义</span><br><span class="line"> 函数外的每个语句都必须以关键字开始(`var`、`func`、等等),`:=` 结构不能使用在函数外*/</span><br><span class="line"> k := 3</span><br><span class="line"> var c, python, java = true, false, "no!"</span><br><span class="line"> ...</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure></li>
<li><p>函数<br>函数可以没有参数或接受多个参数<br>在这个例子中,<code>add</code> 接受两个 int 类型的参数。如:</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">func add(x int, y int) int {</span><br><span class="line"> return x + y</span><br><span class="line">}</span><br><span class="line">||</span><br><span class="line">func add(x , y int) int {</span><br><span class="line"> return x + y</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
</li>
</ul>
<blockquote>
<p> 流程控制语句</p>
</blockquote>
<ul>
<li><p>for<br>Go 只有一种循环结构——<code>for</code> 循环<br>基本的 for 循环除了没有了 <code>( )</code> 之外(甚至强制不能使用它们)。如:</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">func main() {</span><br><span class="line"> sum := 0</span><br><span class="line"> for i := 0; i < 10; i++ {</span><br><span class="line"> sum += i</span><br><span class="line"> }</span><br><span class="line"> fmt.Println(sum)</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
</li>
<li><p>if<br>if 语句除了没有了 <code>( )</code> 之外(甚至强制不能使用它们)。如:</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">func sqrt(x float64) string {</span><br><span class="line"> if x < 0 {</span><br><span class="line"> return sqrt(-x) + "i"</span><br><span class="line"> }</span><br><span class="line"> if v := math.Pow(x, n); v < lim {</span><br><span class="line"> return v</span><br><span class="line"> } else {</span><br><span class="line"> fmt.Printf("%g >= %g\n", v, lim)</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
</li>
<li><p>switch<br>如:</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">func main() {</span><br><span class="line"> fmt.Print("Go runs on ")</span><br><span class="line"> switch os := runtime.GOOS; os {</span><br><span class="line"> case "darwin":</span><br><span class="line"> fmt.Println("OS X.")</span><br><span class="line"> case "linux":</span><br><span class="line"> fmt.Println("Linux.")</span><br><span class="line"> default:</span><br><span class="line"> // freebsd, openbsd,</span><br><span class="line"> // plan9, windows...</span><br><span class="line"> fmt.Printf("%s.", os)</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
</li>
<li><p>defer<br>defer 语句会延迟函数的执行直到上层函数返回。<br>延迟调用的参数会立刻生成,但是在上层函数返回前函数都不会被调用。</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">func main() {</span><br><span class="line"> defer fmt.Println("world")//延迟函数</span><br><span class="line"> fmt.Println("hello") //上层函数</span><br><span class="line">}</span><br><span class="line">//hello</span><br><span class="line">//wolrd</span><br></pre></td></tr></table></figure>
</li>
</ul>
<blockquote>
<p> 复杂类型</p>
</blockquote>
<ul>
<li><p>指针<br>Go 具有指针。 指针保存了变量的内存地址</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">func main() {</span><br><span class="line"> i, j := 42, 2701</span><br><span class="line"></span><br><span class="line"> p := &i /* 生成一个指向 i 的指针 */</span><br><span class="line"> fmt.Println(*p) /* 通过指针 p 读取 i */</span><br><span class="line"> *p = 21 /* 通过指针 p 设置 i */</span><br><span class="line"> fmt.Println(i) /* 输出 i =21 */ </span><br><span class="line">}</span><br></pre></td></tr></table></figure>
</li>
<li><p>结构体<br>一个结构体(<code>struct</code>)就是一个字段的集合</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">type Vertex struct {</span><br><span class="line"> X int</span><br><span class="line"> Y int</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">v := Vertex{1, 2}</span><br><span class="line">v.X = 4</span><br><span class="line">fmt.Println(v.X)</span><br></pre></td></tr></table></figure>
</li>
<li><p>数组<br>类型 [n]T 是一个有 n 个类型为 T 的值的数组</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">func main() {</span><br><span class="line"> var a [2]string</span><br><span class="line"> a[0] = "Hello"</span><br><span class="line"> a[1] = "World"</span><br><span class="line"> fmt.Println(a[0], a[1])</span><br><span class="line"> fmt.Println(a)</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
</li>
<li><p>slice<br>一个 slice 会指向一个序列的值,并且包含了长度信息<br>s[lo:hi]表示从 lo 到 hi-1 的 slice 元素,含两端。因此<br>s[lo:lo]是空的,而<br>s[lo:lo+1]有一个元素。</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">func main() {</span><br><span class="line"> p := []int{2, 3, 5, 7, 11, 13}</span><br><span class="line"> fmt.Println("p ==", p)</span><br><span class="line"></span><br><span class="line"> for i := 0; i < len(p); i++ {</span><br><span class="line"> fmt.Printf("p[%d] == %d\n", i, p[i])</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
</li>
<li><p>map<br>map 映射键到值</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">type Vertex struct {</span><br><span class="line"> Lat, Long float64</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">var m map[string]Vertex</span><br><span class="line"></span><br><span class="line">func main() {</span><br><span class="line"> m = make(map[string]Vertex)</span><br><span class="line"> m["Bell Labs"] = Vertex{</span><br><span class="line"> 40.68433, -74.39967,</span><br><span class="line"> }</span><br><span class="line"> fmt.Println(m["Bell Labs"])</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure></li>
</ul>
]]></content>
<tags>
<tag>golang</tag>
</tags>
</entry>
<entry>
<title>Laragon 在 Windows 中搭建 Laravel 开发环境</title>
<url>/2017/09/15/Laragon-%E5%9C%A8-Windows-%E4%B8%AD%E6%90%AD%E5%BB%BA-Laravel-%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83/</url>
<content><![CDATA[<a id="more"></a>
<p><strong>一、简介</strong></p>
<blockquote>
<p>之前coder陆续写了三篇介绍 Laravel 开发环境的教程:Homestead、Valet 和 LaraDock,我都是在 Mac 系统中安装使用的,相当流畅,没有任何梗,但是对于那些使用 Windows 的同学来说,Valet 就不说了,Homestead 和 LaraDock 虽说支持 Windows 系统,但是对小白来说,还是有一定复杂度的,难免有些磕磕跘跘,遇到这样那样的奇怪问题,可能大部分人会退而继续使用 Xampp、Wamp、phpStudy 之类集成工具,今天学院君要给大家推荐一款可能更加容易使用的 Windows 集成开发环境,更重要的是,它对 Laravel 非常友好,它的名字叫做 Laragon。Laragon 具备以下优秀的特性:</p>
</blockquote>
<ul>
<li> 自动创建虚拟主机(Virtual Host,Valet 也有这样的功能)</li>
<li> 邮件接收和发送</li>
<li> 非常方便地切换 PHP、Apache、MySQL 的不同版本</li>
<li> 轻松创建框架应用,如 Laravel、Symfony、WordPress、Joomla 等</li>
<li> 基于自己的需求为不同的环境设置不同的配置</li>
</ul>
<blockquote>
<p> 所以,从今天起,可以抛弃那些传统的集成开发环境了,Windows 上也可以搭建优雅的开发环境!</p>
</blockquote>
<p><strong>二、安装</strong></p>
<blockquote>
<p> 我们可以在这里下载 Laragon:<a href="https://sourceforge.net/projects/laragon/" target="_blank">[ laragon ]</a> Windows下的软件安装就不需多言了吧,注意在这一步勾选下 Auto virtual hosts(我的虚拟机语言选择中文乱码,所以使用了英文界面,你们可以自己根据喜好进行设置):</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/1.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 然后下一步点击安装即可。下面是 Laragon 启动后的界面:</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/2.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 要启动 Apache、MySQL 服务,需要点击 Start All 按钮:</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/3.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 这样点击 Web 即可打开浏览器访问默认站点 <a href="http://localhost:">http://localhost:</a></p>
</blockquote>
<p><img src="/assets/blogImg/laragon/4.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 要访问数据库,可以点击 Database 按钮:</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/5.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 默认数据库是 Laragon,用户名是 root,密码是空字符串,点击打开按钮,就可以访问这个默认的数据库:</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/6.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 点击 Laragon 界面的 Terminal 按钮可以进入到一个类 Unix 的终端工具 Cmder 进行命令行操作:</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/7.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 最后,Laragon 界面还有一个 Root 按钮,点击之后即可进入 Laragon 文档根目录,我的 Laragon 安装在 C 盘下,所以对应的文档根目录是 C:\laragon\www</p>
</blockquote>
<blockquote>
<p> 此外,Laragon 界面右上角还有个齿轮按钮,点击可以对系统进行设置,比如我们可以设置语言为简体中文::</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/8.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 文件根目录:目录地址是可以修改的 若有自己的项目根目录,可以选择自己的根目录.然后再通过点击终端进去 进入根目录试用下命令模式 重新加载下<br>nginx、Apache 下次进入终端就是自己设置的默认根目录下了.</p>
</blockquote>
<p><strong>三、自动创建虚拟主机</strong></p>
<blockquote>
<p> 和 Valet 类似,当你在 Laragon 文档根目录下创建新的文件夹时,启动 Laragon 就会自动为你创建虚拟主机,默认主机域名是 <a href="http://folder_name.dev,在浏览器中访问这个域名就能看到/">http://folder_name.dev,在浏览器中访问这个域名就能看到</a> Web 页面了,是不是很方便?我们可以在命令行中使用 Laravel 安装器安装一个 blog 应用(不知道怎么操作?可以参考<a href="https://shunhua.github.io/2017/09/15/laravel5.5%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8-%E2%80%94%E2%80%94-%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE%E7%AF%87/" target="_blank">[ 安装配置文档 ]</a> 中的安装部分):</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/9.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 那么在重新加载 Apache 服务器之后,就可以在浏览中通过 <a href="http://blog.dev/">http://blog.dev</a> 访问刚刚创建的应用了:</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/10.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 是不是很nice?如果你想将域名后缀 .dev 改成其它如 .com 可以通过点击 Laragon 界面上的齿轮按钮对默认配置进行修改:</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/11.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 将 .env 改成 .com 重新加载 Apache 服务即可通过 <a href="http://blog.com/">http://blog.com</a> 访问站点。</p>
</blockquote>
<p><strong>四、切换 PHP、Apache 和 MySQL 版本</strong></p>
<blockquote>
<p> 你可以通过点击 Laragon 界面上的菜单来切换不同软件的版本:</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/12.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 现在默认安装的 Laragon 每个软件都只有一个版本,以 PHP 为例如果想要支持多个版本的切换和测试,需要到 <a href="http://windows.php.net/download/">http://windows.php.net/download/</a> 去下载不同版本(需要下载 Non Thread Safe 版本),然后将下载后的文件解压到 C:\laragon\bin\php (注意这里的目录以你的Laragon安装目录为准,比如我的就是安装在 C:\laragon)目录下:</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/13.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 这样就可以进行版本切换了:</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/14.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 切换 MySQL 和 Apache 的版本也是类似,这里不再赘述,一般这种场景也不多。</p>
</blockquote>
<p><strong>五、启用 Nginx 替代 Apache</strong></p>
<blockquote>
<p> 如果你想要使用 Nginx 作为 Web 服务器,也可以轻松实现,在配置里面取消勾选 Apache,改为勾选 Nginx 然后修改绑定端口为 80 即可:</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/18.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 启用 Memcached 和 Redis 也只需要勾选上相应的配置项即可,非常方便。配置完成后,Laragon 会自动关闭 Apache 并启动 Nginx 服务器:</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/19.jpg" alt="ico原来的样子"></p>
<p>然后,在浏览器中访问 <a href="http://blog.dev,没有任何问题,平稳过渡,大功告成./">http://blog.dev,没有任何问题,平稳过渡,大功告成。</a></p>
<p><strong>六、快速创建 Laravel 应用</strong></p>
<blockquote>
<p> 上面我们通过 Laravel 安装器创建了一个新的 Laravel 应用,其实已经很方便了,但是还有更方便的,我们通过点击”菜单->快速创建->Laravel”可以不用敲任何命令就可以安装一个 Laravel 应用:</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/15.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 在弹出的窗口中输入应用的名称:</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/16.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> 点击Ok后就会弹出命令行窗口为我们创建应用:</p>
</blockquote>
<p><img src="/assets/blogImg/laragon/17.jpg" alt="ico原来的样子"></p>
<blockquote>
<p> Laragon 还有更多功能等着你去挖掘,比如也支持基于 Ngrok 进行站点分享,支持 Node、Putty、Yarn、文件传输等等,欢迎你在使用的过程中与我们分享。</p>
</blockquote>
<hr>
<ul>
<li><strong>Notice</strong></li>
</ul>
<blockquote>
<p> 如若需要,请戳 <a href="https://shunhua.github.io/about/" target="_blank">[ About ]</a> 下联系我 欢迎联系.ok,enjoy it ! </p>
</blockquote>
]]></content>
<tags>
<tag>Laragon</tag>
<tag>Laravel</tag>
<tag>Windows</tag>
</tags>
</entry>
<entry>
<title>Laravel Redis 广播测试</title>
<url>/2019/04/19/Laravel-Redis-%E5%B9%BF%E6%92%AD%E6%B5%8B%E8%AF%95/</url>
<content><![CDATA[<a id="more"></a>
<p> 附上 <a href="https://github.com/shunhua/laravel-echo" target="_blank">[Github]</a> 地址 </p>
<p> 一、项目搭建<br> a.安装laravel</p>
<blockquote>
<p>composer create-project –prefer-dist laravel/laravel echo</p>
</blockquote>
<p> b.配置mysql 数据库</p>
<blockquote>
<p>php artisan migrate</p>
</blockquote>
<p> c.快速认证</p>
<blockquote>
<p>php artisan make:auth</p>
</blockquote>
<p> 本文仅使用了 redis 的广播驱动 测试环境 win10<br> 二、安装redis 并启动</p>
<blockquote>
<p>redis-server.exe</p>
</blockquote>
<p><img src="/assets/blogImg/guangbo/redis.png" alt="ico原来的样子"><br>测试redis 连接成功<br><img src="/assets/blogImg/guangbo/redis1.png" alt="ico原来的样子"></p>
<p>a.配置文件 .env 中配置以下代码</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">BROADCAST_DRIVER=redis</span><br></pre></td></tr></table></figure>
<p>b.广播服务提供者 config/app.php 配置文件中 providers 数组中打开注释</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">App\Providers\BroadcastServiceProvider::class,</span><br></pre></td></tr></table></figure>
<p>c.CSRF 令牌[后续视图中添加]</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"><meta name="csrf-token" content="{{ csrf_token() }}"></span><br></pre></td></tr></table></figure>
<p>d.安装 Predis 库</p>
<blockquote>
<p>composer require predis/predis</p>
</blockquote>
<p>三、安装 Laravel Echo</p>
<p>a.通过 npm 包管理器安装 Echo</p>
<blockquote>
<p>npm install<br> npm install -g laravel-echo-server</p>
</blockquote>
<p>b.初始化 laravel-echo-server</p>
<blockquote>
<p>laravel-echo-server init</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">// 是否在开发模式下运行此服务器(y/n) 输入y</span><br><span class="line">? Do you want to run this server in development mode? (y/N) </span><br><span class="line">// 设置服务器的端口 默认 6001 输入 6001就可以了 或者你想要的</span><br><span class="line">? Which port would you like to serve from? (6001)</span><br><span class="line">// 想用的数据库 选择 redis</span><br><span class="line">? Which database would you like to use to store presence channel members? (Use arrow keys)</span><br><span class="line">❯ redis </span><br><span class="line"> sqlite </span><br><span class="line">// 这里输入 你的laravel 项目的访问域名</span><br><span class="line">? Enter the host of your Laravel authentication server. (http://localhost) </span><br><span class="line">// 选择 网络协议 http</span><br><span class="line">? Will you be serving on http or https? (Use arrow keys)</span><br><span class="line">❯ http </span><br><span class="line"> https </span><br><span class="line">// 您想为HTTP API生成客户端ID/密钥吗 N</span><br><span class="line">? Do you want to generate a client ID/Key for HTTP API? (y/N) </span><br><span class="line">// 要设置对API的跨域访问吗?(y/n)N</span><br><span class="line">Configuration file saved. Run laravel-echo-server start to run server.</span><br></pre></td></tr></table></figure>
<p>设置完成后 项目根目录 下 会生成 laravel-echo-server.json 文件 这里面就是刚才的配置<br><img src="/assets/blogImg/guangbo/echo.png" alt="ico原来的样子"><br>执行命令启动 服务 出现如下 则启动成功</p>
<blockquote>
<p>laravel-echo-server start</p>
</blockquote>
<p><img src="/assets/blogImg/guangbo/echo1.png" alt="ico原来的样子"></p>
<p>四、频道<br>频道Channel、PrivateChannel 或 PresenceChannel 的实例。Channel 实例表示任何用户都可以订阅的公开频道,而 PrivateChannels 和 PresenceChannels 则表示需要 频道授权 的私有频道:<br>a.创建事件</p>
<blockquote>
<p>php artisan make:event PublicMessageEvent </p>
</blockquote>
<p>文件生成目录 app/Events</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">public $message;</span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> * Create a new event instance.</span><br><span class="line"> *</span><br><span class="line"> * @param User $user</span><br><span class="line"> * @param string $message</span><br><span class="line"> */</span><br><span class="line">public function __construct(string $message)</span><br><span class="line">{</span><br><span class="line"> $this->message = $message;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">/**</span><br><span class="line"> * Get the channels the event should broadcast on.</span><br><span class="line"> *</span><br><span class="line"> * @return \Illuminate\Broadcasting\Channel|array</span><br><span class="line"> */</span><br><span class="line">public function broadcastOn()</span><br><span class="line">{</span><br><span class="line"> return new Channel('push');</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">//Laravel 默认会使用事件的类名作为广播名称来广播事件,自定义:</span><br><span class="line">public function broadcastAs()</span><br><span class="line">{</span><br><span class="line"> return 'push.message';</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">//想更细粒度地控制广播数据:</span><br><span class="line">public function broadcastWith()</span><br><span class="line">{</span><br><span class="line"> return ['message' => $this->message,'status' => 'okok'];</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">// laravel-echo-server 1.5 版本的 需要添加 否则Laravel echo channel listen 不监听事件</span><br><span class="line">public function handle()</span><br><span class="line">{</span><br><span class="line"> broadcast(new push());</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<p>b.添加路由</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">use App\Events\PublicMessageEvent;</span><br><span class="line"> Route::get('/echo', function () {</span><br><span class="line"> return view('echo');</span><br><span class="line"> });</span><br><span class="line"></span><br><span class="line">Route::get('/push/{message}', function ($message) {</span><br><span class="line"> broadcast(new PublicMessageEvent($message));</span><br><span class="line">})</span><br></pre></td></tr></table></figure>
<p>五、前端视图<br>a.安装 laravel-echo</p>
<blockquote>
<p>npm install laravel-echo</p>
</blockquote>
<p>编辑 resource/js/bootstrap.js 添加如下代码</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">import Echo from "laravel-echo"</span><br><span class="line"></span><br><span class="line">window.Echo = new Echo({</span><br><span class="line"> broadcaster: 'socket.io',</span><br><span class="line"> host: window.location.hostname + ':6001'</span><br><span class="line">});</span><br></pre></td></tr></table></figure>
<p>编辑 resource/js/app.js 添加如下代码</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">Echo.channel('push')</span><br><span class="line"> .listen('.push.message', (e) => {</span><br><span class="line"> alert(e.message)</span><br><span class="line"> console.log(e);</span><br><span class="line"> });</span><br></pre></td></tr></table></figure>
<p>创建 echo.blade.php head 中加上</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"><meta name="csrf-token" content="{{ csrf_token() }}"></span><br><span class="line"><script src="//{{ Request::getHost() }}:6001/socket.io/socket.io.js"></script></span><br><span class="line"><script src="/js/app.js"></script></span><br></pre></td></tr></table></figure>
<p>编译 js 文件 </p>
<blockquote>
<p>npm run watch</p>
</blockquote>
<p>浏览器访问 项目域名 /echo<br>浏览器访问 项目域名 /push/这是一个测试广播[what can i say]<br>echo 页面 会自动弹出<br><img src="/assets/blogImg/guangbo/echo2.png" alt="ico原来的样子"><br><img src="/assets/blogImg/guangbo/echo4.png" alt="ico原来的样子"><br><img src="/assets/blogImg/guangbo/echo5.png" alt="ico原来的样子"><br>到这 广播 发布到公共频道就完成了</p>
<hr>
<p>私有频道 PrivateChannel</p>
<blockquote>
<p>php artisan make:event PrivateMessageEvent</p>
</blockquote>
<p>PrivateMessageEvent 中 写入 以下内容</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">public $message;</span><br><span class="line"> public $user;</span><br><span class="line"></span><br><span class="line"> /**</span><br><span class="line"> * Create a new event instance.</span><br><span class="line"> *</span><br><span class="line"> * @param User $user</span><br><span class="line"> * @param string $message</span><br><span class="line"> */</span><br><span class="line"> public function __construct(User $user, string $message)</span><br><span class="line"> {</span><br><span class="line"> $this->user = $user;</span><br><span class="line"> $this->message = $message;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> /**</span><br><span class="line"> * Get the channels the event should broadcast on.</span><br><span class="line"> *</span><br><span class="line"> * @return \Illuminate\Broadcasting\Channel|array</span><br><span class="line"> */</span><br><span class="line"> public function broadcastOn()</span><br><span class="line"> {</span><br><span class="line"> return new PrivateChannel('privatePush.' . $this->user->id);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> //想更细粒度地控制广播数据:</span><br><span class="line"> public function broadcastWith()</span><br><span class="line"> {</span><br><span class="line"> return ['message' => $this->message,'status' => 'okok'];</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
<p>添加发布广播到私有频道 触发路由 routes/web 测试时记得新增下用户</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">Route::get('/privatePush/{message}/{id}', function ($message, $id) {</span><br><span class="line"> $user = \App\User::find($id);</span><br><span class="line"> if (empty($user)) return '无此用户';</span><br><span class="line"> broadcast(new PrivateMessageEvent($user, $message));</span><br><span class="line">});</span><br></pre></td></tr></table></figure>
<p>echo.blade.php 中加入</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"><script></span><br><span class="line"> @if(!empty(Auth::user()))</span><br><span class="line"> window.id = "{{Auth::user()->id}}"</span><br><span class="line"> @endif</span><br><span class="line"></script></span><br></pre></td></tr></table></figure>
<p>app.js</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">Echo.private('privatePush.' + window.id)</span><br><span class="line"> .listen('PrivateMessageEvent', (e) => {</span><br><span class="line"> alert('qweqwe')</span><br><span class="line"> console.log(e);</span><br><span class="line"> });</span><br></pre></td></tr></table></figure>
<hr>
<ul>
<li><strong>Notice</strong><br>安静,安静一下 Enjoy it ~</li>
</ul>
]]></content>
<tags>
<tag>laravel5.7</tag>
<tag>Redis</tag>
<tag>广播</tag>
</tags>
</entry>
<entry>
<title>Laravel yansongda/laravel-pay</title>
<url>/2018/09/29/Laravel-yansongda-laravel-pay/</url>
<content><![CDATA[<a id="more"></a>
<blockquote>
<p>运行环境:</p>
</blockquote>
<ul>
<li>php >= 7.0</li>
<li>composer</li>
<li>laravel || lumen >= 5.1</li>
</ul>
<p><strong>一、安装</strong></p>
<blockquote>
<p>composer require yansongda/laravel-pay</p>
</blockquote>
<p>添加service provider(如果laravel<5.5 或者 lumen)[5.5以上忽略]</p>
<p>laravel < 5.5</p>
<blockquote>
<p>Yansongda\LaravelPay\PayServiceProvider::class,</p>
</blockquote>
<p>lumen</p>
<blockquote>
<p>$app->register(Yansongda\LaravelPay\PayServiceProvider::class);</p>
</blockquote>
<p>添加 alias(如果laravel<5.5 或者 lumen)[5.5以上忽略]</p>
<blockquote>
<p>‘Pay’ => Yansongda\LaravelPay\Facades\Pay::class,</p>
</blockquote>
<p>配置文件</p>
<blockquote>
<p>php artisan vendor:publish –provider=”Yansongda\LaravelPay\PayServiceProvider” –tag=laravel-pay</p>
</blockquote>
<p><strong>二、使用[支付宝]</strong></p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">use Yansongda\Pay\Pay;</span><br><span class="line"></span><br><span class="line">$config = [</span><br><span class="line"> 'app_id' => '2016082000295641',</span><br><span class="line"> 'notify_url' => 'http://yansongda.cn/notify.php',</span><br><span class="line"> 'return_url' => 'http://yansongda.cn/return.php',</span><br><span class="line"> 'ali_public_key' => 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAuWJKrQ6SWvS6niI+4vEVZiYfjkCfLQfoFI2nCp9ZLDS42QtiL4Ccyx8scgc3nhVwmVRte8f57TFvGhvJD0upT4O5O/lRxmTjechXAorirVdAODpOu0mFfQV9y/T9o9hHnU+VmO5spoVb3umqpq6D/Pt8p25Yk852/w01VTIczrXC4QlrbOEe3sr1E9auoC7rgYjjCO6lZUIDjX/oBmNXZxhRDrYx4Yf5X7y8FRBFvygIE2FgxV4Yw+SL3QAa2m5MLcbusJpxOml9YVQfP8iSurx41PvvXUMo49JG3BDVernaCYXQCoUJv9fJwbnfZd7J5YByC+5KM4sblJTq7bXZWQIDAQAB',</span><br><span class="line"> 'private_key' => 'MIIEpAIBAAKCAQEAs6+F2leOgOrvj9jTeDhb5q46GewOjqLBlGSs/bVL4Z3fMr3p+Q1Tux/6uogeVi/eHd84xvQdfpZ87A1SfoWnEGH5z15yorccxSOwWUI+q8gz51IWqjgZxhWKe31BxNZ+prnQpyeMBtE25fXp5nQZ/pftgePyUUvUZRcAUisswntobDQKbwx28VCXw5XB2A+lvYEvxmMv/QexYjwKK4M54j435TuC3UctZbnuynSPpOmCu45ZhEYXd4YMsGMdZE5/077ZU1aU7wx/gk07PiHImEOCDkzqsFo0Buc/knGcdOiUDvm2hn2y1XvwjyFOThsqCsQYi4JmwZdRa8kvOf57nwIDAQABAoIBAQCw5QCqln4VTrTvcW+msB1ReX57nJgsNfDLbV2dG8mLYQemBa9833DqDK6iynTLNq69y88ylose33o2TVtEccGp8Dqluv6yUAED14G6LexS43KtrXPgugAtsXE253ZDGUNwUggnN1i0MW2RcMqHdQ9ORDWvJUCeZj/AEafgPN8AyiLrZeL07jJz/uaRfAuNqkImCVIarKUX3HBCjl9TpuoMjcMhz/MsOmQ0agtCatO1eoH1sqv5Odvxb1i59c8Hvq/mGEXyRuoiDo05SE6IyXYXr84/Nf2xvVNHNQA6kTckj8shSi+HGM4mO1Y4Pbb7XcnxNkT0Inn6oJMSiy56P+CpAoGBAO1O+5FE1ZuVGuLb48cY+0lHCD+nhSBd66B5FrxgPYCkFOQWR7pWyfNDBlmO3SSooQ8TQXA25blrkDxzOAEGX57EPiipXr/hy5e+WNoukpy09rsO1TMsvC+v0FXLvZ+TIAkqfnYBgaT56ku7yZ8aFGMwdCPL7WJYAwUIcZX8wZ3dAoGBAMHWplAqhe4bfkGOEEpfs6VvEQxCqYMYVyR65K0rI1LiDZn6Ij8fdVtwMjGKFSZZTspmsqnbbuCE/VTyDzF4NpAxdm3cBtZACv1Lpu2Om+aTzhK2PI6WTDVTKAJBYegXaahBCqVbSxieR62IWtmOMjggTtAKWZ1P5LQcRwdkaB2rAoGAWnAPT318Kp7YcDx8whOzMGnxqtCc24jvk2iSUZgb2Dqv+3zCOTF6JUsV0Guxu5bISoZ8GdfSFKf5gBAo97sGFeuUBMsHYPkcLehM1FmLZk1Q+ljcx3P1A/ds3kWXLolTXCrlpvNMBSN5NwOKAyhdPK/qkvnUrfX8sJ5XK2H4J8ECgYAGIZ0HIiE0Y+g9eJnpUFelXvsCEUW9YNK4065SD/BBGedmPHRC3OLgbo8X5A9BNEf6vP7fwpIiRfKhcjqqzOuk6fueA/yvYD04v+Da2MzzoS8+hkcqF3T3pta4I4tORRdRfCUzD80zTSZlRc/h286Y2eTETd+By1onnFFe2X01mwKBgQDaxo4PBcLL2OyVT5DoXiIdTCJ8KNZL9+kV1aiBuOWxnRgkDjPngslzNa1bK+klGgJNYDbQqohKNn1HeFX3mYNfCUpuSnD2Yag53Dd/1DLO+NxzwvTu4D6DCUnMMMBVaF42ig31Bs0jI3JQZVqeeFzSET8fkoFopJf3G6UXlrIEAQ==',</span><br><span class="line"> 'http' => [ // optional</span><br><span class="line"> 'timeout' => 5.0,</span><br><span class="line"> 'connect_timeout' => 5.0,</span><br><span class="line"> // 更多配置项请参考 [Guzzle](https://guzzle-cn.readthedocs.io/zh_CN/latest/request-options.html)</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">$order = [</span><br><span class="line"> 'out_trade_no' => time(),</span><br><span class="line"> 'total_amount' => '1',</span><br><span class="line"> 'subject' => 'test',</span><br><span class="line">];</span><br><span class="line">$alipay = Pay::alipay($config)->web($order);</span><br><span class="line"></span><br><span class="line">return $alipay->send();// laravel 框架中请直接 `return $alipay`</span><br><span class="line"></span><br><span class="line">// 退款</span><br><span class="line">$order = [</span><br><span class="line"> 'out_trade_no' => '1514027114',</span><br><span class="line"> 'refund_amount' => '0.01',</span><br><span class="line">];</span><br><span class="line"></span><br><span class="line">$result = Pay::alipay($config)->refund($order); // 返回 `Yansongda\Supports\Collection` 实例,可以通过 `$result->xxx` 访问服务器返回的数据。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">// 查询</span><br><span class="line">$result = Pay::alipay($config)->find('out_trade_no_123456'); // 返回 `Yansongda\Supports\Collection` 实例,可以通过 `$result->xxx` 访问服务器返回的数据。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">// 取消</span><br><span class="line">$result = Pay::alipay($config)->cancel('out_trade_no_123456'); // 返回 `Yansongda\Supports\Collection` 实例,可以通过 `$result->xxx` 访问服务器返回的数据。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">// 关闭</span><br><span class="line">$result = Pay::alipay($config)->close('out_trade_no_123456'); // 返回 `Yansongda\Supports\Collection` 实例,可以通过 `$result->xxx` 访问服务器返回的数据。</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">// 验证服务器数据</span><br><span class="line">$alipay = Pay::alipay($config)</span><br><span class="line"></span><br><span class="line">// 是的,验签就这么简单!</span><br><span class="line">$data = $alipay->verify(); // 返回 `Yansongda\Supports\Collection` 实例,可以通过 `$data->xxx` 访问服务器返回的数据。</span><br><span class="line"></span><br><span class="line">$alipay->success()->send(); // 向支付宝服务器确认接收到的数据。laravel 框架中请直接 `return $alipay->success()`</span><br></pre></td></tr></table></figure>
<hr>
<ul>
<li><strong>Notice</strong></li>
</ul>
<blockquote>
<p>若前端框架使用vue、react等 此时后端返回的是form表单需要简单处理下,如下:</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line">const div = document.createElement('div') // 创建div</span><br><span class="line">div.innerHTML = res.data // 将返回的form 放入div</span><br><span class="line">document.body.appendChild(div)</span><br><span class="line">document.forms['alipaysubmit'].submit()</span><br></pre></td></tr></table></figure>]]></content>
<tags>
<tag>laravel5.6</tag>
<tag>laravel-pay</tag>
</tags>
</entry>
<entry>
<title>Laravel 事件系统</title>
<url>/2019/04/22/Laravel-%E4%BA%8B%E4%BB%B6%E7%B3%BB%E7%BB%9F/</url>
<content><![CDATA[<a id="more"></a>
<p> 生成一个事件类</p>
<blockquote>
<p>php artisan make:event UserLogin</p>
</blockquote>
<p>app/Events 中就会自动生成一个 UserLogin.php 文件,如下:</p>
<figure class="highlight plain"><table><tr><td class="code"><pre><span class="line"><?php</span><br><span class="line"></span><br><span class="line">namespace App\Events;</span><br><span class="line"></span><br><span class="line">use Illuminate\Broadcasting\Channel;</span><br><span class="line">use Illuminate\Queue\SerializesModels;</span><br><span class="line">use Illuminate\Broadcasting\PrivateChannel;</span><br><span class="line">use Illuminate\Broadcasting\PresenceChannel;</span><br><span class="line">use Illuminate\Broadcasting\InteractsWithSockets;</span><br><span class="line">use Illuminate\Contracts\Broadcasting\ShouldBroadcast;</span><br><span class="line"></span><br><span class="line">class UserLogin</span><br><span class="line">{</span><br><span class="line"> use InteractsWithSockets, SerializesModels;</span><br><span class="line"></span><br><span class="line"> /**</span><br><span class="line"> * Create a new event instance.</span><br><span class="line"> *</span><br><span class="line"> * @return void</span><br><span class="line"> */</span><br><span class="line"> public function __construct()</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><br><span class="line"> * Get the channels the event should broadcast on.</span><br><span class="line"> *</span><br><span class="line"> * @return Channel|array</span><br><span class="line"> */</span><br><span class="line"> public function broadcastOn()</span><br><span class="line"> {</span><br><span class="line"> return new PrivateChannel('channel-name');</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>