1.display_errors()
错误回显,一般常用语开发模式,但是很多应用在正式环境中也忘记了关闭此选项。错误回显可以暴露出非常多的敏感信息,为攻击者下一步攻击提供便利。推荐关闭此选项。默认是不开启错误的,所以你需要配置php.ini文件或
ini_set( ‘display_errors’, ‘On’ );//显示所有错误信息
ini_set(‘display_errors’, ‘Off’ );//屏蔽所有错误信息
error_reporting(E_ALL & ~( E_WARNING | E_NOTICE | E_DEPRECATED)) //设置当前脚本的错误报告级别
值 常量 说明
1 E_ERROR 致命的运行时错误。 错误无法恢复过来。脚本的执行被暂停
2 E_WARNING 非致命的运行时错误。 脚本的执行不会停止
4 E_PARSE 编译时解析错误。解析错误应该只由分析器生成
8 E_NOTICE 运行时间的通知。
16 E_CORE_ERROR 在PHP启动时的致命错误。这就好比一个在PHP核心的E_ERROR
32 E_CORE_WARNING 在PHP启动时的非致命的错误。这就好比一个在PHP核心E_WARNING警告
64 E_COMPILE_ERROR 致命的编译时错误。 这就像由Zend脚本引擎生成了一个E_ERROR
128 E_COMPILE_WARNING 非致命的编译时错误,由Zend脚本引擎生成了一个E_WARNING警告
256 E_USER_ERROR 致命的用户生成的错误。
512 E_USER_WARNING 非致命的用户生成的警告。
1024 E_USER_NOTICE 用户生成的通知。
2048 E_STRICT 运行时间的通知。
4096 E_RECOVERABLE_ERROR 捕捉致命的错误。
8191 E_ALL 所有的错误和警告。
8192 E_DEPRECATED 运行时通知。启用后将会对在未来版本中可能无法正常工作的代码给出警告。
2.realpath()
realpath(dirname(__FILE__) //返回绝对路径。
该函数删除所有符号连接(比如 ‘/./’, ‘/…/’ 以及多余的 ‘/’),返回绝对路径名。
若失败,则返回 false。比如说文件不存在的话。
3.路径问题
$adpath = '.:';
$adpath .= APP_PATH . ':';
$adpath .= APP_PATH . '/Advertise/:';
$adpath .= APP_PATH . '/Advertise/Action:';
$adpath .= APP_PATH . '/Advertise/Action/adeng:';
$adpath .= APP_PATH . '/Advertise/Action/adeng/info:';
set_include_path($adpath);
在php中,include文件时, 当包含路径不为相对也不为绝对时(如:include(“example.php”)), 会先查找include_path所设置的目录,然后再在当前目录查找
4._autoload()自动去加载
假如我们的php文件需要包含的不只是类A,而是需要很多类,这样子就必须写很多行require语句
__autoload() 当使用尚未被定义的类(class)和接口(interface)时自动去加载
__autoload只是去include_path寻找类文件并加载
使用spl_autoload_register来注册我们自己的autoload函数
<?php
function __autoload($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}
$a = new A();
<?php
function loader($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}
spl_autoload_register('loader');
$a = new A();
function my_autoloader($class_name) {
global $adpath;
$apath = explode(':', $adpath);
foreach ($apath as $value) {
$action_file = $value . '/' . $class_name . '.class.php';
if (is_file($action_file)) {
require_cache($action_file); / /require语句
return;
}
}
}
spl_autoload_register('my_autoloader');
5.php://input
$data = file_get_contents("php://input");
php://input
可以读取没有处理过的POST数据。
相较于$HTTP_RAW_POST_DATA
而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置。
php://input
不能用于enctype=multipart/form-data
file_get_contents()
把整个文件读入一个字符串中
Coentent-Type
仅在取值为application/x-www-data-urlencoded
和multipart/form-data
两种情况下,PHP才会将http请求数据包中相应的数据填入全局变量$_POST
- PHP不能识别的
Content-Type
类型的时候,会将http请求包中相应的数据填入量$HTTP_RAW_POST_DATA
- 只有
Coentent-Type
不为multipart/form-data
的时候,PHP不会将http请求数据包中的相应数据填入php://input
,否则其它情况都会。填入的长度,由Coentent-Length
指定。 - 只有
Content-Type
为application/x-www-data-urlencoded
时,php://input
数据才跟$_POST数据相一致。 php://input
数据总是跟$HTTP_RAW_POST_DATA
相同,但是php://input
比$HTTP_RAW_POST_DATA
更凑效,且不需要特殊设置php.ini- PHP会将PATH字段的
query_path
部分,填入全局变量$_GET
。通常情况下,GET方法提交的http请求,body为空。
pack //把数据装入一个二进制字符串
unpack //从二进制字符串对数据进行解包
a -- 将字符串空白以 NULL 字符填满
A -- 将字符串空白以 SPACE 字符 (空格) 填满
h -- 16进制字符串,低位在前以半字节为单位
H -- 16进制字符串,高位在前以半字节为单位
c -- 有符号字符
C -- 无符号字符
s -- 有符号短整数 (16位,主机字节序)
S -- 无符号短整数 (16位,主机字节序)
n -- 无符号短整数 (16位, 大端字节序)
v -- 无符号短整数 (16位, 小端字节序)
i -- 有符号整数 (依赖机器大小及字节序)
I -- 无符号整数 (依赖机器大小及字节序)
l -- 有符号长整数 (32位,主机字节序)
L -- 无符号长整数 (32位,主机字节序)
N -- 无符号长整数 (32位, 大端字节序)
V -- 无符号长整数 (32位, 小端字节序)
f -- 单精度浮点数 (依计算机的范围)
d -- 双精度浮点数 (依计算机的范围)
x -- 空字节
X -- 倒回一位
@ -- 填入 NULL 字符到绝对位置
7.header
功能:发送一个自定义的http报文。
请注意一点,header()必须在任何实际输出之前调用,不管是普通的html标签,还是文件里面的空行,空格或者是PHP文件里的空行,空格。这是一个非常普遍的错误,在通过include,require,或者其访问其他文件里面的函数时,如果在header()被调用之前,其中有空格或空行。如果不是调用其他文件,仅仅是单独使用一个php或者HTML文件,在header()被调用之前有输出也会出错。
参数说明:
string 报文字符串
replace 如果为true,表示后面一个相同类型的报文信息来取代前面一个相似的报文信息。默认为true,如果设为false,可以强制使相同的报文信息并存。
http_response_code 强制指定HTTP响应的值。注意,这个参数只有在报文字符串(string)不为空的情况下才有效。
header_remove
功能:移除某个header输出
参数说明:
name 要移除的header name
header_remove('Cache-Control'); //指定所有缓存机制在整个请求/响应链中必须服从的指令
/*
* Expires是RFC 2616(HTTP/1.0)协议中和网页缓存相关字段。
* 用来控制缓存的失效日期,
* 要注意的是,HTTP/1.0有一个功能比较弱的缓存控制机制:Pragma,
* 使用HTTP/1.0的缓存将忽略Expires和Cache-Control头
* */
header_remove('Expires');
header_remove('Set-Cookie');
header_remove('Pragma');
header('Date:');
header('Server:');
/*
* application/octet-stream
* 只能提交二进制,而且只能提交一个二进制,
* 如果提交文件的话,只能提交一个文件,
* 后台接收参数只能有一个,而且只能是流(或者字节数组)
* */
header('Content-Type: application/octet-stream');
/*
* Content-Length
* 描述HTTP消息实体的传输长度
* */
header("Content-Length: " . $len);
8.压缩函数:gzcompress gzdeflate gzencode
解压函数:gzuncompress gzinflate gzdecode
gzdecode是PHP 5.4.0之后才加入的,使用的时候要注意兼容性问题。
gzcompress gzdeflate gzencode函数的区别在于它们压缩的数据格式不同:
gzcompress使用的是ZLIB格式;
gzdeflate使用的是纯粹的DEFLATE格式;
gzencode使用的是GZIP格式;
json_decode — 对 JSON 格式的字符串进行编码
说明
mixed json_decode ( string $json [, bool $assoc ] )
接受一个 JSON 格式的字符串并且把它转换为 PHP 变量
参数
json
待解码的 json string 格式的字符串。
assoc
当该参数为 TRUE 时,将返回 array 而非 object 。
json_encode — 对变量进行 JSON 编码
Report a bug 说明
string json_encode ( mixed $value [, int $options = 0 ] )
返回 value 值的 JSON 形式
Report a bug 参数
value
待编码的 value ,除了resource 类型之外,可以为任何数据类型
该函数只能接受 UTF-8 编码的数据
options
由以下常量组成的二进制掩码: JSON_HEX_QUOT, JSON_HEX_TAG, JSON_HEX_AMP, JSON_HEX_APOS, JSON_NUMERIC_CHECK, JSON_PRETTY_PRINT, JSON_UNESCAPED_SLASHES, JSON_FORCE_OBJECT, JSON_UNESCAPED_UNICODE.
10.geoip_country_code_by_name ( string $hostname )
return the two letter country code corresponding to a hostname or an IP address.
<?php
$country = geoip_country_code_by_name('www.example.com');
if ($country) {
echo 'This host is located in: ' . $country;
}
?>
//This host is located in: US
11.$_SERVER
页面程序相关
$_SERVER['PHP_SELF']:相对于网站根目录的路径及 PHP 程序名称,与 document root 相关。
$_SERVER['HTTP_REFERER']:链接到当前页面的前一页面的 URL 地址。
$_SERVER['SCRIPT_NAME']:相对于网站根目录的路径及 PHP 程序文件名称 。
$_SERVER['REQUEST_URI']:访问此页面所需的 URI 。
$_SERVER['SCRIPT_FILENAME']:当前运行 PHP 程序的绝对路径及文件名。
$_SERVER['PATH_TRANSLATED']:当前 PHP 程序所在文件系统(不是文档根目录)的基本路径。
$_SERVER['QUERY_STRING']:查询(query)的字符串(URL 中第一个问号 ? 之后的内容但不包括 # 后面的内容)。
$_SERVER['argv']:传递给当前 PHP 程序的参数。
$_SERVER['argc']:命令行模式下,包含传递给程序的命令行参数的个数。
$_SERVER['REQUEST_TIME']:请求开始时的时间戳,从 PHP 5.1.0 起有效。
$_SERVER['REQUEST_METHOD']:访问页面时的请求方法,例如:“GET”、“HEAD”,“POST”或“PUT”。
$_SERVER['HTTP_ACCEPT']:当前请求的 Accept: 头信息的内容。
$_SERVER['HTTP_ACCEPT_CHARSET']:当前请求的 Accept-Charset: 头信息的内容。例如:“iso-8859-1,*,utf-8”。
$_SERVER['HTTP_ACCEPT_ENCODING']:当前请求的 Accept-Encoding: 头信息的内容。例如:“gzip”。
$_SERVER['HTTP_ACCEPT_LANGUAGE']:当前请求的 Accept-Language: 头信息的内容。例如:“zh-cn”。
$_SERVER['HTTP_CONNECTION']:当前请求的 Connection: 头信息的内容。例如:“Keep-Alive”。
$_SERVER['HTTP_HOST']:当前请求的 Host: 头信息的内容。
$_SERVER['HTTPS']:如果 PHP 程序是通过 HTTPS 协议被访问,则被设为一个非空的值。
$_SERVER['PHP_AUTH_DIGEST']:当作为 Apache 模块运行时,进行 HTTP Digest 认证的过程中,此变量被设置成客户端发送的“Authorization”HTTP 头内容(以便作进一步的认证操作)。
$_SERVER['PHP_AUTH_USER']:当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的用户名。
$_SERVER['PHP_AUTH_PW']:当 PHP 运行在 Apache 或 IIS(PHP 5 是 ISAPI)模块方式下,并且正在使用 HTTP 认证功能,这个变量便是用户输入的密码。
$_SERVER['AUTH_TYPE']:当 PHP 运行在 Apache 模块方式下,并且正在使用 HTTP 认证功能,这个变量便是认证的类型。
服务器端相关
$_SERVER['DOCUMENT_ROOT']:当前运行 PHP 程序所在的文档根目录,在服务器配置文件中定义。
$_SERVER['GATEWAY_INTERFACE']:服务器使用的 CGI 规范的版本,例如:“CGI/1.1”。
$_SERVER['SERVER_ADDR']:当前运行 PHP 程序所在的服务器的 IP 地址。
$_SERVER['SERVER_NAME']:当前运行 PHP 程序所在的服务器的名称。
$_SERVER['SERVER_ADMIN']:Apache 服务器配置文件中的 SERVER_ADMIN 参数。
$_SERVER['SERVER_PORT']:服务器所使用的端口。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。
$_SERVER['SERVER_SIGNATURE']:包含服务器版本和虚拟主机名的字符串。
$_SERVER['SERVER_SOFTWARE']:服务器标识的字串,在响应请求时的头信息中给出。
$_SERVER['SERVER_PROTOCOL']:请求页面时通信协议的名称和版本,例如:“HTTP/1.0”。
其他杂项
$_SERVER['HTTP_USER_AGENT']:当前请求的 User-Agent: 头信息的内容,该字符串表明了访问该页面的用户代理的信息。
$_SERVER['REMOTE_ADDR']:正在浏览当前页面用户的 IP 地址。
$_SERVER['REMOTE_HOST']:正在浏览当前页面用户的主机名。
$_SERVER['REMOTE_PORT']:用户连接到服务器时所使用的端口。