wordpress中wpdb操作数据库方法

<?php
    global $wpdb;
    
    //1、学会使用insert()方法向数据库中添加数据
    $wpdb->insert( $wpdb->prefix . 'demo', array( 'name' => 'admin',  'password' => 'wordpress' ) );
    
    //2、学会使用update()方法更新数据库中的数据
    $wpdb->update( $wpdb->prefix . 'demo', array( 'name' => 'admin',  'password' => 'wordpress' ), array( 'password' => '22222' ) );

   //public function update( $table, $data, $where, $format = null, $where_format = null ) 
    
    //3、学会使用get_var()获取数据库中的数据
    $xm = $wpdb->get_var( 'SELECT * FROM `' . $wpdb->prefix . 'demo`'  );
    
    //4、学会使用query()方法删除数据库中的数据
    $wpdb->query( "DELETE FROM `" . $wpdb->prefix . "demo` WHERE `demo1` = 'wordpress'" );
    
    $row_count = $wpdb->get_var( 'SELECT ROW_COUNT()' );
    echo $row_count;
    
    $wpdb->show_errors();
    //5、学会使用get_results()获取数据库中的数据
    $rows = $wpdb->get_results( "SELECT * FROM `" . $wpdb->prefix . "demo`" , ARRAY_A );

     public function get_results( $query = null, $output = OBJECT ) 
/*
    foreach ( $rows as $row ) {
        echo $row['xm'] . '<br />';
    }
    */
    $wpdb->hide_errors();
    //6、学会使用get_row()获取数据库中的数据
    $row = $wpdb->get_row( "SELECTa * FROM `" . $wpdb->prefix . "demo`" , ARRAY_A , 1 );
    
    //echo $wpdb->last_error;
    //7、学会使用show_errors()、print_error()、hide_errors()、last_error调试SQL
    $wpdb->print_error();
    
?>

阿里云轻量应用服务,香港地区30M带宽24元/月

轻量应用服务器是阿里云新推出了一个套餐,与ECS服务器对比,没有那么多复杂的选项,无内网IP,非常适合新手使用。而且可以一键搭建wordpress、ecshop等应用

价格也便宜不少,香港地区的轻量应用服务器只需要24元/月,相比国内的更便宜,而且可以和香港人民一起聊天,享受国际服务,30M带宽,1T流量,几个人合用一个都足够了。免bei~an

购买地址:弹性计算-轻量应用服务器-选择香港地区

RabbitMQ集群搭建

1.首先在各个目标机器上安装RabbitMQ,这个地址上有各平台的安装步骤http://www.rabbitmq.com/download.html

因为我的服务器是Centos,所以选择http://www.rabbitmq.com/install-rpm.html

1.1 Install Erlang 安装Erlang   

       各版本RabbitMQ所要求的erlang版本一览 http://www.rabbitmq.com/which-erlang.html

    运行 yum install erlang

       但是发现erlang 安装的是   R16B-03.18.el7 ,无法满足RabbitMQ 3.7.6 最低erlang19.3的版本要求。

       因此需要更换一下安装方式,推荐使用此方式进行安装,这也是RabbitMQ官方推荐的 https://www.erlang-solutions.com/resources/download.html

wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
sudo yum install erlang

 

1.2安装RabbitMQ 

    下载rabbitmq 

wget https://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.7/rabbitmq-server-3.7.7-1.el7.noarch.rpm

以下使用‘root’运行

rpm --import https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc
# this example assumes the CentOS 7 version of the package
yum install rabbitmq-server-3.7.7-1.el7.noarch.rpm

一些常用的命令

$ sudo chkconfig rabbitmq-server on # 添加开机启动RabbitMQ服务

$ sudo /sbin/service rabbitmq-server start # 启动服务

$ sudo /sbin/service rabbitmq-server status # 查看服务状态

$ sudo /sbin/service rabbitmq-server stop # 停止服务

# 查看当前所有用户 $ sudo rabbitmqctl list_users

# 查看默认guest用户的权限 $ sudo rabbitmqctl list_user_permissions guest

# 由于RabbitMQ默认的账号用户名和密码都是guest。为了安全起见, 先删掉默认用户 $ sudo rabbitmqctl delete_user guest

# 添加新用户 $ sudo rabbitmqctl add_user username password

# 设置用户tag $ sudo rabbitmqctl set_user_tags username administrator

# 赋予用户默认vhost的全部操作权限 $ sudo rabbitmqctl set_permissions -p / username ".*" ".*" ".*"

# 查看用户的权限 $ sudo rabbitmqctl list_user_permissions username

 

