2016年11月

MySQL安全性考察

1:防SQL注入,prepare

  • 使用预处理语句: delete from user where id = ?

2:写入数据库的数据要进行特殊字符的转义

3:查询错误信息不要返回给用户,将错误记录到日志

4:PDO

PHP端尽量使用PDO对数据库进行相关操作,并且对预处理语句很好的支持,MySQLi也有,但是可扩展性不如PDO,效率高于PDO,MySQL函数在新版本中已经趋向于淘汰,所以不建议用,而且它没有很好的支持预处理

5:其它安全设置

  • 定期做数据备份
  • 不给查询用户root权限,合理分配权限
  • 关闭远程访问数据库权限
  • 修改root口令,不用默认口令,使用较复杂的口令
  • 删除多余的用户
  • 改变root用户的名称
  • 限制一般用户浏览其他库
  • 限制用户对数据文件的访问权限

CGI、FastCGI、PHP-CGI、PHP-FPM

1:CGI与FastCGI

  • CGI与FastCGI都是一种通讯协议,是web Sever(Apache/nginx/iis)与其他程序(此程序通常叫做CGI程序,如PHP脚本解析器)之间通讯的桥梁,CGI是为了保证Web Server传递过来的数据是标准格式的
  • FastCGI是CGI的改良进化版,FastCGI相比CGI更安全、性能更好,所以现在都是使用FastCGI协议进行通讯
  • FastCGI兼容CGI

2:PHP-CGI与PHP-FPM

  • PHP-CGI其实就是PHP脚本解析器,他是CGI协议的实现
  • PHP-FPM就是FastCGI协议的实现
  • PHP-CGI和PHP-FPM都是程序

3:PHP-FPM详解

  • fastcgi和cgi有什么区别

cgi在一个请求过来后,去读取php.ini里的基础配置信息,初始化执行环境,每次都要不停的去创建一个进程,读取配置,初始化环境,返回数据,退出进程,久而久之,启动进程的工作变的乏味无趣特别累;fastcgi可以让cgi一次启动一个主进程(master),让他只读取一次配置,然后在启动多个工作进程(worker),当一个请求来的时候,通过master传递给worker这样就可以避免重复劳动了,当worker不够的时候,master会通过配置里的信息,动态启动worker,等空闲的时候可以收回worker

  • php-fpm 到底是个什么东西

就是来管理启动一个master进程和多个worker进程的程序;PHP-FPM 会创建一个主进程,控制何时以及如何HTTP请求转发给一个或多个子进程处理。PHP-FPM主进程还控制着什么时候创建(处理Web应用更多的流量)和销毁(子进程运行时间太久或不再需要了)PHP子进程。PHP-FPM进程池中的每个进程存在的时间都比单个HTTP请求长,可以处理10、50、100、500或更多的HTTP请求

参考:
参考:
参考:

Mysql分库分表方案,如何分,怎样分

1:什么是分表?

分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去操作它

2:什么是分区?

分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候操作的还是大表名字,db自动去组织分区的数据。

3:mysql分表和分区有什么联系呢?

  • 都能提高mysql的性高,在高并发状态下都有一个良好的表现。
  • 分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。
  • 分表技术是比较麻烦的,需要手动去创建子表,app服务端读写时候需要计算子表名。采用merge好一些,但也要创建子表和配置子表间的union关系。
  • 表分区相对于分表,操作方便,不需要创建子表。

我们知道对于大型的互联网应用,数据库单表的数据量可能达到千万甚至上亿级别,同时面临这高并发的压力。Master-Slave结构只能对数据库的读能力进行扩展,写操作还是集中在Master中,Master并不能无限制的挂接Slave库,如果需要对数据库的吞吐能力进行进一步的扩展,可以考虑采用分库分表的策略
参考