PHP AMQP 使用指南

为什么要使用消息队列?

提速

使用了消息队列,生产者一方,把消息往队列里一扔,就可以立马返回,响应用户了。无需等待处理结果。

处理结果可以让用户稍后自己来取,如医院取化验单。也可以让生产者订阅(如:留下手机号码或让生产者实现listener接口、加入监听队列),有结果了通知。获得约定将结果放在某处,无需通知。

解耦

考虑电商系统下订单,发送数据给生产系统的情况。电商系统和生产系统之间的网络有可能掉线,生产系统可能会因维护等原因暂停服务。如果不使用消息队列,电商系统数据发布出去,顾客无法下单,影响业务开展。两个系统间不应该如此紧密耦合。应该通过消息队列解耦。同时让系统更健壮、稳定。

消除峰值

消息存在队列中,等待高峰期过后再处理

广播

多个客户端可以订阅同一个TOPIC,或者多个worker轮询并发执行任务

CentOS 安装 RabbitMQ

安装并启动rabbitmq

yum install rabbitmq-server
systemctl start rabbitmq-server
systemctl status rabbitmq-server
systemctl enable rabbitmq-server
rabbitmq-plugins enable rabbitmq_management

启动管理后台插件

rabbitmq-plugins enable rabbitmq_management

添加管理账户

rabbitmqctl add_user admin password
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

开启端口

amqp端口是 5672 , 管理后台是 15672

RabbitMQ management API

https://rawcdn.githack.com/rabbitmq/rabbitmq-management/v3.8.9/priv/www/api/index.html

可以通过API管理RabbitMQ服务器

PHP的amqp扩展

php-amqplib 纯PHP库

https://github.com/php-amqplib/php-amqplib

composer 安装

composer require php-amqplib/php-amqplib

perl c扩展

https://pecl.php.net/package/amqp

linux 编译安装

pecl install amqp

centos yum remi库安装

 yum install php74-php-pecl-amqp

windows dll 安装

https://pecl.php.net/package/amqp

下载后php_amqp.dll放到ext目录,rabbitmq.4.dll放在php目录,修改php.ini添加extension=php_amqp.dll

使用AMQP

https://www.rabbitmq.com/tutorials/tutorial-one-php.html

参考

Django扩展推荐

Saleor

A modular, high performance, headless e-commerce storefront built with Python, GraphQL, Django, and ReactJS.

pretix 活动票务系统

cookiecutter-django 快速启动可投入生产的Django项目

PostHog开源分析工具

weblate 基于WEB且带版本控制的本地化工具

netbox DigitalOcean开源的数据中心基础设施管理工具

Django-environ 使用十二因子方法环境变量配置Django

然后创建一个.env文件:

DATABASE_URL=psql://user:un-githubbedpassword@127.0.0.1:8458/database

使用:

DATABASES = {
    'default': env.db('DATABASE_URL', default='sqlite:////tmp/my-tmp-sqlite.db')
}

django-constance 动态Django设置

特征:

  • 轻松将静态设置迁移到动态设置。
  • 在Django管理界面中编辑动态设置。

file

django-moderation 审核任何模型对象

django-moderation是Django框架的可重用应用程序,它允许审核任何模型对象。

可能的用例:

  • 用户创建了自己的个人资料,该个人资料在网站上不可见。主持人批准后,它将在现场显示。
  • 用户更改了个人资料,可以在网站上看到旧的个人资料数据。主持人批准后,新数据将在现场显示。

特征:

  • 可配置的管理员集成(主持人批准后,可以在现场看到在管理员中更改的数据)
  • 管理员中的审核队列
  • html对象版本之间的变化差异
  • 可配置的电子邮件通知
  • 自定义模型形式,允许编辑对象的更改数据
  • 自动批准/拒绝选定的用户组或用户类型
  • 支持中等对象页面上的ImageField模型字段
  • 100%PEP8正确代码
  • 测试覆盖率> 80%

Linux 下mount ntfs 分区没有权限无法chown/chmod解决办法

默认 Linux 下挂载的ntfs分区,会出现chown,chmod都无效,且默认都是root用户。需要采用ntfs-3g方式挂载后,支持权限。图形界面下点击磁盘管理,修改挂载参数即可。命令行界面需要直接先mount.ntfs-3g /dev/sdb2 /data ntfs-3g 测试下,然后修改/etc/fstab,然后运行mount -a

解决办法

首先,让我们看一下完全的挂载参数:

~ >>> cat /etc/fstab

/dev/sdb2 /data ntfs-3g permissions,users,auto,exec,uid=ning,gid=ning 0 0

参数说明

  • permissions: (NTFS-3G option) Set standard permissions on created files and use standard access control.
  • auto: Will be mounted at boot and from mount -a
  • user: Allow an ordinary user to mount the filesystem
  • users: Allow every user to mount and unmount the filesystem

By default, ntfs-3g mounts the partition noexec, nosuid, and nodev.

  • noexec: Do not allow direct execution of any binaries on the mounted filesystem.
  • nosuid: Do not allow set-user-identifier or set-group-identifier bits to take effect.
  • nodev: Do not interpret character or block special devices on the file system.

参考

Mysql必知必会

今天在v2ex看到有人问怎么建表,其实建表个人总结起来非常简单。

用面向对象方法建立表

class = table
object = row
property = field

如:(我习惯用单数,你可以用复数)