开启管理后台

sudo rabbitmq-plugins enable rabbitmq_management

开启成功后可以在浏览器中访问http://xx.xx.xx.xx:15672 使用刚才插入的用户名密码进行管理。

 

其它插件的处理 http://www.rabbitmq.com/plugins.html

#查看插件列表  

rabbitmq-plugins list

#enble插件 

rabbitmq-plugins enable plugin-name 

#disable插件

rabbitmq-plugins disable plugin-name  

根据自己所需开启插件

 

2.在各机器上安装好RabbitMQ后,构建集群

首先在每台/etc/hosts 中增加所有的机器  ip 机器名称,并保证能够相互PING通

如 10.0.0.2 A   (注:A为登录服务器显示的root@A)

    10.0.0.3 B

    ...

查看并修改各服务器中/var/lib/rabbitmq/.erlang.cookie的值,把所有的都修改成相同的值。

在B中运行 rabbitmqctl stop_app 停止运行

运行 rabbitmqctl join_cluster --ram rabbit@A 作为内存节点 或者吧ram 换为 disc 节点

加入成功后 rabbitmqctl start_app 

即可在管理后台看见B节点

 

转:一套代码 iOS、Android 两端运行,Google Flutter 对开发者意味着什么?

一套代码可支持 Android 和 iOS 双端运行,你 Get 了吗?

它就是 Flutter。其目标是为了解决移动中的两个重要问题:一是实现原生应用的性能和与平台的集成,二是提供一个多平台,可移植的 UI 工具包来支持高效的应用开发。

 

何为 Flutter?

 

“Flutter 可帮助你更容易、更快速的开发出界面美观的移动应用。”Google 官方如是说。

实则,Flutter 是由 Google 的工程师团队打造的一款移动 UI 框架,它使用的是 Google 自己开发的网络编程语言——Dart 语言,因此,开发者只要使用过 Java 或 JavaScript 之类的语言,那么 Flutter 也极易上手。

Flutter 旨在帮助开发者创建拥有美观 UI 界面、高性能、高稳定、高帧率、低延迟的跨平台(Android 和 iOS)移动应用。Flutter 的界面设计与 Web 应用类似,所以开发者很容易在 Flutter 上找到类似 HTML/CSS 编码的感觉。

和 React Native 相比,虽然使用的语言不同,但 Flutter 也提供响应式的视图。此外,Flutter 开发出来的应用在不同的平台用起来跟原生应用具有一样的体验。例如,返回图标 Android 和 iOS 是不一样的;滚动内容滚动到底的反馈也是不一样的。

 

Flutter 发展历程

 

2017 年 Google I/O 大会上,Google 首次推出了一款新的用于创建移动应用的开源库——Flutter;

2018 年初,Google 发布了 Flutter 的第一个 beta 版本;

在今年 5 月的 Google I/O 大会上,Flutter 更新到了 beta 3 版本;

今天,Flutter 发布了首个预览版,这意味着 Flutter 进入了正式版(1.0)发布前的最后阶段。

观其发展,就在上个月,Flutter 进入了 GitHub stars 排行榜前 100 名,如今已有 27k 个 star。经历了短短一年的时间,Flutter 生态系统得以快速增长,活跃的 Flutter 用户也增长了 50%。由此可见,Flutter 在开发者中受到了热烈的欢迎,其未来的发展不容小觑。

 

Flutter 的优势

 

为何自 Flutter 发布以来,受到了诸多开发者较高的评价?自然与其优点息息相关:

高生产率:

  • 一套代码可以开发出 Android 和 iOS 应用;

  • 使用更少的代码实现更多的功能,即使在单一的操作系统之上,使用更现代的、更具有表达性的开发语言及声明方法,也可以完成更多的功能;

  • 开发原型和迭代更加方便;

  • 在应用运行的时候就可以修改代码并重新加载(使用热重载)修改后的功能;

  • 直接修改崩溃的 bug,然后继续从崩溃的地方执行调试;

创建优雅的、可定制的用户界面:

  • Flutter 内置了对纸墨设计(Material Design)的支持,提供了丰富的 UI 控件库可以用来创建纸墨设计风格的 UI;

  • 提供了可定制的 UI 框架,不再受制于手机平台控件的支持。

 

使用 Flutter 可以干什么?

 

快速开发:

Flutter 的热重载可帮助用户快速地进行测试、构建 UI、添加功能并更快地修复错误。在 iOS 和 Android 模拟器或真机上可以在亚秒内重载,并且不会丢失状态。

