文章目录

  • 输出缓存
    • 输出缓冲区
    • 函数
  • 错误处理
    • 错误报告
    • 错误抑制
    • 触发错误
    • 定义错误处理器
    • 错误处理器中的日志
  • 性能调优
    • 分析
    • 优化执行时间
    • 优化内存占用
    • 扩展流量的三种方式:
      • 反向代理缓存
      • 负载均衡
      • 数据库复制

输出缓存

输出缓冲区

把输出的内容先放进内存,而不先显示。最根本的作用是,协调高速 CPU 和相对缓慢的 IO 设备(磁盘等)的运作。

函数

  • ob_start([callback]) : 打开输出缓冲。callback 参数是后处理输出的函数名。
  • ob_get_length():int : 获取当前缓冲区长度。缓冲没有开启返回 false 。
  • ob_get_contents():string : 获取当前缓冲区长度。缓冲没有开启返回 false 。
  • ob_clean() : 清理输出缓冲区但是不会关闭输出缓冲。
  • ob_end_clean() : 清理输出缓冲区并且结束输出缓冲
  • ob_flush() : 发送数据到网页服务器并且清理输出,但是不关闭输出缓冲。
  • flush() : 除了刷新和清理输出缓冲区,也会尝试让网页服务器立即发送数据到浏览器
  • ob_end_flush() : 发送数据到网页服务器并且清理输出,并且关闭输出缓冲。

错误处理

错误报告

PHP 中错误有三种等级:

  • 提示: notice ,发生在执行脚本可能出现错误时,但正常执行时也遇到(例如,尝试访问一个不存在的变量)。
  • 警告: warning ,表明一个非致命错误,典型的,警告在函数调用无效参数时就会显示。
  • 错误: error ,表明致命状态,无法从脚本中恢复,解析错误是一个特殊的错误类型,在脚本中有语法错误时发生。除了解析错误外的所有错误都叫运行时错误

在 PHP 中可以在 php.ini 文件中用 error_reporting 选项全局修改这个特性。也可以在脚本中使用 error_reporting() 函数在本地变量错误报告行为。

错误抑制

可以通过在独立表达式前放置一个错误抑制符 @ 来禁用它的错误信息.

$value = @(2 / 0);

错误抑制符不能抑制解析错误,只能抑制运行时错误的不同类型。

触发错误

可以在 PHP 中用 trigger_error() 函数抛出一个错误:

trigger_error(message [, tyep="E_SUER_NOTICE"]);type 参数:
* E_USER_ERROR : 错误
* E_USER_WARNING : 警告
* E_USER_NOTICE : 提示

定义错误处理器

如果你想格式化错误信息,可以向 PHP 提供错误处理器。基本方法是创建一个错误处理函数并用 set_error_handler() 来注册。

声明的函数可以接受 2 到 5 个参数。前两个参数是错误代码和错误描述。后面三个参数分别是:错误发生的文件名、错误发生的行号和错误发生的符号表复制。

function displayError($error, $errorString, $filename, $line, $symbols)
{echo "<p>Error '<b>{$errorString}</b>' occurred.<br />";echo "-- in file '<i>{$filename}</i>', line $line.";
}set_error_handler('displayError');
$value = 4 / 0; //输出
/*
Error 'Division by zero' occurred.
-- in file 'C:\Git\php\text1.php', line 8.
*/

错误处理器中的日志

PHP 提供内建函数 error_log() ,把错误记录到管理员放错误日志的地方。

error_log(message, type [, destination [, extra_haders ]]);type参数:
* 0 : 用 PHP 标准错误日志
* 1 : 把错误邮件给 destination 地址
* 3 : 附加错误到 destination 文件

当类型为 0 来调用 error_log() 。通过改变 php.ini 文件中 error_log 的值,可以修改要往那个文件中写日志。如果将其设置为 syslog ,系统日志将被使用。

性能调优

一旦你的代码可以工作,就可以优化代码。优化代码的目标通常为缩短运行时间减少内存占用

分析

使用 microtime() 来准确的标识消逝的时间。

例如,下面代码可以的得到 phpinfo() 输出花费了多少时间:

ob_start();
$start = microtime();phpinfo();$end = microtime();
ob_end_clean();echo "phpinfo() took" . ($end - $start) . "seconds to run.\n";

优化执行时间

  • 避免使用 printf() ,只用 echo

  • 避免在循环中重新计算值,因为 PHP 解析器不会移除循环不变量

    // 如果 $array 大小不变for($i = 0; $i < count($array); $i++) // bad$num = count($array);
    for($i = 0; $i < $num; $i++) // good
    
  • 只包含必要的文件。分离出包含文件中确定要用的函数,将他们放在一起。

  • 如果用了数据库,要使用持久化数据库连接——启动和关闭数据库连接时比较慢的。

  • 当可以用简单字符串操作函数时就不要用正则表达式。

优化内存占用

  • 用数字代替字符串

    for($i = "0", $i < "10"; $i++) // bad
    for($i = 0; $i < 10; $i++) // good
    
  • 当你处理完了一个大字符串,把保存字符串的变量设置为空,这会释放内存以便重用。

  • 只包含必需的文件,用 include_oncerequire_once 来替代 includerequire

  • 处理完 MySQL 和其他数据库的结果集后立即释放。在内存中保存使用后的结果集没有任何好处。

扩展流量的三种方式:

反向代理缓存

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。代理用来更快的提供静态文件。

负载均衡

负载均衡是分摊负载到几台机器上。一个“负载均衡系统”通过均衡分布负载或转发请求到较少负载的机器上实现。

