整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

php性能优化

php性能优化

范说明

性能是网站运行是否良好的关键因素, 网站的性能与效率影响着公司的运营成本及长远发展,编写出高质高效的代码是我们每个开发人员必备的素质,也是我们良好的职业素养。

影响性能的因素

  • 商业需求需求合理性需求与系统的整合需求所带来的商业利益是否与需求开发的成本成正比需求所带来的风险
  • Web 服务器并发处理能力高负载的能力负载均衡的能力动态内容与静态内容的处理能力Web 服务器部署
  • DataBase 服务器并发访问数据库服务器的部署数据库的 shema 架构与的表设计是否合理数据检索
  • 操作系统
  • 客户端请求
  • 程序/语言

分析性能的指标

  • 程序的运行时间
  • 程序的运行所消耗的内存
  • 单位时间内的并行处理
  • 磁盘 IO 的处理

优化性能的目标

快速、并发、资源消耗低(内存、磁盘 IO、CPU 负载)

优化性能的原则

  • 服务器配配置最优化
  • 服务器部署合理化
  • 商业需求合理并与产出的商业价值成正比
  • 架构可用、可维护、可扩展
  • 程序的正确性、简单性、逻辑的合理性。
  • 不断的分析性能的的瓶颈
  • 不断的重构已有的代码
  • 优化的优先级:program->database->web sersver->os->client

优化

程序优化

  • 变量变量大小,注意变量大小是节约内存的最有效手段,对于来自用户表单、数据库和文件缓存的数据都需要控制变量的大小。 因为cpu要处理的数据是来源于内存变量有效期,使用unset()函数注销不需要的变量是一种良好的习惯,将一些不需要的变量立即注销可提高内存的使用率。复制变量,尽量不要复制变量,否则就会带来1倍的内存消耗,即使复制变量也应该要立即注销原有变量。变量类型,初始化变量请注意其变量类型,一个变量在执行过程中最好只有一种类型状态。对于数组变量,请初始化声明,如下: $a=array();临时变量,是处理业务逻辑的临时存储,这些都是需要消耗内存的。如果临时变量使用结束请立即注销,特别是在一些过程式代码的执行流程中,对于一些函数,如果业务非常复杂,同样需要立即注销临时变量静态变量,对于一些需要由复杂业务产生的变量,如果在程序的执行过程中多次产生并使用,可考虑使用静态变量,减少程序的cpu执行次数变量的性能:局部变量>全局变量>类属性>未定义的变量。
  • 循环尽量减少循环的次数。尽量减少循环的潜逃的层次,不要超过三层。避免在循环内有过多的业务逻辑。不要循环包含文件不要循环执行数据库操作。优先使用foreach,它比for/while效率高,如果循环内要调用函数,用array_walk最好,它的效率要比for 高出1倍,要比foreach高出43%的效率不要把 count/strlen/sizeof 放到 for 循环的条件语句中 For($i=0,$count=count($array);$i<$count;$i++){} 不要使用for($i=0;$i<count($array);$i++){};for($i=$total;$i>0;$i–){}性能好于for($i=0;$i<$total;$–){}保持循环体内的业务逻辑清晰
  • 函数函数职责清晰,一个函数只干一件事,不要杂揉过多的业务逻辑函数代码体不要超过20行,反之,考虑拆分。优先使用php内置函数常量与函数同时能干一件事,优先使用常量。 phpversion() < PHP_VERSION get_class() < CLASS is_null() < NULL===echo 的性能好于print,输入多个变量的时候用echo $str,$str1,不用.连接符$_SERVER[REQUEST_TIME]替换time();字符串替换strtr()->str_replace()->preg_replace()->epreg();发挥trim最大功效,替换substr。$filepath=trim($filename,’/’).’/’;Isset/empty 虽然两个函数功能有所差异,但在同样的情况下推荐使用 empty()isfile/file_exist 两个函数的功能有所不同,file_exist既可判断文件是否存在,也可以判断目录是否存在,在同样的情况下推荐使用is_file
  • 文件减少文件包含数,减少磁盘 IO使用完整路径,或者容易转换的相对路径。避免在 include_path 查找文件的代码行数不要超过 2000 行Require_once/include_once 效率低于 require/include, 需要额外的去查看系统是否已经调用过这个文件. 因为它们在一个 opcode 缓存下的调用非常慢程序执行文件用 requie/require_once,缓存文件用include/include_once。Include 效率好于 require优化 spl 中的文件自动加载机制,可参靠 yii类库文件加载,是否考虑类是否已经实例化,可考虑采用设计模式之单例模式文件读写的并发性
  • 面向对象控制实例的创建的数量优先使用常量、类常量优先例用静态变量,静态属性类的结构合理面象接口编程封装变化点依赖于抽象,不依赖于细节优先使用静态成员类的接口清晰稳定,类的职责单一,类与类的通信合理使用常量的好处 编译时解析,没有额外开销 杂凑表更小,所以内部查找更快 类常量仅存在于特定「命名空间」,所以杂凑名更短 代码更干净,使除错更方便
  • 字符串 用单引号替代双引号引用字符串;避免检索字符串中的变量
  • 运算用 i+=1 代替i=i+1。符合c/c++的习惯,效率还高++$i 的效率高于++$i,–$i 同理
  • 数组多维数组尽量不要循环嵌套赋值;使用$array[‘name’]方式访问数组,禁止$array[name]/$array[“name”]
  • 判断逻辑判断请优先使用switch 的方式,对于业务逻辑相对较多的情况请选择if/else,提高代码的可读性尽量控制if/else判断的个数,如果太多请考虑功能优化或代码优化尽量使用恒等用于比较判断,恒等的效率高于等于,而且还能避免一些类型强制转换的错误if/else与_&&,单条语句判断请选择&&的形式, &&的效率高于if/else,如下 : if ($a==1) { $b=2; } 可选择为($a==1) && $b=2;