富有表现力,漂亮的用户界面:

使用 Flutter 内置美丽的 Material Design 和 Cupertino(iOS风格)widget、丰富的 motion API、平滑而自然的滑动效果和平台感知,为开发者带来全新体验。

现代的,响应式框架

使用 Flutter 的现代、响应式框架,和一系列基础 widget,轻松构建您的用户界面。使用功能强大且灵活的 API(针对 2D、动画、手势、效果等)解决艰难的 UI 挑战。

class CounterState extends State<Counter> {
  int counter = 0;

  void increment() {
    // 告诉Flutter state已经改变, Flutter会调用build(),更新显示
    setState(() {
      counter++;
    });
  }

  Widget build(BuildContext context) {
    // 当 setState 被调用时,这个方法都会重新执行.
    // Flutter 对此方法做了优化,使重新执行变的很快
    // 所以你可以重新构建任何需要更新的东西,而无需分别去修改各个widget
    return new Row(
      children: <Widget>[
        new RaisedButton(
          onPressed: increment,
          child: new Text('Increment'),
        ),
        new Text('Count: $counter'),
      ],
    );
  }
}

访问本地功能和SDK

通过平台相关的 API、第三方 SDK 和原生代码让开发者的应用变得强大易用。 Flutter 允许开发者复用现有的 Java、Swift 或 ObjC 代码,访问 iOS 和 Android 上的原生系统功能和系统 SDK。

访问平台功能非常简单。以下是 interop example(互操作示例)中的一个片段:

Future<Null> getBatteryLevel() async {
  var batteryLevel = 'unknown';
  try {
    int result = await methodChannel.invokeMethod('getBatteryLevel');
    batteryLevel = 'Battery level: $result%';
  } on PlatformException {
    batteryLevel = 'Failed to get battery level.';
  }
  setState(() {
    _batteryLevel = batteryLevel;
  });
}

统一的应用开发体验

Flutter 拥有丰富的工具和库,可以轻松地同时在 iOS 和 Android 系统中实现开发者想要完成的功能。即使开发者没有任何的移动端开发体验, Flutter 也是一种轻松快捷的方式来构建漂亮的移动应用程序。 如果开发者已是一位经验丰富的 iOS 或 Android 开发人员,则可以使用 Flutter 作为视图(View)层, 并可以使用已经用 Java / ObjC / Swift 完成的部分(Flutter 支持混合开发)。

 

Flutter 首个预览版的发布

 

目前 Flutter 已发布了第一个预览版。此次,Flutter 开发团队主要专注于让 Flutter 适用于更多的应用场景,并修复 Bug 并让 Flutter 更加稳定。其中相比 beta 3 主要更新包括:

  • 增加了对带有 ARMv7 指令集芯片的 32 位 iOS 设备的支持,使得 Flutter 兼容包括 iPad Mini 和 iPhone 5c 在内的更多设备;

  • 完善了 video player package 以支持更多的视频格式并变得更稳定;

  • 支持了 Firebase 动态链接(Dynamic Links)以支持跨平台创建和处理链接;

  • 并进一步改进如何将 Flutter 小部件添加到现有 Android 和 iOS 应用的文档。

除此之外,Visual Studio Code 的 Flutter 扩展新版本带来了新的大纲视图,语句完成以及直接从 Visual Studio Code 启动模拟器等功能。

Flutter 预览版也从社区中得到了很多支持,来自外部的贡献就包括 Flutter 对硬件键盘和条形码扫描仪、视频录制、图像的支持。此外,还有许多新软件包对 Flutter 包站点的贡献,例如 Flutter Platform Widgets,一组可自适应 iOS 或 Android 的小部件; mlkit,Firebase MLKit API 的包装类(wrapper); 序列动画(Sequence Animation)。

那么该如何更新呢?

如果你已经在 beta channel 上了,只需要运行一句命令:

$ flutter upgrade

 

 

如何更快上手学习 Flutter?

 

就国内而言,使用 Flutter 的用户仅次于美国和印度,拥有世界第三多的 Flutter 用户。国内科技巨头中,阿里巴巴基于 Flutter 开发的应用程序已经有了上千万安装量,腾讯也将使用 Flutter 推出 NOW 直播手机客户端。那么国内的开发者该如何快速上手 Flutter?

对此,Flutter 团队正式发布了中文  Flutter 网站:https://flutter-io.cn/。其中包含了源自社区的许多中文 Flutter 资料,从而帮助国内开发者更好地使用 Flutter。

