进程、线程、协程

作者: 分类: php 时间: 2017-08-13 评论: 暂无评论

  进程
  第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。
  线程
  线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个 进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程 在运行中呈现出间断性。线程也有就绪、阻塞和运行三种基本状态。就绪状态是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;运行状态是指线程占有处理机正在运行;阻塞状态是指线程在等待一个事件(如某个信号量),逻辑上不可执行。每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
  在单个程序中同时运行多个线程完成不同的工作,称为多线程。
  协程
  一个程序可以包含多个协程,可以对比与一个进程包含多个线程,因而下面我们来比较协程和线程。我们知道多个线程相对独立,有自己的上下文,切换受系统控制;而协程也相对独立,有自己的上下文,但是其切换由自己控制,由当前协程切换到其他协程由当前协程来控制。

PHP 常用函数整理——字符串

作者: 分类: php 时间: 2017-08-12 评论: 暂无评论

1.explode(separator,string,limit)
separator 必需。规定在哪里分割字符串。
string 必需。要分割的字符串。
limit 可选。规定所返回的数组元素的数目。0是1个,-1去掉最后一个
2.implode(separator,array)
separator 可选。规定数组元素之间放置的内容。默认是 ""(空字符串)。
array 必需。要组合为字符串的数组。
3.str_split(string,length) 函数把字符串根据长度length分割成数组。
4.str_pad(string,length,pad_string,pad_type)
string 必需。规定要填充的字符串。
length 必需。规定新的字符串长度。如果该值小于字符串的原始长度,则不进行任何操作。
pad_string 可选。规定供填充使用的字符串。默认是空白。
pad_type
可选。规定填充字符串的哪边。
可能的值:
STR_PAD_BOTH - 填充字符串的两侧。如果不是偶数,则右侧获得额外的填充。
STR_PAD_LEFT - 填充字符串的左侧。
STR_PAD_RIGHT - 填充字符串的右侧。默认
5.strlen(string str) 字符串长度
6.substr ( string string, int start [, int length] ) 截取字符串
7.strpos(string,find,start) 查找字符串在另一字符串中第一次出现的位置,大小写敏感。 stripos()大小写不敏感
string 必需。规定要搜索的字符串。
find 必需。规定要查找的字符串。
start 可选。规定在何处开始搜索。
8.strrpos(string,find,start)函数查找字符串在另一字符串中最后一次出现的位置,大小写敏感。 strripos()大小写不敏感
string 必需。规定被搜索的字符串。
find 必需。规定要查找的字符。
start 可选。规定在何处开始搜索。
9.strstr(string,search,before_search) 返回出现那个字符串及之后的所有字符// stristr()大小写不敏感
string 必需。规定被搜索的字符串。
search 必需。规定要搜索的字符串。如果该参数是数字,则搜索匹配该数字对应的 ASCII 值的字符。
before_search 可选。默认值为"false"的布尔值。如果设置为 "true",它将返回 search参数第一次出现之前的字符串部分。
10.substr_replace(string,replacement,start,length)
string 必需。规定要检查的字符串。
replacement 必需。规定要插入的字符串。
start 必需。规定在字符串的何处开始替换
正数 - 在字符串中的指定位置开始替换
负数 - 在从字符串结尾的指定位置开始替换
0 - 在字符串中的第一个字符处开始替换
length 可选。规定要替换多少个字符。默认是与字符串长度相同。
正数 - 被替换的字符串长度
负数 - 表示待替换的子字符串结尾处距离 string 末端的字符个数。
0 - 插入而非替换
11.ucfirst() 函数把字符串中的首字符转换为大写。lcfirst() - 把字符串中的首字符转换为小写
12.strtolower() - 把字符串转换为小写 strtoupper() - 把字符串转换为大写
13.ucwords() - 把字符串中每个单词的首字符转换为大写
14.round(x,prec) 函数对浮点数进行四舍五入。
x 可选。规定要舍入的数字。
prec 可选。规定小数点后的位数。
15.ceil() 函数向上舍入为最接近的整数 floor()函数向下舍入为最接近的整数。
16.parse_str(string,array) 将字符串解析成变量 id=1&&key=dk //ps 可以用 $_SERVER['QUERY_STRING'] 获取url参数
string 必需。规定要解析的字符串。
array 可选。规定存储变量的数组的名称。该参数指示变量将被存储到数组中。$arr['id']=1;

