0%

QQ邮箱祝你生日快乐。

什么是RPC

如果用一句话概括RPC就是:远程调用框架(Remote Procedure Call)
那什么是远程调用?
通常我们调用一个php中的方法,比如这样一个函数方法: localAdd(10, 20),localAdd方法的具体实现要么是用户自己定义的,要么是php库函数中自带的,也就说在localAdd方法的代码实现在本地,它是一个本地调用!
远程调用意思就是:被调用方法的具体实现不在程序运行本地,而是在别的某个远程地方。

远程调用原理

比如 A (client) 调用 B (server) 提供的remoteAdd方法:
首先A与B之间建立一个TCP连接;
然后A把需要调用的方法名(这里是remoteAdd)以及方法参数(10, 20)序列化成字节流发送出去;
B接受A发送过来的字节流,然后反序列化得到目标方法名,方法参数,接着执行相应的方法调用(可能是localAdd)并把结果30返回;
A接受远程调用结果,输出30。
RPC框架就是把我刚才说的这几点些细节给封装起来,给用户暴露简单友好的API使用。

远程调用的好处

解耦:当server需要对方法内实现修改时,client完全感知不到,不用做任何变更;这种方式在跨部门,跨公司合作的时候经常用到,并且方法的提供者我们通常称为:服务的暴露。

RPC与Socket区别

RPC(远程过程调用)采用客户机/服务器模式实现两个进程之间相互通信。socket是RPC经常采用的通信手段之一,RPC是在Socket的基础上实现的,它比socket需要更多的网络和系统资源。除了Socket,RPC还有其他的通信方法,比如:http、操作系统自带的管道等技术来实现对于远程程序的调用。微软的Windows系统中,RPC就是采用命名管道进行通信。

RPC与REST区别

通过了解RPC后,我们知道是RPC是client/server模式的,调用远程的方法,REST也是我们熟悉的一套API调用协议方法,它也是基于client/server模式的,调用远程的方法的,那他俩又有啥区别呢?
REST API 和 RPC 都是在 Server端 把一个个函数封装成接口暴露出去,以供 Client端 调用,不过 REST API 是基于 HTTP协议的,REST致力于通过http协议中的POST/GET/PUT/DELETE等方法和一个可读性强的URL来提供一个http请求。而 RPC 则可以不基于 HTTP协议
因此,如果是后端两种语言互相调用,用 RPC 可以获得更好的性能(省去了 HTTP 报头等一系列东西),应该也更容易配置。如果是前端通过 AJAX 调用后端,那么用 REST API 的形式比较好。

https://www.zybuluo.com/phper/note/76641

我上学那会暗恋你 哈哈哈 我也是

下载win版php

http://windows.php.net/download/
注意不要下载源码包,下载指zip压缩包
下载对应的windows位数, 32或是64

配置

解压后目录重命名,保留版本号及nts
复制到phpStudy安装目录的php文件夹即可

注意

目录一定要保留版本号及nts 信息。没有nts的php只有apache支持。有nts的版本apache、nginx都支持

http://www.phpstudy.net/a.php/209.html

我有钱了,我头发也白了,爹娘也没了。

环境准备

  • windows 10
  • phpstorm 2017.2
  • composer

开始配置

全局安装

1
composer global require fabpot/php-cs-fixer

配置

在phpstorm的File > Settings > Tools > External Tools菜单内进行php-cs-fixer的配置

1
2
3
4
1. name和description可自行填写
2. program需要填写php-cs-fixer的可执行文件地址,Windows上是用户目录\Roaming\Composer\composer\vendor\bin\php-cs-fixer.bat,linux和mac上是~/.composer/vendor/bin/php-cs-fixer
3.parameters填--rules=@Symfony --verbose fix "$FileDir$/$FileName$",其中 rules 字段具体可以查看 php-cs-fixer 的官方文档,但是由于 Windows 的 cmd 有诸多限制,所以只能传入一些简单的规则,如果需要配置复杂规则建议使用配置文件来完成。
4.working directory填$ProjectFileDir$

插件配置好后,到 File > Settings > Keymap 设置快捷键,快捷键设置好后就可以找个文件试一试了。我设置了快捷键crrl+shift+;

使用配置文件