此外,还可以通过以下资源进行深入了解:

  • I/0 分享视频:https://www.youtube.com/playlist?list=PL0o58xSX-Jvi6zBDe7SW4W6h5hauQ-xxF

  • 技术周刊:https://flutterweekly.net/

  • 实践视频:https://www.youtube.com/watch?v=syd0c9Vi2hg

  • 开发视频:https://www.youtube.com/watch?v=yr8F2S3Amas

  • Github 地址:https://github.com/flutter/flutter

  • Flutter 网站:https://flutter.io/

  • Flutter - 不一样的跨平台解决方案:https://juejin.im/post/5afd77466fb9a07aab2a12da

  • Flutter 初尝:从 Java 无缝过渡:http://wuxiaolong.me/2018/03/08/Flutter/

  • 最近用 Flutter 做了几个 APP:https://zhuanlan.zhihu.com/p/37232700

RabbitMQ莫名关闭,且启动失败处理过程

    今日登陆RabbitMQ管理后台,发现一台节点不在运行,顿时很懵,心想一直运行的好好的为啥就出问题了呢?很尴尬。。。

    登陆节点服务器后发现磁盘容量已满,这就更尴尬了。。。没有收到任何告警短信。。。无语中。。。

   1.先把log日志给清一清,腾出空间,因为RabbitMQ节点是 Disk 节点。

   2.启动RabbitMQ  service rabbitmq-server start,显示成功了,但是加入到集群中就显示nodedown,证明rabbitmq server 没有启动成功,去查看一下日志,发现了问题所在

error 日志中显示

Crash dump was written to: erl_crash.dump

init terminating in do_boot ()

log日志中有详细的错误

Error description:
   {could_not_start,rabbit,
       {{badmatch,
            {error,
                {{{badmatch,
                      {error,
                          {not_a_dets_file,
                              "/var/lib/rabbitmq/mnesia/rabbit@p1fu4aql/recovery.dets"}}},
                  [{rabbit_recovery_terms,open_table,0,[]},
                   {rabbit_recovery_terms,init,1,[]},
                   {gen_server,init_it,6,[{file,"gen_server.erl"},{line,306}]},
                   {proc_lib,init_p_do_apply,3,
                       [{file,"proc_lib.erl"},{line,237}]}]},
                 {child,undefined,rabbit_recovery_terms,
                     {rabbit_recovery_terms,start_link,[]},
                     transient,4294967295,worker,
                     [rabbit_recovery_terms]}}}},
        [{rabbit_queue_index,start,1,[]},
         {rabbit_variable_queue,start,1,[]},
         {rabbit_priority_queue,start,1,[]},
         {rabbit_amqqueue,recover,0,[]},
         {rabbit,recover,0,[]},
         {rabbit,'-run_step/2-lc$^1/1-1-',1,[]},
         {rabbit,run_step,2,[]},
         {rabbit,'-run_boot_steps/1-lc$^0/1-0-',1,[]}]}}

Log files (may contain more information):
   /var/log/rabbitmq/rabbit@p1fu4aql.log
   /var/log/rabbitmq/rabbit@p1fu4aql-sasl.log
 

 

从日志中看出 这个/var/lib/rabbitmq/mnesia/rabbit@p1fu4aql/recovery.dets 文件出错

我们找到这个文件并删除它

启动RabbitMQ    service rabbitmq-server start  成功

加入集群   rabbitmqctl start_app  成功

至此问题处理完成。

阿里云日志服务实时采集JAVA的catalina.out文件

在生产环境中要保证程序正确稳定运行,通过日志进行监控告警是很必要的一项措施,采集日志可以自建ELK系统,但是因为自建ELK比较占用系统资源,同时还需要自己进行维护,不太方便,所以就采用阿里云的日志服务+OSS存储进行日志监控及告警。

1.在日志服务里创建Project,所属地域选择自己服务器所在地域

2.进入创建好的日志服务,创建Logstore

3.创建完日志服务后会弹出以下对话框

4此时我们需要进行数据接入向导(即从哪边获取日志信息),可以看到支持很多种,因为我们这边需要监控的是catalina.out的文件,我们选择文本文件,点击下一步

5.然后在数据源设置中输入catalina.out的文件地址,然后点击下一步

6 对机器组进行设置(即要收集日志的服务器(输入的内网地址)),在该页面中可新建也可选择已创建好的机器组处理好后,点击下一步

7.进入查询分析,这边我们可以先不处理,直接点下一步

8.进入投递界面(即对收集到的日志进行存储&进一步的分析),我先进行日志归档至OSS