17.sprintf(format,arg1,arg2,arg++)
format 必需。规定字符串以及如何格式化其中的变量。
可能的格式值:
%% - 返回一个百分号 %
%b - 二进制数
%c - ASCII 值对应的字符
%d - 包含正负号的十进制数(负数、0、正数)
%e - 使用小写的科学计数法(例如 1.2e+2)
%E - 使用大写的科学计数法(例如 1.2E+2)
%u - 不包含正负号的十进制数(大于等于 0)
%f - 浮点数(本地设置) 常用
%F - 浮点数(非本地设置)
%g - 较短的 %e 和 %f
%G - 较短的 %E 和 %f
%o - 八进制数
%s - 字符串 常用
%x - 十六进制数(小写字母)
%X - 十六进制数(大写字母)
附加的格式值。必需放置在 % 和字母之间(例如 %.2f):

  • (在数字前面加上 + 或 - 来定义数字的正负性。默认情况下,只有负数才做标记,正数不做标记)
    ' (规定使用什么作为填充,默认是空格。它必须与宽度指定器一起使用。例如:%'x20s(使用 "x" 作为填充))
  • (左调整变量值)
    [0-9] (规定变量值的最小宽度)
    .[0-9] (规定小数位数或最大字符串长度)
    注释:如果使用多个上述的格式值,它们必须按照以上顺序使用。
    arg1 必需。规定插到 format 字符串中第一个 % 符号处的参数。
    arg2 可选。规定插到 format 字符串中第二个 % 符号处的参数。
    arg++ 可选。规定插到 format 字符串中第三、四等 % 符号处的参数。
    格式:
    eg: sprintf("%-'x8.2f",1234) //1234.00x
    %s = %符号和后面属性符号(s)总称为插入标记组合,也就是把后面准备进行格式化的值(%s)替换在这个位置
    $是代表有多个值准备格式化
    '(补位值) 表示补位
    8.2 总宽度3 ,小数2位 小数点算一位,-号表示从右边开始补位
    eg: printf("[%'x4.2s]",1234) //%x.ys这里是截取字符串 显示4位,前面补充2位xx

[转]MySQL MyISAM 和InnoDB 区别

作者: 分类: php 时间: 2017-08-01 评论: 暂无评论

MyISAM 和InnoDB 讲解
  InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持以及外部键等高级数据库功能。
  以下是一些细节和具体实现的差别:
  ◆1.InnoDB不支持FULLTEXT类型的索引。
  ◆2.InnoDB 中不保存表的具体行数,也就是说,执行select count() from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含 where条件时,两种表的操作是一样的。
  ◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
  ◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
  ◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。
  另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
  两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁。而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。
  作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,如果数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是首选。
  原因如下:
  1、平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能是比Innodb强不少的。
  2、MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。
  3、经常隔1,2个月就会发生应用开发人员不小心update一个表where写的范围不对,导致这个表没法正常用了,这个时候MyISAM的优越性就体现出来了,随便从当天拷贝的压缩包取出对应表的文件,随便放到一个数据库目录下,然后dump成sql再导回到主库,并把对应的binlog补上。如果是Innodb,恐怕不可能有这么快速度,别和我说让Innodb定期用导出xxx.sql机制备份,因为最小的一个数据库实例的数据量基本都是几十G大小。
  4、从接触的应用逻辑来说,select count() 和order by 是最频繁的,大概能占了整个sql总语句的60%以上的操作,而这种操作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。
  5、还有就是经常有很多应用部门需要我给他们定期某些表的数据,MyISAM的话很方便,只要发给他们对应那表的frm.MYD,MYI的文件,让他们自己在对应版本的数据库启动就行,而Innodb就需要导出xxx.sql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。
  6、如果和MyISAM比insert写操作的话,Innodb还达不到MyISAM的写性能,如果是针对基于索引的update操作,虽然MyISAM可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。
  7、如果是用MyISAM的话,merge引擎可以大大加快应用部门的开发速度,他们只要对这个merge表做一些select count(
)操作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。
  当然Innodb也不是绝对不用,用事务的项目就用Innodb的。另外,可能有人会说你MyISAM无法抗太多写操作,但是可以通过架构来弥补。
转至 http://blog.csdn.net/xifeijian/article/details/20316775