缓存

  • 使用php加速器,缓冲opcode
  • 例用memcache/nosql
  • 使用内存数据库、
  • 使用文件缓存
  • 缓冲功能

其它

  • 少用@符号,严重影响性能
  • 适时关闭远程资源连接如数据库,ftp、socket等,适时的清理这些资源
  • 合理的商业需情
  • 数据库 schema 架构优化
  • 垂直与水平分库分表
  • 索引优化,查询优化
  • 第三方开源检索工具(sphinx)
  • 主从数据库服务器的使用。
  • Web 服器优化(暂未整理,有相应的 Web 服务器优化手册)
  • 操作系统优化(暂未整理,有相应的 OS 优化手册)
  • 前端优化合理的 html 结构合理 html 与css 的同时,考虑 Css 设计合理,减少 http 请求合理 html 与java script 的同时,考虑拆分是否合理,减少 http 请求优化 java script 代码,让用户有良好的体验根据 http 协议,优化高并发请求

性能检测工具

  • Web Server
  • ab
  • http_load
  • xhprof
  • OneAPM
  • apd
  • xdebug
  • Mysql
  • explain
  • profiler


hp超级全局变量




PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 你不需要特别说明,就可以在函数及类中使用。

PHP 超级全局变量列表:

  • $GLOBALS
  • $_SERVER
  • $_REQUEST
  • $_POST
  • $_GET
  • $_FILES
  • $_ENV
  • $_COOKIE
  • $_SESSION


  • $GLOBALS

    $GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问

    $GLOBALS 是一个包含了全部变量的全局组合数组。变量的名字就是数组的键

    
    <?php 
    $x=75; 
    $y=25;
     
    function addition() 
    { 
        $GLOBALS['z']=$GLOBALS['x'] + $GLOBALS['y']; 
    }
     
    addition(); 
    echo $z; 
    ?>
    

    $_SERVER

    $_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建

    
    <?php 
    echo $_SERVER['PHP_SELF'];
    echo "<br>";
    echo $_SERVER['SERVER_NAME'];
    echo "<br>";
    echo $_SERVER['HTTP_HOST'];
    echo "<br>";
    echo $_SERVER['HTTP_REFERER'];
    echo "<br>";
    echo $_SERVER['HTTP_USER_AGENT'];
    echo "<br>";
    echo $_SERVER['SCRIPT_NAME'];
    ?>
    

    $_REQUEST

    PHP $_REQUEST 用于收集HTML表单提交的数据。

    以下实例显示了一个输入字段(input)及提交按钮(submit)的表单(form)。 当用户通过点击 "Submit" 按钮提交表单数据时, 表单数据将发送至<form>标签中 action 属性中指定的脚本文件。 在这个实例中,我们指定文件来处理表单数据。如果你希望其他的PHP文件来处理该数据,你可以修改该指定的脚本文件名。 然后,我们可以使用超级全局变量 $_REQUEST 来收集表单中的 input 字段数据:

    
    <html>
    <body>
     
    <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
    Name: <input type="text" name="fname">
    <input type="submit">
    </form>
     
    <?php 
    $name=$_REQUEST['fname']; 
    echo $name; 
    ?>
     
    </body>
    </html>
    

    $_POST

    $_POST 被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="post"。

    以下实例显示了一个输入字段(input)及提交按钮(submit)的表单(form)。 当用户通过点击 "Submit" 按钮提交表单数据时, 表单数据将发送至<form>标签中 action 属性中指定的脚本文件。 在这个实例中,我们指定文件来处理表单数据。如果你希望其他的PHP文件来处理该数据,你可以修改该指定的脚本文件名。 然后,我们可以使用超级全局变量 $_POST 来收集表单中的 input 字段数据

    
    <html>
    <body>
     
    <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
    Name: <input type="text" name="fname">
    <input type="submit">
    </form>
     
    <?php 
    $name=$_POST['fname']; 
    echo $name; 
    ?>
     
    </body>
    </html>
    

    $_GET

    PHP $_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="get"。

    $_GET 也可以收集URL中发送的数据。




    PHP中get和post区别?

    第一种:

    • GET在浏览器回退时是无害的,而POST会再次提交请求。
    • GET产生的URL地址可以被Bookmark(标记),而POST不可以。
    • GET请求会被浏览器主动cache(存储),而POST不会,除非手动设置。
    • GET请求只能进行url编码,而POST支持多种编码方式。
    • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
    • GET请求在URL中传送的参数是有长度限制的,而POST么有。
    • 对参数的数据类型,GET只接受ASCII(美国信息交换标准码)字符,而POST没有限制。
    • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
    • GET参数通过URL传递,POST放在Request body中。

    第二种、

    • get是从服务器上获取数据,post是向服务器传送数据。
    • get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。
    • post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
    • get传送的数据量较小,不能大于2KB。
    • post传送的数据量较大,一般被默认为不受限制。
    • get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

    注意:post只是相比较get安全性更高一点,并不是说是万无一失的,在编程语言中,安全是最重要的(在输出语句中echo,print,var_dump等输出语句一定要使用过滤函数如htmlentiti()或正则过滤);




    Cookie

    cookie 常用于识别用户。cookie 是一种服务器留在用户计算机上的小文件。每当同一台计算机通过浏览器请求页面时,这台计算机将会发送 cookie。通过 PHP,您能够创建并取回 cookie 的值。

    如何创建cookie?

    setcookie()函数用于设置 cookie

    注释:setcookie() 函数必须位于 <html> 标签之前

    语法:

     <?php
       setcookie(name , value, expire ,path , domain); 
      ?>
    <?php
      setcookie("user" , "hulitong", time()+3600); 
     ?>
       
      <html>
       ...

    取回cookie的值

     <?php
      我们使用 isset() 函数来确认是否已设置了 cookieecho $_COOKIE["user"];  //输出user的cookie
    print_r($_COOKIE);  //获取打印所有cookie
      ?>
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
    </head>
    <body>
    
    <?php
    if (isset($_COOKIE["user"]))
        echo "欢迎 " . $_COOKIE["user"] . "!<br>";
    else
        echo "普通访客!<br>";
    ?>
    
    </body>
    </html>

    如上:我们使用 isset() 函数来确认是否已设置了 cookie


    如何删除Cookie?

    当删除 cookie 时,您应当使过期日期变更为过去的时间点。

    <?php
    // 设置 cookie 过期时间为过去 1 小时
    setcookie("user", "", time()-3600);
    ?>



    Session

    session 变量用于存储关于用户会话(session)的信息,或者更改用户会话(session)的设置。Session 变量存储单一用户的信息,并且对于应用程序中的所有页面都是可用的

    您在计算机上操作某个应用程序时,您打开它,做些更改,然后关闭它。这很像一次对话(Session)。计算机知道您是谁。它清楚您在何时打开和关闭应用程序。然而,在因特网上问题出现了:由于 HTTP 地址无法保持状态,Web 服务器并不知道您是谁以及您做了什么。

    PHP session 解决了这个问题,它通过在服务器上存储用户信息以便随后使用(比如用户名称、购买商品等)。然而,会话信息是临时的,在用户离开网站后将被删除。如果您需要永久存储信息,可以把数据存储在数据库中。

    Session 的工作机制是:为每个访客创建一个唯一的 id (UID),并基于这个 UID 来存储变量。UID 存储在 cookie 中,或者通过 URL 进行传导

    在您把用户信息存储到 PHP session 中之前,首先必须启动会话。

    注释:session_start() 函数必须位于 <html> 标签之前:

    <?php session_start(); ?>
     
    <html>
    <body>
     
    </body>
    </html>

    存储和取回 session 变量的正确方法是使用 PHP $_SESSION 变量

    <?php
    session_start();
    // 存储 session 数据
    $_SESSION['views']=1;
    ?>
     
    <html>
    <head>
    <meta charset="utf-8">
    <title>菜鸟教程(runoob.com)</title>
    </head>
    <body>
     
    <?php
    // 检索 session 数据
    echo "浏览量:". $_SESSION['views'];
    ?>
     
    </body>
    </html>


    销毁session

    如果您希望删除某些 session 数据,可以使用 unset() 或 session_destroy() 函数。

    unset() 函数用于释放指定的 session 变量:

    <?php
    session_start();
    if(isset($_SESSION['views']))
    {
        unset($_SESSION['views']);
    }
    ?>

    您也可以通过调用 session_destroy() 函数彻底销毁 session:

    html表单:HTML表单用于收集用户输入的数据,并将数据发送到服务器进行处理,创建了一个包含多种表单元素的表单。其中,<label> 标签用来描述表单元素,<input> 标签用来创建表单输入框,<textarea> 标签用来创建多行文本输入框,<button> 标签用来创建提交按钮等等。下面我们一起来学习了解吧



    表单标签

    HTML提供了几个用于创建表单的标签,包括<form>、<input>、<label>、<select>、<option>、<textarea>和<button>。

    <form>标记用于创建表单元素,该元素可以包含一个或多个表单控件,如文本输入、复选框、单选按钮等。

    action属性指定表单数据应提交到的URL,method属性指定用于提交的HTTP方法(通常为“GET”或“POST”)。

    下面是一个带有文本输入和提交按钮的简单表单示例:

    <form action="submit-form.php" method="POST">
      <label for="name">Name:</label>
      <input type="text" id="name" name="name">
      <button type="submit">Submit</button>
    </form>
    

    在本例中,<label>标记用于使用for属性和id属性将文本输入与其标签相关联。输入的name属性指定将与表单数据一起提交的表单字段的名称。

    <select>标记用于创建选项的下拉列表,<option>标记用于定义每个选项。下面是一个例子:

    <label for="color">Favorite color:</label>
    <select id="color" name="color">
      <option value="red">Red</option>
      <option value="green">Green</option>
      <option value="blue">Blue</option>
    </select>
    

    在本例中,每个选项的value属性指定将与表单数据一起提交的值。

    <textarea>标记用于创建多行文本输入。下面是一个例子:

    <label for="message">Message:</label>
    <textarea id="message" name="message"></textarea>
    

    <button>标记用于创建一个按钮,该按钮可用于提交表单或执行其他操作。 下面是一个例子:

    <button type="submit">Submit</button>
    

    文本框、密码框和多行文本框

    HTML中,文本框、密码框和多行文本框分别使用input元素的不同type属性值来实现。

    • 文本框:使用<input type="text">标签实现;
    • 密码框:使用<input type="password">标签实现;
    • 多行文本框:使用<textarea></textarea>标签实现。

    文本框、密码框和多行文本框是用来接收用户输入的常见表单元素。它们分别使用不同的标签和属性来实现。

    1. 文本框

    文本框(text box)是用于接受单行文本输入的表单元素。可以通过设置<input>标签的type属性为"text"来创建文本框。例如:

    <label for="username">用户名:</label>
    <input type="text" id="username" name="username">
    

    上面的示例代码中,id属性定义了文本框的唯一标识符,name属性定义了提交表单时该文本框的名称。

    1. 密码框

    密码框(password field)是用于接受密码等敏感信息的表单元素,并且会将用户输入的字符隐藏起来。可以通过设置<input>标签的type属性为"password"来创建密码框。例如:

    <label for="password">密码:</label>
    <input type="password" id="password" name="password">
    
    1. 多行文本框

    多行文本框(text area)可用于接收包含多个行的文本输入,例如评论或留言等。可以通过使用<textarea>标签来创建多行文本框,然后使用它的rows和cols属性来指定它的尺寸。例如:

    <label for="message">留言:</label>
    <textarea id="message" name="message" rows="5" cols="30"></textarea>
    

    上面的示例代码中,rows属性定义了多行文本框的行数,cols属性定义了多行文本框每一行的字符数。

    单选框和复选框

    HTML中,单选框和复选框是常见的表单元素,用于让用户选择不同选项。它们分别使用<input>标签的不同type属性值来实现。

    1. 单选框

    单选框(radio button)允许用户在一组选项中选择一个。可以使用相同的name属性来将多个单选框关联起来。当用户勾选其中一个单选框时,其他单选框将自动取消选中状态。可以通过设置<input>标签的type属性为"radio"来创建单选框。例如:

    <form>
      <p>请选择性别:</p>
      <label><input type="radio" name="gender" value="M">男士</label>
      <label><input type="radio" name="gender" value="F">女士</label>
      <label><input type="radio" name="gender" value="O">其他</label>
    </form>
    

    上面的示例代码中,三个单选框使用相同的name属性,以便将它们关联起来。当用户勾选其中一个单选框时,另外两个单选框将自动取消选中状态。

    1. 复选框

    复选框(checkbox)允许用户选择多个选项。可以使用相同的name属性来将多个复选框关联起来。当用户勾选其中一个复选框时,其他复选框保持不变。可以通过设置<input>标签的type属性为"checkbox"来创建复选框。例如:

    <form>
      <p>请选择语言:</p>
      <label><input type="checkbox" name="lang" value="js">JavaScript</label>
      <label><input type="checkbox" name="lang" value="py">Python</label>
      <label><input type="checkbox" name="lang" value="java">Java</label>
    </form>
    

    上面的示例代码中,三个复选框使用相同的name属性,以便将它们关联起来。用户可以勾选多个复选框。

    单选框和复选框的值可以通过value属性进行指定,当表单提交时,浏览器会将被选中的单选框或复选框的值作为表单数据提交到服务器并进行处理。

    下拉列表框和列表框

    HTML中,下拉列表框和列表框是用来显示多个选项的表单元素。它们分别使用不同的标签和属性来实现。

    1. 下拉列表框

    下拉列表框(dropdown list)可以让用户从多个选项中选择一个选项。可以使用<select>标签来创建下拉列表框,然后使用<option>标签定义每一个选项。例如:

    <form>
      <p>请选择城市:</p>
      <select name="city">
        <option value="bj">北京</option>
        <option value="sh">上海</option>
        <option value="gz">广州</option>
        <option value="sz">深圳</option>
      </select>
    </form>
    

    上面的示例代码中,四个<option>标签定义了四个选项。其中"value"属性指定每个选项的值,"text"节点指定每个选项的文本内容。当用户点击下拉框时,会出现一个下拉菜单列出所有可用选项,用户可以从中选择一个选项。

    1. 列表框

    列表框(list box)是另一种显示多个选项的表单元素,与下拉列表框不同的是,列表框可以同时显示多个选项。可以使用<select>标签来创建列表框,然后使用<option>标签定义每一个选项并设置multiple属性为"multiple"来启用多选模式。例如:

    <form>
      <p>请选择兴趣爱好:</p>
      <select name="interests" multiple>
        <option value="reading">阅读</option>
        <option value="music">音乐</option>
        <option value="painting">绘画</option>
        <option value="sports">运动</option>
      </select>
    </form>
    

    上面的示例代码中,multiple属性指定该列表框启用多选模式。当用户选择一个或多个选项时,这些选项将被高亮显示。

    总之,在HTML中可以使用下拉列表框和列表框来为用户提供多个选项让用户选择,并在表单提交时将选择的结果作为表单数据提交到服务器。

    按钮和图像按钮

    HTML中,按钮和图像按钮是用来触发事件或提交表单的表单元素。它们分别使用<button>标签和<input>标签的不同type属性值来实现。

    1. 普通按钮

    普通按钮(button)通常用于触发一些事件,例如刷新页面、清空表单等。可以使用<button>标签来创建普通按钮。例如:

    <button>点击我</button>
    

    上面的示例代码中,创建了一个简单的按钮,点击按钮会触发一些事件。

    1. 提交按钮

    提交按钮(submit button)用于将表单数据提交到服务器进行处理。可以使用<input>标签,并将其type属性设置为"submit"来创建提交按钮,例如:

    <input type="submit" value="提交">
    

    上面的示例代码中,设置了一个提交按钮,当用户点击该按钮时,浏览器会将表单数据提交到服务器并进行处理。

    1. 图像按钮

    图像按钮(image button)与普通按钮类似,但它使用图片而不是文本作为按钮的标识。可以使用<input>标签,并将其type属性设置为"image"来创建图像按钮,例如:

    <input type="image" src="submit.png" alt="提交">
    

    上面的示例代码中,创建了一个带有图片的图像按钮。当用户单击图像按钮时,浏览器会将表单数据提交到服务器并进行处理。

    总结

    以上就是今天要讲的内容,本文简单介绍了HTML的表单的知识点,更多内容可以查看THTML官方文档

    如果觉得有用,欢迎明天再来,继续合集的下一篇文章学习
    遇到问题,私信我!!~~