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时间等,造成效能低下。

  1. 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)

  1. 4.Web模块模式(Apache等Web服务器运行的模式)

该模式是apache在cgi基础上的一个扩展

  1. 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错误处理,自动加载,以及栈堆内存和运行模式堆浅解 (转)的更多相关文章

  1. 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间

    [源码下载] 速战速决 (5) - PHP: 动态地创建属性和方法, 对象的复制, 对象的比较, 加载指定的文件, 自动加载类文件, 命名空间 作者:webabcd 介绍速战速决 之 PHP 动态地创 ...

  2. CI框架 -- 自动加载资源

    CodeIgniter 的"自动加载"特性可以允许系统每次运行时自动初始化类库.辅助函数和模型. 如果你需要在整个应用程序中全局使用某些资源,为方便起见可以考虑自动加载它们. 支持 ...

  3. php -- 魔术方法 之 自动加载:__autoload()

    自动加载类 背景: 很多开发者写面向对象的应用程序时对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本开头写一个长长的包含文件列表(每个类一个文件). 在 PHP 5 中,不再需 ...

  4. PHP 自动加载类

    类的自动加载 (Autoloading Classes) 在编写面向对象(OOP) 程序时,很多开发者为每个类新建一个 PHP 文件. 这会带来一个烦恼:每个脚本的开头,都需要包含(include)一 ...

  5. php克隆 自动加载

    PHP加载 include() 函数 include() 函数可获得指定文件中的所有文本,并把文本拷贝到使用 include 函数的文件中. 例子 1 假设您拥有一个标准的页眉文件,名为 " ...

  6. Phalcon自动加载(PHP自动加载)

    自动加载(phalcon\Loader) 转载请注明来源 一.php文件引入 通过 include() 或 require() 函数,可以在PHP程序执行之前在该文件中插入一个文件的内容. 区别:处理 ...

  7. thinkphp5源码剖析系列1-类的自动加载机制

    前言 tp5想必大家都不陌生,但是大部分人都停留在应用的层面,我将开启系列随笔,深入剖析tp5源码,以供大家顺利进阶.本章将从类的自动加载讲起,自动加载是tp框架的灵魂所在,也是成熟php框架的必备功 ...

  8. Composer概述及其自动加载探秘

    composer概述 一开始,最吸引我的当属 Composer 了,因为之前从没用过 Composer . Composer 是PHP中用来管理依赖关系的工具,你只需在自己的项目中声明所依赖的外部工具 ...

  9. 让Lua自己把文件夹下面的所有文件自动加载起来吧

    没有想到我也做了一回标题党.其实这里边说的自动还是有夸大其词的部分.其实只是指定文件夹,然后根据指定文件夹数据,加载目录下边的内容而已. 怎么来进行Lua文件的加载 一般情况下,相关的功能需要给他创建 ...

随机推荐

  1. spark-steaming的exactly-once

    spark实时计算中会存在数据丢失和数据重复计算的场景, 在receiver收到数据且通过driver的调度executor开始计算数据的时候如果driver突然崩溃,则此时executor就会被杀掉 ...

  2. Linux :忘记使用nohup该如何补救

    Linux :忘记使用nohup该如何补救 目录 Linux :忘记使用nohup该如何补救 0x00 摘要 0x01 问题描述 1.1 为何关闭进程 1.2 nohup 作用 0x02 简述 2.1 ...

  3. 【JVM进阶之路】十四:类加载器和类加载机制

    在上一章里,我们已经学习了类加载的过程,我们知道在加载阶段需要"通过一个类的全限定名来获取描述该类的二进制字节流",而来完成这个工作的就是类加载器(Class Loader). 1 ...

  4. NVIDIA 自动驾驶软件平台

    NVIDIA 自动驾驶软件平台 Software Developers using DRIVE AGX Developer Kits may choose between: DRIVE OS 5.2. ...

  5. 深度学习调用TensorFlow、PyTorch等框架

    深度学习调用TensorFlow.PyTorch等框架 一.开发目标目标 提供统一接口的库,它可以从C++和Python中的多个框架中运行深度学习模型.欧米诺使研究人员能够在自己选择的框架内轻松建立模 ...

  6. .NET平台系列14 .NET5中的新增功能

    系列目录     [已更新最新开发文章,点击查看详细] .NET5中不包含的内容 尽管 .NET5 框架中提供了一组重要 API,但它并不包括过去20年左右开发的所有 API,但是.NET Stand ...

  7. 读HikariCP源码学Java(二)—— 因地制宜的改装版ArrayList:FastList

    前言 如前文所述,HikariCP为了提高性能不遗余力,其中一个比较特别的优化是它没有直接使用ArrayList,而是自己实现了FastList,因地制宜,让数组的读写性能都有了一定程度的提高. 构造 ...

  8. 【Azure 机器人】微软Azure Bot 编辑器系列(1) : 创建一个天气对话机器人(The Bot Framework Composer tutorials)

    欢迎来到微软机器人编辑器使用教程,从这里开始,创建一个简单的机器人. 在该系列文章中,每一篇都将通过添加更多的功能来构建机器人.当完成教程中的全部内容后,你将成功的创建一个天气机器人(Weather ...

  9. JAVA微服务应用(1)--SpringBoot中的REST API调用(学习笔记)

    好长时间没有写学习小结了,最近宁正好看了小马哥的微服务系列之<Spring Boot>系列,颇有收获,并且公司也布置一个课题就是关于Spring中的REST API调用.于是乎回归本行,再 ...

  10. 「模拟8.29」chinese(性质)·physics·chemistry(概率期望)

    T1  chinese 根据他的问题i*f[i]我们容易联想到,答案其实是每种方案中每个点的贡献为1的加和 我们可以转变问题,每个点在所有方案的贡献 进而其实询问就是1-k的取值,有多少中方案再取个和 ...