由于 Windows 的 cmd 有诸多限制,所以只能传入一些简单的规则,如果需要配置复杂规则建议使用配置文件来完成

将我们的配置文件.php_cs.dist放在某一目录下, 我选择放在D:\phpStudy\php\.php_cs.dist

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
return PhpCsFixer\Config::create()
->setRiskyAllowed(true)
->setRules([
'align_multiline_comment' => true,
'no_trailing_whitespace' => true,
'no_short_echo_tag' => true,
'no_unused_imports' => true,
'array_syntax' => ['syntax' => 'short'],
'ordered_imports' => ['sortAlgorithm' => 'length']
])
->setFinder(
PhpCsFixer\Finder::create()
->exclude('tests/')
->in(__DIR__)
)
;

重新配置External Tools
parameters填

1
......

注意

在我们配置External Tools时可以选择是否open console

https://github.com/FriendsOfPHP/PHP-CS-Fixer

不要说我们没有警告过你

今天有开发同学说无法在服务器使用curl命令访问https域名,提示curl: (35) SSL connect error,原因是nss版本有点旧了

1
yum -y update nss

更新一下,重新curl即可!

我已经和垃圾学校的某些垃圾学生呆够了,再他妈不努力,你这辈子就只能和他们打交道了。

安装包

项目地址

1
https://packagist.org/packages/codeitnowin/barcode

使用composer安装

1
composer require codeitnowin/barcode

无需配置

使用

生成二维码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
use CodeItNow\BarcodeBundle\Utils\QrCode;

$qrCode = new QrCode();
$qrCode
->setText('QR code by codeitnow.in')
->setSize(300)
->setPadding(10)
->setErrorCorrection('high')
->setForegroundColor(array('r' => 0, 'g' => 0, 'b' => 0, 'a' => 0))
->setBackgroundColor(array('r' => 255, 'g' => 255, 'b' => 255, 'a' => 0))
->setLabel('Scan Qr Code')
->setLabelFontSize(16)
->setImageType(QrCode::IMAGE_TYPE_PNG)
;
echo '<img src="data:'.$qrCode->getContentType().';base64,'.$qrCode->generate().'" />';

生成条形码

1
2
3
4
5
6
7
8
9
10
11
use CodeItNow\BarcodeBundle\Utils\BarcodeGenerator;

$barcode = new BarcodeGenerator();
$barcode->setText("0123456789");
$barcode->setType(BarcodeGenerator::Code128);
$barcode->setScale(2);
$barcode->setThickness(25);
$barcode->setFontSize(10);
$code = $barcode->generate();

echo '<img src="data:image/png;base64,'.$code.'" />';

更多参见说明文档

https://packagist.org/packages/codeitnowin/barcode
http://www.barcodebakery.com/

失去就好像,你将余生写一首长诗,却不能提及一个与她有关的字……

简介

基于laravel5.3 vue2.0开发的仿知乎项目,实现基本的登录注册,发布问题,关注问题,回答问题,评论问题,发送私信,系统发送邮件通知,使用千牛存储图片,使用阿里云提供的短信服务发送验证码等基本功能.

功能点

发布问题

回答问题

发送私信

评论问题

私信列表

更换头像

一些代码

路由

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
Route::get('/','QuestionsController@index');

Auth::routes();

Route::get('/home', 'HomeController@index');

Route::get('email/verify/{token}',['as' => 'email.verify', 'uses' => 'EmailController@verify']);

Route::resource('questions','QuestionsController',['names' => [
'create' => 'question.create',
'show' => 'question.show',
]]);

Route::post('questions/{question}/answer','AnswersController@store');

Route::get('question/{question}/follow','QuestionFollowController@follow');

Route::get('notifications','NotificationsController@index');
Route::get('notifications/{notification}','NotificationsController@show');


Route::get('avatar','UsersController@avatar');
Route::post('avatar','UsersController@changeAvatar');

Route::get('password','PasswordController@password');
Route::post('password/update','PasswordController@update');

Route::get('setting','SettingController@index');
Route::post('setting','SettingController@store');

Route::get('inbox','InboxController@index');
Route::get('inbox/{dialogId}','InboxController@show');
Route::post('inbox/{dialogId}/store','InboxController@store');

