Python 3 进阶 —— 使用 PyMySQL 操作 MySQL

PyMySQL 是一个纯 Python 实现的 MySQL 客户端操作库,支持事务、存储过程、批量执行等。

PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 pure-Python MySQL 客户端库。

安装

1
pip install PyMySQL

创建数据库连接

1
2
3
4
5
6
7
8
import pymysql

connection = pymysql.connect(host='localhost',
                             port=3306,
                             user='root',
                             password='root',
                             db='demo',
                             charset='utf8')

Python 3 入门,看这篇就够了

简介

Python 是一种高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python 由 Guido van Rossum 于 1989 年底在荷兰国家数学和计算机科学研究所发明,第一个公开发行版发行于 1991 年。

特点

  • 易于学习:Python 有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单。

  • 易于阅读:Python 代码定义的更清晰。

  • 易于维护:Python 的成功在于它的源代码是相当容易维护的。

  • 一个广泛的标准库:Python 的最大的优势之一是丰富的库,跨平台的,在 UNIX,Windows 和 macOS 兼容很好。

  • 互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断。

  • 可移植:基于其开放源代码的特性,Python 已经被移植(也就是使其工作)到许多平台。

  • 可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用 C 或 C++ 完成那部分程序,然后从你的 Python 程序中调用。

  • 数据库:Python 提供所有主要的商业数据库的接口。

  • GUI 编程:Python 支持 GUI 可以创建和移植到许多系统调用。

  • 可嵌入:你可以将 Python 嵌入到 C/C++ 程序,让你的程序的用户获得”脚本化”的能力。

  • 面向对象:Python 是强面向对象的语言,程序中任何内容统称为对象,包括数字、字符串、函数等。

Go 标准库 —— sync.Mutex 互斥锁

Mutex 是一个互斥锁,可以创建为其他结构体的字段;零值为解锁状态。Mutex 类型的锁和线程无关,可以由不同的线程加锁和解锁。

方法

func (*Mutex) Lock

1
func (m *Mutex) Lock()

Lock 方法锁住 m,如果 m 已经加锁,则阻塞直到 m 解锁。

func (*Mutex) Unlock

1
func (m *Mutex) Unlock()

Unlock 方法解锁 m,如果 m 未加锁会导致运行时错误。

Go 标准库 —— time 常用类型和方法

time 包提供了时间的显示和测量用的函数,日历的计算采用的是公历

本文仅整理演示常用的类型和方法,完整的可参考标准库文档

type Location

Location 代表一个(关联到某个时间点的)地点,以及该地点所在的时区

func LoadLocation

1
func LoadLocation(name string) (*Location, error)

LoadLocation 返回使用给定的名字创建的 Location

Go 采用 goroutine 和 channel 实现工作池

假设有一组任务需要异步处理且量很大,那我们需要同时开启多个 worker 以保证任务的处理速度而不会堵塞任务。其他语言,可能会需要开启多进程来完成,多进程的控制、IO 消耗等会是个需要注意的问题,而这些 Go 都能帮我们很轻易的解决。

大致的实现要点和流程:

  • 创建2个信道,messages 用于传送任务消息,result 用于接收消息处理结果
  • 创建3个 Worker 协程,用于接收和处理来自 messages 信道的任务消息,并将处理结果通过信道 result 返回
  • 通过信道 messages 发布10条任务
  • 通过信道 result 接收任务处理结果

Memcached UDP 反射攻击漏洞

问题记录

  今天中午有同事反应某系统打开很慢,以为是电脑问题(手动偷笑)。打开网站一看,慢的连静态文件都是几KB/S的速度。这明显不合理啊。上服务器一查,CPU正常、内存正常、Web程序也正常。

  于是想到了网络带宽问题。用vnstat -i eth1 -l一看,惊呆了😮,出网带宽达到了 162.44Mbit/s,这不是被攻击了么?

3971524549705_.pic_hd

Go 采用 time.After 实现超时控制

场景:

假设业务中需调用服务接口A,要求超时时间为5秒,那么如何优雅、简洁的实现呢?

我们可以采用select+time.After的方式,十分简单适用的实现。

首先,我们先看time.After()源码:

1
2
3
4
5
6
7
8
9
// After waits for the duration to elapse and then sends the current time
// on the returned channel.
// It is equivalent to NewTimer(d).C.
// The underlying Timer is not recovered by the garbage collector
// until the timer fires. If efficiency is a concern, use NewTimer
// instead and call Timer.Stop if the timer is no longer needed.
func After(d Duration) <-chan Time {
	return NewTimer(d).C
}

time.After()表示time.Duration长的时候后返回一条time.Time类型的通道消息。那么,基于这个函数,就相当于实现了定时器,且是无阻塞的。

PHP 表单提交数据项过多被截取问题

问题描述

今早业务系统中的带宽工具,出现因 Form 表单中传递的数据项过多,而后端 PHP 出现缺失部分参数值的问题。

问题原因

php.ini中有一配置项max_input_vars,默认值为1000。

表示接受多少输入的变量(限制分别应用于$_GET$_POST$_COOKIE超全局变量) 指令的使用减轻了以哈希碰撞来进行拒绝服务攻击的可能性。如有超过指令指定数量的输入变量,将会导致E_WARNING的产生,更多的输入变量将会从请求中截断。

Linux 命令 —— lsof 查看打开的文件信息

lsof (list open files)是一个列出当前系统打开文件的工具。拥有查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP),找回/恢复删除的文件等功能。

在 Linux 环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过 lsof 工具能够查看这个列表对系统监测以及排错将是很有帮助的。

因为 lsof 命令需要访问核心内存和各种文件,所以需要 root 用户执行。

命令格式

1
lsof [参数] [文件]