9.OSS投递配置,填入在阿里云创建的OSS Bucket,以及RAM角色(RAM角色的创建你们可以看 https://help.aliyun.com/document_detail/29002.html?spm=5176.2020520165.120.d29002.6a867029IfPeEn 中的步骤一访问控制授权进行快捷授权,即可新建角色,打开访问控制,将访问控制里角色AliyunLogDefaultRole里的Arm填入到Ram输入框中)

10配置好后就可以在查询分析里面看到对应的日志了

以上就是实时收集catalina.out日志的步骤,你可以根据关键字进行搜索和告警配置。

处理Docker运行中产生的Log日志

随着系统运行的时间越长,Log日志所占的空间也越来越大,但是磁盘空间是一定的,这时就需要清理一下这些无用的日志文件,主要有以下两个方式进行清理

1.手动清理

进入 /var/lib/docker/container 中找到较大的 .log 文件,在管理员权限下(sudo su root)使用命令 cat /dev/null > xxx.log 清空文件。 注意直接删除文件可能导致后续log无法写入

这个方法比较累人,所以推荐下面的方法

2.对日志设置自动回滚写入以及清除

通过logrotate服务实现日志定期清理和回卷

logrotate是个十分有用的工具,它可以自动对日志进行截断(或轮循)、压缩以及删除旧的日志文件。例如,你可以设置logrotate,让/var/log/foo日志文件每30天轮循,并删除超过6个月的日志。配置完后,logrotate的运作完全自动化,不必进行任何进一步的人为干预。

但如果按照之前的部署方式,需要手动在每个节点上都安装和配置对应logrotate工具。如果通过Kubernetes容器服务编排的能力,将logrotate通过Kubernetes中服务的方式部署到各个节点上,这样既可以实现只需要一次部署,部署到所有节点。并且通过容器的方式保证了logrotate配置的一致性。

方案的具体实现是在Kubernetes集群中,创建DaemonSet资源实现。DaemonSet资源会在每个Node节点上都部署一个logrotate的容器实例,并且在容器实例中设置映射主机的log日志目录,从而实现日志的定时清理和回卷。

将以下内容写入logrotate_ds.yaml文件中

apiVersion: extensions/v1beta1

kind: DaemonSet

metadata:

name: logrotate

spec:

template:

metadata:

labels:

app: logging

id: logrotate

name: logrotate

spec:

containers:

- name: logrotate-es

image: blacklabelops/logrotate

securityContext:

privileged: true

volumeMounts:

- name: containers

mountPath: /var/lib/docker/containers

- name: varlog

mountPath: /var/log/docker

- name: logs

mountPath: /logs

env:

- name: LOGS_DIRECTORIES

value: "/var/lib/docker/containers /var/log/docker"

- name: LOGROTATE_INTERVAL

value: "hourly"

- name: LOGROTATE_OLDDIR

value: "/logs"

volumes:

- hostPath:

path: /var/lib/docker/containers

name: containers

- hostPath:

path: /var/log/docker

name: varlog

- hostPath:

path: /var/log/containers/

name: logs

 

创建完这个文件后,可以直接在Kubernetes中进行部署。

运行这个命令
kubectl create -f logrotate_ds.yaml

后显示

daemonset "logrotate" created

则成功

在示例的yaml文件中,logrotate服务将按照定时(1小时)的对日志进行回卷,回卷超过5个副本后则会对日志进行清理。如果有需要,可以修改相应的参数,设置不同的回卷规则和清理规则。详细的参数说明可以参考:https://github.com/blacklabelops/logrotate 

 

3最后一种,不建议对stdout大量写入日志

 

 

 

CentOS6.x 安装 Docker

Docker 官方要求要 CentOS7.0 及以上系统版本,但是有时候不能为了安装Docker就把稳定运行的服务器升级系统版本,还是需要在已有的 CentOS6.x 的系统上进行安装。

比如之前Memcached爆出的UDP11211的bug时,直接在原系统中升级Memcached版,很麻烦,需要各种编译,安装Docker是很快速方便的解决方案,但是看到CentOS6.x,瞎了。。同时安装Docker以后升级Memcached版本也是方便加愉快的事情,^_^

SO,研究了下怎么在CentOS6.x下安装Docker

参考https://www.liquidweb.com/kb/how-to-install-docker-on-centos-6/

1.安装EPEL仓库

rpm -iUvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

2.更新

yum update -y

3.安装

yum -y install docker-io

4.安装完后启动

service docker start

5.设置开机启动

chkconfig docker on

6.使用docker

docker pull xxxx

 

以上你就可以在CentOS6.x中使用Docker了