邮件发送

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
<?php
namespace App\Mailer;

use Auth;

/**
* Class UserMailer
* @package App\Mailer
*/
class UserMailer extends Mailer
{
/**
* @param $email
*/
public function followNotifyEmail($email)
{
$data = ['url' => 'http://zhihu.dev', 'name' => Auth::guard('api')->user()->name];

$this->sendTo('zhihu_app_new_user_follow', $email, $data);
}

/**
* @param $email
* @param $token
*/
public function passwordReset($email, $token)
{
$data = ['url' => url('password/reset', $token)];

$this->sendTo('zhihu_app_password_reset', $email, $data);
}

/**
* @param User $user
*/
public function welcome(User $user)
{
$data = [
'url' => route('email.verify', ['token' => $user->confirmation_token]),
'name' => $user->name
];

$this->sendTo('zhihu_app_register', $user->email, $data);
}
}

关注用户组件

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
<template>
<button
class="btn btn-default"
v-bind:class="{'btn-success': followed}"
v-text="text"
v-on:click="follow"
></button>
</template>

<script>
export default {
props:['user'],
mounted() {
this.$http.get('/api/user/followers/' + this.user).then(response => {
this.followed = response.data.followed
})
},
data() {
return {
followed: false
}
},
computed: {
text() {
return this.followed ? '已关注' : '关注他'
}
},
methods:{
follow() {
this.$http.post('/api/user/follow',{'user':this.user}).then(response => {
this.followed = response.data.followed
})
}
}
}
</script>

发送私信组件

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
<template>
<div>

<button
class="btn btn-default pull-right"
style="margin-top: -36px;"
@click="showSendMessageForm"
>发送私信</button>
<div class="modal fade" id="modal-send-message" tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button " class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title">
发送私信
</h4>
</div>
<div class="modal-body">
<textarea name="body" class="form-control" v-model="body" v-if="!status"></textarea>
<div class="alert alert-success" v-if="status">
<strong>私信发送成功</strong>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary" @click="store">
发送私信
</button>
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
</div>
</div>
</div>
</div>
</div>
</template>

<script>
export default {
props:['user'],
data() {
return {
body:'',
status: false
}
},
methods:{
store() {
this.$http.post('/api/message/store',{'user':this.user,'body':this.body}).then(response => {
this.status = response.data.status
this.body = ''
setTimeout(function () {
$('#modal-send-message').modal('hide')
}, 2000)
})
},
showSendMessageForm() {
$('#modal-send-message').modal('show')
}
}
}
</script>

说明: 本项目是结合互联网上教学视频学习练习所做,并非自己原创;

中国现在处于并将长期处于社会主义初级阶段。

简介

一个基于chrome开发的商品采集插件, 传统的外贸网站完全使用编辑手工去淘宝等国内电商平台选品,然后商品信息复制到自己商城的后台,费时费力,我们使用chrome插件, 配合商城站提供的相关的API接口,可以实现商品的一键采集到商城站的后台。

功能点

安装

配置初始化

产品抓取页面

裁图页面

所遇无故物,焉得不速老

简介

基于laravel5.3开发, 用于公司日常营销邮件的发送, 通过laravel的队列机制,linux的计划任务, 来定时监控数万个站点的邮件发送情况,并实各类现数据的统计导出;

功能点

任务列表

创建任务

任务详细

shell列表

邮件模板

邮箱列表

我徒然学会了拒绝热闹,却还未透悟真正的冷清

简介

一个基于octobercms的外贸商城系统,完全自主开发, 依赖laravel的强大功能,使用redis和 elasticsearch 做数据缓存,具有强大的功能和优秀的性能。

功能点

后台首页

产品列表页面

产品详情页面

分类列表页面

产品抓取页面

订单列表页面

后台设置

订单分析

销量分析

站点广告位

ES重建

产品勾选

产品促销管理

当完成了童年理想 童年又成了理想

简介

基于laravel5.4开发,用于所有商城的订单管理,实现了采购, 备货,发货, 仓储的完全管理, 极大的提高了员工的工作效率

功能点

首页

订单列表

订单详情

未采购商品列表

物流信息翻译

采购信息录入

批量运费补录

备货标签打印

菜单功能演示