首页 > 编程 > PHP > 正文

php性能优化之php语言级的性能优化一

2020-03-22 19:27:12
字体:
来源:转载
供稿:网友
  • 对于这个问题首先我们要知道影响php的性能的原因是什么?也就是

    1 什么情况下会出现php性能问题?

    1php语法使用不当(包括某些业务可以使用php 本身自带的函数来处理)

    2使用php语言做了它不擅长的事

    3用php语言链接的服务器不给力(当然如果是localhost也就是你本地配置比较差哈,建议换本吧,哈哈)

    4php自身的短板 (PHP 自身就做不了)

    5我们也不知道的问题 (囧)

    2 php 性能问题简介之php的性能问题的解决方向

    从困难度由浅到深分别为:

    1 Php 语言级的性能优化

    2 Php 周边问题的性能优化 (比如说mysql nginx|apache)

    3 Php 语言资深分析,优化(ps 主要指的是底层的c代码)

    下面针对php语言级的性能优化做实例讨论,对标题里面说的内容进行一个测试,接下来要书写两个文件 bad.php, goods.php

    我们要测试的是合并两个数组的操作(测试工具 apache ab test)

    bad.php

    思路:

    先将数组1逐个加入到目标数组中;

    之后,遍历数组2,对比数组2的元素是否在数组1中出现,如果没有则插入到目标数组,否则忽略掉

    <?php//准备两个内容随机的数组$arr1 = $arr2 = $arr_merged = array();//接下来随机给两个数组赋值for ( $i=0; $i<rand(1000,2000); $i++) {	$arr1[] = rand();}for ( $i=0; $i<rand(1000,2000); $i++) {	$arr2[] = rand();}//开始循环比较foreach ( $arr1 as $v ) {	$arr_merged[]  = $v;}foreach ( $arr2 as $v ) {	if(!in_array($v, $arr_merged)){		$arr_merged[]  = $v;	}}var_dump($arr_merged);

    goods.php

    思路:

    随机生成两个数组,在打乱顺序

    之后,使用array_merge 合并

    <?php//准备两个内容随机的数组$arr1 = $arr2 = range(1000, 2000);$arr_merged = array();//接下来随机给两个数组赋值shuffle($arr1);shuffle($arr2);$arr_merged = array_merge($arr1, $arr2);var_dump($arr_merged);

    3 使用 ab 测试两个php脚本的速度:(ps:惊人的时刻开始了)

    bad.php

    goods.php

    对于这两个测试,我们明显的看出这的差的不是一点半点啊,在执行bad.php 的时候我明显的感觉电脑的风扇翁的一下,你懂得!

    bad.php 每秒响应174个请求, 每个请求处理572ms

    goods.php 每秒响应4050个请求, 每个请求处理24ms

    ps: 如果还要小伙伴在使用bad的写法,赶快改掉它,小心不要你的领导知道哦!


    4 究其原因

    对于这个结果我也很吃惊,但是事实就在眼前,没办法啊,那么到底为什么会有这样的效果呢,咱们继续一探究竟:

    *.php(php代码) -----Scanner(zend引擎逐行扫描变为zend可以识别的语法)----> exprs

    -----parser(解析为opcode)-----> opcodes ------exec(执行最后输出)-------> output

    可以知道 一个php文件执行zend需要先扫描,然后解析为opcode 在执行输出,问题就出在这里,当我们使用php自身的函数的时候其实他就属于zend 引擎,所以zend 解析起来就比较顺手,速度那叫个快(goods.php), 但是当执行bad.php 的时候就会比较慢,因为读别人写的代码肯定没有读自己写的代码快大家说对吧,所以还是使用原创,不要自己造轮子比较好啊!

    多说一点,这也就是为什么现在好些Php扩展(比如 apc)都来缓存opcode 因为这样就少了扫描与解析的环节,那肯定是快了!

    5 总结

    优化点:少写代码,多用php自身提供的能力

    性能问题:

    自己写的代码冗余较多,可读性不好,并且性能低

    为什么性能低?

    php代码需要编译解析为底层语言, 这一过程每次请求都会 处理一遍,开销大。

    好方法:

    多使用php内置变量,常量, 函数(spl 可以带给您好像好用的功能)

    PHP编程

    郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表