安装GRPC php客户端所需扩展

  • 自行安装PHP、PECL、Composer

安装grpc扩展

sudo pecl install grpc
安装成功后添加php.ini
extension=grpc.so
phpinfo()或php -m | grep grpc查看是否安装成功

安装protobuf

protobuf版本

wget https://github.com/google/protobuf/releases/download/v3.6.0/protobuf-all-3.6.0.tar.gz
tar zxvf protobuf-all-3.6.0.tar.gz
cd protobuf-3.6.0
./configure --prefix=/usr/local/protobuf
make && make install
vi /etc/profile
export PATH=/usr/local/protobuf/bin:$PATH
source /etc/profile
protoc --version    // 没有报错,显示版本号说明安装成功

安装protobuf扩展

sudo pecl install protobuf
安装成功后添加php.ini
extension=protobuf.so
phpinfo()或php -m | grep protobuf查看是否安装成功

构建gRPC PHP protoc插件

git clone -b $(curl -L https://grpc.io/release) https://github.com/grpc/grpc
cd grpc
git submodule update --init
make grpc_php_plugin
  • 注意运行git submodule update –init如果报下面错误,
  • Peer reports incompatible or unsupported protocol version
  • 执行yum update -y nss curl libcurl即可
  • 在运行git submodule update –init期间可能会因网络问题中断,请重新运行并且耐心等待

Laravel Log Viewer

一个laravel日志管理查看的扩展包,

执行代码

composer require arcanedev/log-viewer

php artisan log-viewer:publish 

lazy-md-syntax

详情文档可以查看该项目

消息管理数据字典

notify

字段名|字段描述|类型|可否为空|备注
-----|-----|-----|-----|-----
id|主键|int64|否|-
title|标题|varchar(16)|否|
second_title|二级标题|varchar(100)|是|
content|内容|text|否|
template_id|模板ID|int(11)|是|默认0
type|类型|tinyint(1)|否|1:公告 2:提醒
target|目标的ID|int11|是|预留字段
target_type|目标的类型|varchar(30)|是|预留字段
action|动作|varchar(30)|是|预留字段
extra_field|扩展字段|json|是|预留字段
send_method|发送方式|tinyint(1)|否|1:push 2:短信 3:站内信
scheduled|是否计划发送|tinyint(1)|否|0:立即发送 1:计划发送
scheduled_send_time|计划发送的时间|timestamp|是|
created_at|创建时间|timestamp|否|记录创建时自动生成
updated_at|更新时间|timestamp|否|记录修改是自动更新

notify_user

字段名|字段描述|类型|可否为空|备注
-----|-----|-----|-----|-----
id|主键|int64|否|-
is_read|是否已读|tinyint|否|0:未读 1:已读
member_id|用户ID|int11|否|
notify_id|消息ID|int11|否|
created_at|创建时间|timestamp|否|记录创建时自动生成
updated_at|更新时间|timestamp|否|记录修改是自动更新

notify_template

字段名|字段描述|类型|可否为空|备注
-----|-----|-----|-----|-----
id|主键|int64|否|-
name|模板名称|varchar(255)|否|中文
slug|模板别名|varchar(255)|否|仅限英文,方便代码调用
title|标题|varchar(16)|否|
second_title|二级标题|varchar(100)|是|
content|内容|text|否|
status|状态|tinyint|否|0:关闭 1:开启
var_data|可用的变量|json|是|模板可用的变量列表 预留字段
remark|备注|text|是|预留字段
created_at|创建时间|timestamp|否|记录创建时自动生成
updated_at|更新时间|timestamp|否|记录修改是自动更新

notify表存储公告跟提醒消息,notify_user表关联notify表。比如后台发布了一条公告,那么notify表就会有一条公告数据,notify_user表对应所发送的用户。发送所有用户,notify_user表就存储所有用户的用户ID跟对应的消息ID,发送特定用户或者个人用户就存储所对应的消息ID和用户ID。

事例
notify

id:1
title:测试公告
second_title:二级标题
content:内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
template_id:0
type:1
send_type:1
事例
notify_user

is_read:0
member_id:1
notify_id:1

notify_template表是存储消息模板。假设notify_template有一条模板数据并且已经开启。用户申请贷款成功后发送提醒消息。

notify_template

id:1
name:贷款消息模板
slug:msg_loan
title:测试模板1
second_title:二级标题
content:尊敬的客户,您已申请{$productName}(产品名称)贷款,一共贷款 {$money}元,贷款期限为{$month}月,银行工作人员将于15个工作日内联系你审核资料,感谢您的支持。
status:1
事例
notify

id:2
title:测试模板1
second_title:二级标题
content:尊敬的客户,您已申请邮储银行-xxx贷款,一共贷款 30000元,贷款期限为12月,银行工作人员将于15个工作日内联系你审核资料,感谢您的支持。
template_id:1
type:2
send_type:3
事例
notify_user

is_read:0
member_id:1
notify_id:2

XML TO JSON

xml转换json遇到带属性的xml格式问题

待转换XML数据
<?xml version="1.0" encoding="UTF-8" ?>
<besp>
<a>123123</a>
<a>123123</a>
<a>123123</a>
<list name='a'>
	<coll>
		<a>123123</a>
		<a>123123</a>
	</coll>
	<coll>
		<a>123123</a>
		<a>123123</a>
	</coll>
</list>
<list name='b'>
	<coll>
		<a>123123</a>
		<a>123123</a>
	</coll>
	<coll>
		<a>123123</a>
		<a>123123</a>
	</coll>
</list>
</besp>
常规代码
$xml = simplexml_load_string($resXml);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

使用simplexml_load_string函数解析待属性格式的xml数据会出现@attributes

lazy-md-syntax

改进后
function XML2JSON($xml)
{
    normalizeSimpleXML(simplexml_load_string($xml), $result);
    return json_encode($result);
}

function normalizeSimpleXML($obj, &$result)
{
    $data = $obj;
    if (is_object($data)) {
        $data = get_object_vars($data);
    }
    if (is_array($data)) {
        foreach ($data as $key => $value) {
            $res = null;
            normalizeSimpleXML($value, $res);
            if (($key == '@attributes') && ($key)) {
                $result = $res;
            } else {
                $result[$key] = $res;
            }
        }
    } else {
        $result = $data;
    }
}

lazy-md-syntax

Eloquent ORM

Laravel 的 Eloquent ORM 提供了漂亮、简洁的 ActiveRecord 实现来和数据库交互。每个数据库表都有一个对应的「模型」用来与该表交互。你可以通过模型查询数据表中的数据,并将新记录添加到数据表中。

定义模型

php artisan make:model User

例子

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Flight extends Model
{
    /**
     * 与模型关联的数据表
     *
     * @var string
     */
    protected $table = 'my_flights';
}

定义关联(一对多)

/**
 * 获得此博客文章的评论。
 */
public function comments()
{
    return $this->hasMany('App\Comment');
}

定义反向关联

/**
 * 获得此评论所属的文章。
 */
public function post()
{
    return $this->belongsTo('App\Post', '外键');
}

例子

获得所有至少有一条评论内容满足 foo% 条件的文章

Post::whereHas('comments', function ($query) {
	$query->where('content', 'like', 'foo%');
})->get();