php错误处理,自动加载,以及栈堆内存和运行模式堆浅解 (转)
Php错误处理
Php错误级别:
E_ERROR 致命错误,会终止脚本运行.值为1
E_WARNING 警告错误,给出提示,不会终止运行值为2
E_PARSE 编译时的语法解析错误,解析错误仅仅由分析器产生。值为4
E_NOTICE 运行时通知错误,表示脚本可能会遇到错误的情况 值为8
E_CORE_ERROR 在PHP初始化启动过程中发生的致命错误。该错误类似 E_ERROR,但是是由PHP引擎核心产生的。 值为16
E_CORE_WARNING PHP初始化启动过程中发生的警告 (非致命错误) 。类似 E_WARNING,但是是由PHP引擎核心产生的。 值为32
E_COMPILE_ERROR 致命编译时错误。类似E_ERROR, 但是是由Zend脚本引擎产生的。值为64
E_COMPILE_WARNING 编译时警告 (非致命错误)。类似 E_WARNING,但是是由Zend脚本引擎产生的。值为128
E_USER_ERROR 用户产生的错误信息。类似 E_ERROR, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。值为256
E_USER_WARNING 用户产生的警告信息。类似 E_WARNING, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。值为512
E_USER_NOTICE 用户产生的通知信息。类似 E_NOTICE, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。值为1024
E_STRICT 启用 PHP 对代码的修改建议,以确保代码具有最佳的互操作性和向前兼容性。值为2048
E_RECOVERABLE_ERROR可被捕捉的致命错误。 它表示发生了一个可能非常危险的错误,但是还没有导致PHP引擎处于不稳定的状态。 如果该错误没有被用户自定义句柄捕获 (参见 set_error_handler()),将成为一个 E_ERROR 从而脚本会终止运行。值为4096
E_DEPRECATED 运行时通知。启用后将会对在未来版本中可能无法正常工作的代码给出警告。值为8192
E_USER_DEPRECATED用户产少的警告信息。 类似 E_DEPRECATED, 但是是由用户自己在代码中使用PHP函数 trigger_error()来产生的。 值为16384
E_ALL 表示E_STRICT除外的所有错误和警告信息。 值为 30719
使用位运算符组合显示或屏蔽的错误(二进制权限判断)
Php有关于错误的配置
error_reporting 设置错误报告的级别,级别设置可看上面
其默认值为 E_ALL & ~E_NOTICE,表示显示除了E_NOTICE以及E_STRICT的所有错误
E_STRICT错误级别不包含在E_ALL里,必须自己明确启用该级别才能出现
在php以外使用错误级别常量是没有意义的,可以用十进制数字代替,比如2147483647 包含了所有的错误
display_errors 是否将错误输出到屏幕上
虽然可以使用ini_set重新设置,但是当php发生致命错误时,是无法设置的
display_startup_errors 是否显示启动时的错误
log_errors 是否将脚本的错误信息记录到log
log_errors_max_len
设置 log_errors 的最大字节数. 在 error_log 会添加有关错误源的信息。默认值为1024,如果设置为0表示不限长度。该长度设置对记录的错误,显示的错误,以及 $php_errormsg都会有限制作用。
ignore_repeated_errors
不记录重复的错误信息,
ignore_repeated_source
忽略重复消息时,也忽略消息的来源。当该设置开启时,重复信息将不会记录它是由不同的文件还是不同的源代码行产生的。
report_memleaks
如果这个参数设置为Off,则内存泄露信息不会显示 (在 stdout 或者日志中)。This report will be send to stderr on Posix platforms. On Windows, it will be send to the debugger using OutputDebugString(), and can be viewed with tools like » DbgView。这只对调试编译有效,而且需要 error_reporting 包含了 E_WARNING 才会起作用
track_errors
如果开启,最后的一个错误将永远存在于变量 $php_errormsg 中。
html_errors
在错误信息中关闭HTML标签。这种新的HTML格式的错误信息是可以点击,它引导用户前往描述该错误或者导致该错误发生的函数的参考信息页面。 这些参考与 docref_root 和 docref_ext 的设置有关。
error_prepend_string string
错误信息之前输出的内容。
error_append_string string
错误信息之后输出的内容。
error_log
设置脚本错误将被记录到的文件。该文件必须是web服务器用户可写的。如果特殊值 syslog 被设置,则将错误信息发送到系统日志记录器。在Unix以及类似系统上,使用的是 syslog(3) ,而在 Windows NT 类系统上则为事件日志。Windows 95上不支持系统日志记录。参见: syslog(). 如果该配置没有设置,则错误信息会被发送到 SAPI 错误记录器。例如,出现在Apache的错误日志中,或者在CLI中发送到stderr。
错误处理相关方法以及用法个人理解
debug_backtrace — 产生一条回溯跟踪(backtrace) 可设置参数限制返回的堆栈数量,
可以查出调用该函数的堆栈信息,对查错很有帮助,和tp的debug类似
debug_print_backtrace();直接打印回溯,和debug_backtrace类似,
error_clear_last — 清除最近一次错误
error_get_last — 获取最后发生的错误
error_log — 发送错误信息到某个地方,可将错误存进一个文件,但是错误信息不能有null
error_reporting — 设置应该报告何种 PHP 错误,和php.ini 一样
restore_error_handler — 还原之前的错误处理函数,
restore_exception_handler — 恢复之前定义过的异常处理函数。
set_error_handler — 设置用户自定义的错误处理函数,需要在错误之前就定义
以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、E_COMPILE_ERROR、 E_COMPILE_WARNING,和在 调用 set_error_handler() 函数所在文件中产生的大多数 E_STRICT。
就像error_reporting 的 ini 设置能够控制错误的显示一样, 第2个参数能够用于屏蔽 error_handler 的触发。 如果没有该掩码, 无论error_reporting 是如何设置的, error_handler 都会在每个错误发生时被调用。
set_exception_handler — 设置用户自定义的异常处理函数
trigger_error — 产生一个用户级别的 error/warning/notice 信息
user_error — trigger_error 的别名
register_shutdown_function 在php终止脚本之后执行的注册函数,第一个参数支持函数,以及一个包含实例化类的语句,类方法的数组(注册时会先实例化该类);(只要注册成功,啥错误都可以捕获)
Php自动加载
个人见解
spl_autoload_register 和__autoload主要区别在于
__autoload 只是个函数 只能在php中定义一次,如果要加载插件等,需要不断的if else判断,或者是composer,将会很麻烦
spl_autoload_register 可以根据文件夹,或插件,自定义各种处理函数,创造一个自动加载的队列,会根据队列一直找下去;直到队列完毕或者返回true(找到文件默认返回true)
堆栈内存(个人理解)
堆:存放用户定义变量的
栈:在函数中定义的一些基本类型变量,对象的引用变量,都在栈空间,超出该作用域时将会自动释放
资料补充:
堆:
当在文件中定义的变量被static修饰之后,将改变到全局数据区,不占用堆栈内存
栈:
栈内存一般存储的是函数的调用信息和函数中申明的变量,因为函数的调用是递归的,外层函数一定比内层被调用的函数先加载和执行,而一定等到内层被调用函数结束后才能结束,这个先进后出的机制就是为什么叫栈内存的原因。
PS:在编译时编译器会先收集此函数中所有定义的变量,将他们放在函数最前面申请内存,所以他们进出栈的顺序不是你在编写程序时定义的顺序,而是在函数执行前进栈,函数执行完成后出栈。
其他:
Const,global,static修饰之后都存放在全局数据区
超全局变量,全局变量,都属于静态变量,存放在全局数据区
资料较少,等待纠正以及完善
Phpweb运行模式
Php运行模式:
1)CGI(通用网关接口/ Common Gateway Interface)
一般是可执行程序,例如EXE文件,和WEB服务器各自占据着不同的进程,而且一般一个CGI程序只能处理一个用户请求。这样,当用 户请求数量非常多时,会大量占用系统的资源,如内存、CPU时间等,造成效能低下。
- 2.FastCGI(常驻型CGI / Long-Live CGI)
FastCGI是CGI的升级版本,FastCGI像是一个常驻 (long-live)型的 CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去Fork 一次 (这是 CGI 最为人诟病的 fork-and-execute 模式)。
FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx和lighttpd等,同时,FastCGI也被许多脚本语言所支持,其中就有PHP。
FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。
Php-fpm 是php中自带的fastcgi管理器
3)CLI(命令行运行 / Command Line Interface)
- 4.Web模块模式(Apache等Web服务器运行的模式)
该模式是apache在cgi基础上的一个扩展
- 5.ISAPI(Internet Server Application Program Interface)是微软提供的一套面向WEB服务的API接口,它能实现CGI提供的全部功能,并在此基础上进行了扩展,如提供了过滤器应用程序接 口。ISAPI应用大多数以DLL动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,而是继续驻留在内存中等待处理别的 用户输入。此外,ISAPI的DLL应用程序和WEB服务器处于同一个进程中,效率要显著高于CGI。
Php2种与web服务器交互:
Nginx:
用户发起请求,以nginx现行握手,当nginx接收到之后,推送给php-fpm进行处理,当php-fpm繁忙时,nginx将返回504 getway
Apache:
Apache有3种运行模式,prefork,worker,Event,
根据不同的模式而创建不同的处理进程以及线程,接收到有关php时则交给apache模块处理
php错误处理,自动加载,以及栈堆内存和运行模式堆浅解 (转)的更多相关文章
- 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间
[源码下载] 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间 作者:webabcd 介绍速战速决 之 PHP 动态地创 ...
- CI框架 -- 自动加载资源
CodeIgniter 的"自动加载"特性可以允许系统每次运行时自动初始化类库.辅助函数和模型. 如果你需要在整个应用程序中全局使用某些资源,为方便起见可以考虑自动加载它们. 支持 ...
- php -- 魔术方法 之 自动加载:__autoload()
自动加载类 背景: 很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本开头写一个长长的包含文件列表(每个类一个文件). 在 PHP 5 中,不再需 ...
- PHP 自动加载类
类的自动加载 (Autoloading Classes) 在编写面向对象(OOP) 程序时,很多开发者为每个类新建一个 PHP 文件. 这会带来一个烦恼:每个脚本的开头,都需要包含(include)一 ...
- php克隆 自动加载
PHP加载 include() 函数 include() 函数可获得指定文件中的所有文本,并把文本拷贝到使用 include 函数的文件中. 例子 1 假设您拥有一个标准的页眉文件,名为 " ...
- Phalcon自动加载(PHP自动加载)
自动加载(phalcon\Loader) 转载请注明来源 一.php文件引入 通过 include() 或 require() 函数,可以在PHP程序执行之前在该文件中插入一个文件的内容. 区别:处理 ...
- thinkphp5源码剖析系列1-类的自动加载机制
前言 tp5想必大家都不陌生,但是大部分人都停留在应用的层面,我将开启系列随笔,深入剖析tp5源码,以供大家顺利进阶.本章将从类的自动加载讲起,自动加载是tp框架的灵魂所在,也是成熟php框架的必备功 ...
- Composer概述及其自动加载探秘
composer概述 一开始,最吸引我的当属 Composer 了,因为之前从没用过 Composer . Composer 是PHP中用来管理依赖关系的工具,你只需在自己的项目中声明所依赖的外部工具 ...
- 让Lua自己把文件夹下面的所有文件自动加载起来吧
没有想到我也做了一回标题党.其实这里边说的自动还是有夸大其词的部分.其实只是指定文件夹,然后根据指定文件夹数据,加载目录下边的内容而已. 怎么来进行Lua文件的加载 一般情况下,相关的功能需要给他创建 ...
随机推荐
- MyBatis 动态SQL(十二)
动态条件查询 以下是我们数据库表 tb_user 的记录: 假设现在有一个需求,就是根据输入的用户年龄和性别,查询用户的记录信息.你可能会说,这太简单了,脑袋里立马蹦出如下的 SQL 语句: SELE ...
- Jmeter(四十六) - 从入门到精通高级篇 - Jmeter之网页图片爬虫-下篇(详解教程)
1.简介 上一篇介绍了爬取文章,这一篇宏哥就简单的介绍一下,如何爬取图片然后保存到本地电脑中.网上很多漂亮的壁纸或者是美女.妹子,想自己收藏一些,挨个保存太费时间,那你可以利用爬虫然后批量下载. 2. ...
- SqlServer事务详解(事务隔离性和隔离级别详解)
概述 不少人对于事务的使用局限于begin transaction:开始事务.commit transaction:提交事务.rollback transaction:回滚事务的初步运用. 并且知道使 ...
- 90%的人都不知道的Node.js 依赖关系管理(下)
转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文参考:https://dzone.com/articles/node-dependency-manage ...
- 你是不是对MD5算法有误解?
大家常听到"MD5加密"."对称加密"."非对称加密",那么MD5属于哪种加密算法? 面试问这样的问题,准是在给你挖坑. "MD5 ...
- Step By Step(Lua弱引用table)
Step By Step(Lua弱引用table) Lua采用了基于垃圾收集的内存管理机制,因此对于程序员来说,在很多时候内存问题都将不再困扰他们.然而任何垃圾收集器都不是万能的,在有些特殊情况下,垃 ...
- LLD-LLVM链接器
LLD-LLVM链接器 LLD是LLVM项目中的链接器,是系统链接器的直接替代,并且运行速度比它们快得多.它还提供了对工具链开发人员有用的功能. 链接器按完整性降序支持ELF(Unix),PE / C ...
- Rethinking Training from Scratch for Object Detection
Rethinking Training from Scratch for Object Detection 一. 概述 正常训练目标检测的流程分为以下几种: 在imagenet上进行预训练,然后在特定 ...
- SpringBoot系列——admin服务监控
前言 springboot项目部署起来后,如何实时监控项目的运行状况呢?本文记录使用springboot-admin对服务进行监控. springboot-admin介绍:https://codece ...
- NX二次开发-矩阵乘矩阵的几何意义
函数:UF_MTX3_multiply() 或者UF_MTX3_multiply_t().推荐使用UF_MTX3_multiply() 函数说明:矩阵相乘,得到新的矩阵,如下图WCS与ABS重合,在暗 ...