book:
id
title,
isbn

category:
id
name

book_category:
id
book_id
author_id

处理表关联关系

  • A1 对多 B:B 表加 a_id,比如 order_item 表加 order_id
  • A1 对 1B:附表加主表 id,比如 profile 表加 user_id
  • A 多对多 B:C 表关联 A,B,如 post_tag 表加 post_id 和 tag_id

如何建立索引(全文索引)

  • 通常常用的where条件增加索引,如select id,title from post where forum_id=3,这时候需要给forum_id加索引,ID是主键是不要加的,title也不要加
  • 数据库模糊查询(如搜索“Mysql 数据库”)需要建立全文索引(参考我的另外一篇文章:Mysql中文全文索引(含实例5分钟上手)
  • 排序可以加组合索引,如select id,title from post where forum_id=3 order by create_time desc,这时候可以加forum_id+create_time的组合索引,Mysql高版本组合索引可以设置排序
  • 组合索引单独查后部分不起作用,如上面的forum_id+create_time的组合索引,如果你只根据create_time查那么不起作用
  • 唯一字段可以加唯一索引

Mysql性能工具

  • explain可以分析sql性能,每个字段的含义都需要清楚
  • slow query log:Mysql的配置中开启慢速查询日志,慢速查询日志需要用慢查询分析工具来分析,不是用肉眼来看的
  • show full processlist可以查看当前数据库运行的查询
  • infomation_schema有一大堆有用东西

其他

  • null还是0:建议采用null表示没有,这样不会影响数据库的约束

有用的资源

大决战–企业做了有风险,不做风险更大

大决战的目标就是回答这样一个问题:我们自己在哪一块能够做到独一无二,能够做到应该说没有替代者,在这块是最卓越的最优秀的。

而要拿到第一,我们就要组织资源实现一次大决战,要夺取一个山头,夺取一个高地,企业才能确保能够生存下去。

所以两个定位之间还不能说这个是主要,那个是次要。主要还是次要其实是关乎到企业的一套战略,取决于哪一位企业家能把这个定位做得更大。

如果现在这个市场没有一个绝对的主导者、同时千军万马又在竞争的时候,这时候谁能把这个行业和老大位置先给占了,成为品类的代表,这就是一个主定位,那这种机会其实在中国尤其有价值。

所以您提到的这个视角就可以解释为什么我们那么多老字号随风而去,他们就是没有理解这个时代是需要一场大决战,在社会上把这个位置奠定起来,而不仅仅是我有好的传承我有好的工艺做法就够了。

所以为什么需要大决战,大决战的终极目标就是我要捷足先登。

邓德隆:我觉得就是每一位企业家恐怕首先要思考一个问题,如果我们一旦出手没有把握把这个山头拿下,那我还不如不出手。

王波明:所以您说这个大决战,就意味着要集中兵力打歼灭战,不能像过去那个传统的打法,一年又一年去推。

所以概括起来就是正确的位置,然后是恰当的兵力和恰当的节奏,主要取决于这三个要素。

此外,恐怕企业自己必须明白一个道理,就是说风险它是相对的,而不决战的风险更大。如果不能通过大决战去主导一个山头的话,企业就会什么都没有,风险是最大的。

首先就是大决战它肯定本身就是蕴含着风险的,不过我们可以降低风险。这里面还是有很多讲究的,我们有很多原则,比如要在测试成功的地方推动大决战,就像咱们国家改革开放,先深圳试点成功了,我再在全国推开嘛,承包责任制在小岗村试验成功了,我再在全国推开,等等。

现在企业靠守是守不住的,所以企业家如果想清楚这个问题,他就会明白必须要展开一场大决战。

没有赢家的消耗战最危险

企业家要敢于去做老大,当然这不意味着大决战就完全结束了,而是说第一阶段结束了。

所以做企业它是一个永不停止的大决战,没有终点的,这一点和战争不同,它有个终点。

参考

公众号回复小技巧

用户点击后自动触发回复

<a href="weixin://bizmsgmenu?msgmenucontent={{自动回复内容}}&msgmenuid={{自己维护一个不重复的 ID}}">{{自动回复内容}}</a>

file

回复小程序超链接

 <a data-miniprogram-appid="wx5ba8812bdfc7741f" data-miniprogram-path="amouse_wxapp_card/pages/card/home/home" href="http://www.qq.com">5万运营都在用的 运营名片小程序</a>

file

发送小程序卡片(要求小程序与公众号已关联)

参考:(https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Service_Center_messages.html#7

{
    "touser":"OPENID",
    "msgtype":"miniprogrampage",
    "miniprogrampage":
    {
        "title":"title",
        "appid":"appid",
        "pagepath":"pagepath",
        "thumb_media_id":"thumb_media_id"
    }
}

file

如何获取和设置打印机私有驱动配置参数

大部分打印机都有自己的私有驱动,私有驱动的参数都是二进制的,无法被识别,但是还是可以通过一些办法获取和保存。

参考

如何在/etc/hosts里面包含另外一个文件

hosts文件是不允许包含其他文件的,但是可以通过其他方案实现:

脚本合并方法

保存一个hosts.base一个hosts.local,然后通过脚本合并成为hosts文件

搭建本地私有dns服务器

通过bind搭建私有服务器

运维工具同步

通过pssh, ansible 等运维工具同步配置,可以和方法一一起用

参考