数据库复制

有时数据库服务器会成为瓶颈——很多并发查询可能会拖垮一个服务器。复制是一个很好的解决方案。把发生在一个数据库上的所有同步带到其他一个或多个数据库上,这可以让你查询分散到不同的数据库服务器而不是自从一台服务器加载。

最有效的模型是单向复制,就是你只有一个主数据库要复制到几个从数据库上。写数据库到主数据库,读数据库是负载均衡地跨多个从库。这个技术的目标架构是多读小写。

感谢你看到了这里。如果文章有错误,请评论指正,谢谢!

PHP 入门 - 10.应用技术相关推荐

  1. web前端入门必知的10个技术

    随着HTML5的发展和普及,了解HTML5将成为Web开发人员的必修课.如何把网页做得更美观,对用户更有吸引力,不仅是企业对前端开发人员要求,更是一个合格的web前端工程师的自我修行.今天小编就跟大家 ...

  2. 过去的2018年,400000粉丝用指尖投票,选出了这10本技术书

    导读:常看大数据(ID:hzdashuju)的你一定知道,我们会定期从技术类图书中摘编干货内容,为大家提供最优质的第一手学习资源.这些内容覆盖了数据分析.机器学习.深度学习.自然语言处理.计算机科学等 ...

  3. 2022年全球半导体行业10大技术趋势

    2020年秋开始在全球范围内爆发的芯片短缺,在2021年持续了一整年仍没有缓解态势,半导体行业在拓展产能的同时,也在积极将工艺升级提高产出率.另一方面,新冠病毒不断出现变异,疫情的延续对于整个半导体行 ...

  4. SLAM导航机器人零基础实战系列:(二)ROS入门——10.在实际机器人上运行ROS高级功能预览...

    SLAM导航机器人零基础实战系列:(二)ROS入门--10.在实际机器人上运行ROS高级功能预览 摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了 ...

  5. PaaS是SaaS巨大的入门门槛和技术鸿沟?

    [编者按]眼下,可以看到崔牛会周边企业,曾经纯做SaaS,现在也正在做PaaS,或者已经做好了,再或者准备开始做.PaaS之风日渐盛行,也许是行业发展的必然.PaaS究竟会如何发展?也许这篇文章,可以 ...

  6. IT市场10大技术伟人 Linux之父居首(转)

    俗话说"一个成功男人的背后一定有一个伟大的女人".同样,一项伟大技术的背后一定有一名伟大人物在孜孜以求. 以下为IT市场迄今为止最伟大的10名技术伟人: 1. 李纳斯·托沃兹(Li ...

  7. 0基础学python难吗-零基础入门学习Python技术难不难?

    原标题:零基础入门学习Python技术难不难? 近几年对python人才爆发式需求,导致很多人转行进入python开发行业,现如今Python这门语言的就业前景会非常好.相对于其他来说,它语法简单易读 ...

  8. Java开发2018年值得学习的10大技术

    转载自 Java开发2018年值得学习的10大技术 作为一个开发人员,我们最大的挑战就是保持自己了解新的技术.技术变化很快,你大概每两年就会看到一个新版本的编程语言和框架. 就拿2017年来说,AR. ...

  9. 未来 10 年的科技圈,将会因这 10 项技术而颠覆!

    日新月异的科技圈,未来十年之内将会有哪些极具颠覆性的技术带来变革,本文将做一个大胆的猜测! 作者 | Ahmed Faizan 译者 | 安翔 责编 | 仲培艺 出品 | CSDN(ID:CSDNne ...

最新文章

  1. Charles 河畔的大圆顶
  2. UISeatchBar
  3. DL框架之TensorFlow:深度学习框架TensorFlow Core(低级别TensorFlow API)的简介、安装、使用方法之详细攻略
  4. Python数据库字段拆分数据
  5. BigDecimal丢失精度的坑
  6. httpd 分页_更改 Apache httpd.conf 配置文件
  7. saltstack安装使用
  8. 3项目里面全局用less变量 cli vue_如何把 CSS 变量全局化
  9. z17刷miui_努比亚Z17刷机包
  10. eclipse html插件的下载和安装
  11. 宋人千首绝句【全十卷】
  12. 安装ubuntu中出现的问题(xshell无法连接虚拟机中的ubuntu、nat模式无法ping主机和外网)
  13. 文献小镇--国内外文献免费下载!
  14. pytorch进行图像识别_pytorch使用4种不同的模型进行面部表情识别
  15. 大学生现状必须明白的27个冷道理(送妹妹参考)
  16. CF1821 E. Rearrange Brackets
  17. 读《软件测试》(美)Ron Patton笔记之一(2) 软件开发过程
  18. 无线串口服务器设计,基于无线串口服务器的DNC实验系统设计与开发.pdf
  19. MarcHandler (Marc ISO2709)
  20. 杜邦分析模型 java_1.杜邦分析法的核心指标是(  )。

热门文章

  1. jwt token注销_辩证的眼光搞懂 JWT 这个知识点
  2. (七) shiro 加密与解密
  3. Spring框架之权限管理
  4. MySQL约束课堂笔记
  5. linux卸载模块驱动程序,Linux设备驱动程序 之 装载和卸载模块
  6. atoi函数_吊打面试官 | 腾讯经典考点写代码实现atoi函数
  7. 实战|渗透学校某内网服务器
  8. 序列化以及反序列化二叉树
  9. java图像处理之图像裁剪
  10. kafka分区及副本在broker的分配