php基础
PHP
PHP 安装及扩展
php安装参数
./configure
–prefix=/usr/local/php php 安装目录
–with-apxs2=/usr/local/apache/bin/apxs
–with-config-file-path=/usr/local/php/etc 指定php.ini位置
–with-mysql=/usr/local/mysql mysql安装目录,对mysql的支持
–with-mysqli=/usr/local/mysql/bin/mysql_config mysqli文件目录,优化支持
–enable-safe-mode 打开安全模式
–enable-ftp 打开ftp的支持
–enable-zip 打开对zip的支持
–with-bz2 打开对bz2文件的支持
–with-jpeg-dir 打开对jpeg图片的支持
–with-png-dir 打开对png图片的支持
–with-freetype-dir 打开对freetype字体库的支持
–without-iconv 关闭iconv函数,种字符集间的转换
–with-libxml-dir 打开libxml2库的支持
–with-xmlrpc 打开xml-rpc的c语言
–with-zlib-dir 打开zlib库的支持
–with-gd 打开gd库的支持
–enable-gd-native-ttf 支持TrueType字符串函数库
–with-curl 打开curl浏览工具的支持
–with-curlwrappers 运用curl工具打开url流
–with-ttf 打开freetype1.*的支持,可以不加了
–with-xsl 打开XSLT 文件支持,扩展了libxml2库 ,需要libxslt软件
–with-gettext 打开gnu 的gettext 支持,编码库用到
–with-pear 打开pear命令的支持,php扩展用的
–enable-calendar 打开日历扩展功能
–enable-mbstring 多字节,字符串的支持
–enable-bcmath 打开图片大小调整,用到zabbix监控的时候用到了这个模块
–enable-sockets 打开 sockets 支持
–enable-exif 图片的元数据支持
–enable-magic-quotes 魔术引用的支持
–disable-rpath 关闭额外的运行库文件
–disable-debug 关闭调试模式
–with-mime-magic=/usr/share/file/magic.mime 魔术头文件位置
cgi方式安装才用的参数
–enable-fpm 打上php-fpm 补丁后才有这个参数,cgi方式安装的启动程序
–enable-fastcgi 支持fastcgi方式启动php
–enable-force-cgi-redirect 同上 ,帮助里没有解释
–with-ncurses 支持ncurses 屏幕绘制以及基于文本终端的图形互动功能的动态库
–enable-pcntl freeTDS需要用到的,可能是链接mssql 才用到
mhash和mcrypt算法的扩展
–with-mcrypt 算法
–with-mhash 算法
–with-gmp
–enable-inline-optimization
–with-openssl openssl的支持,加密传输时用到的
–enable-dbase
–with-pcre-dir=/usr/local/bin/pcre-config perl的正则库案安装位置
–disable-dmalloc
–with-gdbm dba的gdbm支持
–enable-sigchild
–enable-sysvsem
–enable-sysvshm
–enable-zend-multibyte 支持zend的多字节
–enable-mbregex
–enable-wddx
–enable-shmop
–enable-soap
PHP配置选项完整列表
数据库选项
–with-dbplus
包括 dbplus 的支持。
–with-adabas[=DIR]
包括 Adabas D 的支持。DIR 是 Adabas 的基本安装目录,默认为 /usr/local。
–with-sapdb[=DIR]
包括 SAP DB 的支持。DIR 是 SAP DB 的基本安装目录,默认为 /usr/local。
–with-solid[=DIR]
包括 Solid 的支持。DIR 是 Solid 的基本安装目录,默认为 /usr/local/solid。
–with-ibm-db2[=DIR]
包括 IBM DB2 的支持。DIR 是 DB2 的基本安装目录,默认为 /home/db2inst1/sqllib。
–with-empress[=DIR]
包括 Empress 的支持。DIR 是 Empress 的基本安装目录,默认为 $EMPRESSPATH。自 PHP4 起,本选项仅支持 Empress 8.60 及以上版本。
–with-empress-bcs[=DIR]
包括 Empress Local Access 的支持。DIR 是 Empress 的基本安装目录,默认为 $EMPRESSPATH。自 PHP4 起,本选项仅支持 Empress 8.60 及以上版本。
–with-birdstep[=DIR]
包括 Birdstep 的支持。DIR 是 Birdstep 的基本安装目录,默认为 /usr/local/birdstep。
–with-custom-odbc[=DIR]
包 括用户自定义 ODBC 的支持。DIR 是 ODBC 的基本安装目录,默认为 /usr/local。要确认定义了 CUSTOM_ODBC_LIBS 并且在 include 目录中有某个 odbc.h。例如,对于 QNX 下的 Sybase SQL Anywhere 5.5.00,在运行 configure 脚本之前应该先定义以下环境变量: CPPFLAGS=”-DODBC_QNX -DSQLANY_BUG” LDFLAGS=-lunix CUSTOM_ODBC_LIBS=”-ldblib -lodbc”.
–with-iodbc[=DIR]
包括 iODBC 的支持。DIR 是 iODBC 的基本安装目录,默认为 /usr/local。
–with-esoob[=DIR]
包括 Easysoft OOB 的支持。DIR 是 OOB 的基本安装目录,默认为 /usr/local/easysoft/oob/client。
–with-unixODBC[=DIR]
包括 unixODBC 的支持。DIR 是 unixODBC 的基本安装目录,默认为 /usr/local。
–with-openlink[=DIR]
包括 OpenLink ODBC 的支持。DIR 是 OpenLink 的基本安装目录,默认为 /usr/local。这和 iODBC 一样。
–with-dbmaker[=DIR]
包括 DBMaker 的支持。DIR 是 DBMaker 的基本安装目录,默认为最新版 DBMaker 安装的目录(例如 /home/dbmaker/3.6)。
–disable-unified-odbc
取消对 unified ODBC 的支持。仅适用于激活了 iODBC,Adabas,Solid,Velocis 或用户自定义 ODBC 界面。仅能用于 PHP 3!
图像选项
–without-gd
禁用 GD 支持。仅用于 PHP 3!
–with-imagick
Imagick 扩展被移到 PEAR 中的 PECL 中去了,可以在这里找到。PHP 4 中的安装指示可以在 PEAR 站点中找到。
只用 –with-imagick 仅在 PHP 3 中支持,除非依照 PEAR 站点的指示去做。
–with-ming[=DIR]
包括 ming 支持。
杂类选项
–enable-force-cgi-redirect
激活服务器内部重定向的安全检查。如果是在 Apache 中以 CGI 方式使用 PHP 则应该使用此选项。
–enable-discard-path
使用此选项可以使 PHP 的 CGI 可执行程序安全地放置在 web 目录树以外的地方,并且别人也不能绕过 .htaccess 的安全设置。
–with-fastcgi
将 PHP 编译成 FastCGI 应用程序。
–enable-debug
编译时加入调试符号。
–with-layout=TYPE
设置安装后的文件布局。TYPE 可以是 PHP(默认值)或者 GNU。
–with-pear=DIR
将 PEAR 安装在 DIR 目录中(默认为 PREFIX/lib/php)。
–without-pear
不安装 PEAR。
–enable-sigchild
激活 PHP 自己的 SIGCHLD 句柄。
–disable-rpath
禁止传递附加的运行时库搜索路径。
–enable-libgcc
激活显式 libgcc 连接。
–enable-php-streams
包含试验的 PHP 流。除非是测试源代码,否则不要使用!
–with-zlib-dir=
;
定义 zlib 的安装路径。
–with-aspell[=DIR]
包含 ASPELL 支持。
–with-ccvs[=DIR]
包含 CCVS 支持。
–with-cybercash[=DIR]
包含 CyberCash 支持。DIR 是 CyberCash MCK 的安装目录。
–with-icap[=DIR]
包含 ICAP 支持。
–with-ircg-config
ircg-config 脚本的路径。
–with-ircg
包含 ircg 支持。
–enable-mailparse
包含 mailparse 支持。
–with-muscat[=DIR]
包含 muscat 支持。
–with-satellite[=DIR]
激活通过 Satellite(试验性质)的 CORBA 支持。DIR 是 ORBit 的主目录。
–enable-trans-sid
激活透明的 session id 传播。
–with-regex[=TYPE]
使用系统 regex 库(不赞成)。
–with-vpopmail[=DIR]
包含 vpopmail 支持。
–with-tsrm-pthreads
使用 POSIX 线程(默认值)。
–enable-shared[=PKGS]
编译共享库 [default=yes]。
–enable-static[=PKGS]
编译静态库 [default=yes]。
–enable-fast-install[=PKGS]
为快速安装而优化 [default=yes]。
–with-gnu-ld
假定 C 编译器使用 GNU ld [default=no]。
–disable-libtool-lock
避免锁死(可能会破坏并行编译)。
–with-pic
尝试只使用 PIC/non-PIC 对象 [default=use both]。
–enable-memory-limit
编译时加入内存限制支持。
–disable-url-fopen-wrapper
禁止通过 URL 的 fopen wrapper,不能通过 HTTP 或 FTP 访问文件。
–enable-versioning
仅输出所需要的符号。更多信息见 INSTALL 文件。
–with-imsp[=DIR]
包含 IMSp 支持(DIR 是 IMSP 的 include 目录和 libimsp.a 目录)。仅用于 PHP 3!
–with-mck[=DIR]
包含 Cybercash MCK 支持。DIR 是 cybercash mck 编译目录,默认为 /usr/src/mck-3.2.0.3-linux。帮助见 extra/cyberlib。仅用于 PHP 3!
–with-mod-dav=DIR
包含通过 Apache 的 mod_dav 的 DAV 支持。DIR 是 mod_dav 的安装目录(仅用于 Apache 模块版本!)仅用于 PHP 3!
–enable-debugger
编译入远程调试函数。仅用于 PHP 3!
–enable-versioning
利用 Solaris 2.x 和 Linux 提供的版本控制与作用范围的优势。仅用于 PHP 3!
PHP 选项
–enable-maintainer-mode
激活将编译规则和未使用的(以及一些混淆的)依赖文件放入临时安装中。
–with-config-file-path=PATH
设定 php.ini 所在的路径,默认为 PREFIX/lib。
–enable-safe-mode
默认激活安全模式。
–with-exec-dir[=DIR]
安全模式下只允许此目录下执行程序。默认为 /usr/local/php/bin。
–enable-magic-quotes
默认激活 magic quotes。
–disable-short-tags
默认禁止简写的 PHP 开始标记 <?。
服务器选项
–with-aolserver=DIR
指定已安装的 AOLserver 的路径。
–with-apxs[=FILE]
编译共享 Apache 模块。FILE 是可选的 Apache 的 apxs 工具的路径,默认为 apxs。确保指定的 apxs 版本是安装后的文件而不是 Apache 源程序中包中的。
–with-apache[=DIR]
编译 Apache 模块。DIR 是 Apache 源程序的最高一级目录。默认为 /usr/local/apache。
–with-mod_charset
激活 mod_charset 中的传递表(Apache 中)。
–with-apxs2[=FILE]
编译共享的 Apache 2.0 模块。FILE 是可选的 Apache 的 apxs 工具的路径,默认为 apxs。
–with-fhttpd[=DIR]
编译 fhttpd 模块。DIR 是 fhttpd 的源代码路径,默认为 /usr/local/src/fhttpd。
–with-isapi=DIR
将 PHP 编译为 ISAPI 模块用于 Zeus。
–with-nsapi=DIR
指定已安装的 Netscape 服务器路径。
–with-phttpd=DIR
暂无信息。
–with-pi3web=DIR
将 PHP 编译为用于 Pi3Web 的模块。
–with-roxen=DIR
将 PHP 编译为一个 Pike 模块。DIR 是 Roxen 的根目录,通常为 /usr/local/roxen/server。
–enable-roxen-zts
编译 Roxen 模块,使用 Zend Thread Safety。
–with-servlet[=DIR]
包含 servlet 支持。DIR 是 JSDK 的基本安装目录。本 SAPI 需要 java 扩展必须被编译为共享的 dl。
–with-thttpd=SRCDIR
将 PHP 编译为 thttpd 模块。
–with-tux=MODULEDIR
扩展编译安装
php编译安装
$ cd extname
$ phpize
$ ./configure
$ make
php.ini 配置选项
- 配置选项
名字 | 默认 | 备注 |
---|---|---|
short_open_tag | “1” | 是否开启缩写形式(<? ?> ) |
precision | “14” | 浮点数中显示有效数字的位数 |
disable_functions | “” | 禁止某些函数 |
disable_classes | “” | 禁用某些类 |
expose_php | “” | 是否暴露 PHP 被安装在服务器上 |
max_execution_time | 30 | 最大执行时间 |
memory_limit | 128M | 每个脚本执行的内存限制 |
error_reporting | NULL | 设置错误报告的级别 E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED |
display_errors | “1” | 显示错误 |
log_errors | “0” | 设置是否将错误日志记录到 error_log 中 |
error_log | NULL | 设置脚本错误将被记录到的文件 |
upload_max_filesize | “2M” | 最大上传文件大小 |
post_max_size | “8M” | 设置POST最大数据限制 |
php -ini | grep short_open_tag //查看 php.ini 配置
- 动态设置
ini_set(string $varname , string $newvalue);
ini_set(‘date.timezone’, ‘Asia/Shanghai’); //设置时区
ini_set(‘display_errors’, ‘1’); //设置显示错误
ini_set(‘error_reporting’, E_ALL); //设置日志输出级别
ini_set(‘memory_limit’, ‘256M’); //设置最大内存限制
php-fpm.conf 配置
名称 | 默认 | 备注 |
---|---|---|
pid | PID文件的位置 | |
error_log | 错误日志的位置 | |
log_level | notice | 错误级别 alert:必须立即处理、error:错误情况、warning:警告情况、notice:一般重要信息、debug:调试信息 |
daemonize | yes | 设置 FPM 在后台运行 |
listen | ip:port、port、/path/to/unix/socket | 设置接受 FastCGI 请求的地址 |
pm | static、ondemand、dynamic | 设置进程管理器如何管理子进程 |
request_slowlog_timeout | ‘0’ | 慢日志记录阀值 |
slowlog | 慢请求的记录日志 |
php
PSR 标准规范
PSR-1 基本的代码风格
编码:
所有PHP文件都必须使用UTF-8字符集编码。
自动加载:
PHP命名空间和类必须遵守PSR-4自动加载器标准。
类的名称:
PHP类的名称使用驼峰式。
常量的名称:
PHP常量的名称必须全部使用大写。
方法的名称:
PHP方法的名称必须一直使用驼峰式。
PSR-4 自动加载
spl_autoload_register 实现自动加载未定义类功能的的
<?php
spl_autoload_register(function ($class)) {
// 命名空间的前缀
$prefix = ‘mysqlapp’;
// 这个命名空间对应的基目录
$base_dir = DIR.’/src/‘;
// 获取传入的类名,是否使用的是这个命名空间前缀
$len = strlen($prefix);
// 不使用,交给注册的下一个自动加载器处理
if (strncmp($class,$prefix,$len) !== 0) {
return;
}
// 获取去掉前缀后的类名
$relative_class = substr($class,$len);
// 把命名空间前缀换成基目录,将命名空间的分隔符替换成目录分隔符,然后加上.php文件的后缀。
$file = $base_dir . str_replace(‘\‘,’/‘,$relative_class).’.php’;
// 如果文件存在,将其导入。
if (file_exitst($file)) {
require $file;
}
}
CGI 、FAST_CGI 、PHP_FPM
CGI 、FAST_CGI 、PHP_FPM
CGI运行模式
CGI即通用网关接口(Common Gateway Interface),它是一段程序,通俗的讲CGI就象是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执行程序,再把服务器执行程序的结果返还给HTML页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。
CGI方式在遇到连接请求(用户 请求)先要创建cgi的子进程,激活一个CGI进程,然后处理请求,处理完后结束这个子进程。这就是fork-and-execute模式。所以用cgi方式的服务器有多少连接请求就会有多少cgi子进程,子进程反复加载是cgi性能低下的主要原因。都会当用户请求数量非常多时,会大量挤占系统的资源如内 存,CPU时间等,造成效能低下。
Fast-CGI运行模式
fast-cgi 是cgi的升级版本,FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全称PHP FastCGI进程管理器进行管理。
FastCGI的工作原理
1、Web Server启动时载入FastCGI进程管理器(IIS ISAPI或Apache Module)
2、FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可见多个php-cgi)并等待来自Web Server的连接。
3、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
4、 FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。
在上述情况中,你可以想象CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的 好处是,持续数据库连接(Persistent database connection)可以工作。
cli运行模式
cli是php的命令行运行模式,大家经常会使用它,但是可能并没有注意到(例如:我们在linux下经常使用 “php -m”查找PHP安装了那些扩展就是PHP命令行运行模式;有兴趣的同学可以输入php -h去深入研究该运行模式)
可变参数 …
使用 … 运算符定义变长参数函数 , 现在可以不依赖 func_get_args(), 使用 … 运算符 来实现 变长参数函数。
function f($req, $opt = null, …$params) {
// $params 是一个包含了剩余参数的数组
printf(‘$req: %d; $opt: %d; number of params: %d’.”\n”, $req, $opt, count($params));
}
f(1); # opt: 0; number of params: 0
f(1, 2); # opt: 2; number of params: 0
f(1, 2, 3); # opt: 2; number of params: 1
f(1, 2, 3, 4); # opt: 2; number of params: 2
f(1, 2, 3, 4, 5); # opt: 2; number of params: 3
垃圾回收机制
引用计数器
php5与php7之间的区别
1、性能提升:PHP7比PHP5.0性能提升了两倍。
2、以前的许多致命错误,现在改成抛出异常。
3、PHP 7.0比PHP5.0移除了一些老的不在支持的SAPI(服务器端应用编程端口)和扩展。
4、PHP 7.0比PHP5.0新增了空接合操作符。
5、PHP 7.0比PHP5.0新增加了结合比较运算符。
6、PHP 7.0比PHP5.0新增加了函数的返回类型声明。
7、PHP 7.0比PHP5.0新增加了标量类型声明。
8、PHP 7.0比PHP5.0新增加匿名类。
反射详解
数组
排序函数
函数名称 | 排序依据 | 数组索引健保持 | 排序的顺序 | 相关函数 |
---|---|---|---|---|
array_multisort() | 值 | 键值关联的保持,数字类型的不保持 | 第一个数组或者由选项指定 | array_walk() |
asort() | 值 | 是 | 由低到高 | arsort() |
arsort() | 值 | 是 | 由高到低 | asort() |
krsort() | 键 | 是 | 由高到低 | ksort() |
ksort() | 键 | 是 | 由低到高 | asort() |
natcasesort() | 值 | 是 | 自然排序,大小写不敏感 | natsort() |
natsort() | 值 | 是 | 自然排序 | natcasesort() |
rsort() | 值 | 否 | 由高到低 | sort() |
shuffle() | 值 | 否 | 随机 | array_rand() |
sort() | 值 | 否 | 由低到高 | rsort() |
uasort() | 值 | 是 | 由用户定义 | uksort() |
uksort() | 键 | 是 | 由用户定义 | uasort() |
usort() | 值 | 否 | 由用户定义 | uasort() |
数组函数
array_change_key_case — 将数组中的所有键名修改为全大写或小写
array_chunk — 将一个数组分割成多个
array_column — 返回数组中指定的一列
array_combine — 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
array_count_values — 统计数组中所有的值
array_diff_assoc — 带索引检查计算数组的差集
array_diff_key — 使用键名比较计算数组的差集
array_diff_uassoc — 用用户提供的回调函数做索引检查来计算数组的差集
array_diff_ukey — 用回调函数对键名比较计算数组的差集
array_diff — 计算数组的差集
array_fill_keys — 使用指定的键和值填充数组
array_fill — 用给定的值填充数组
array_filter — 用回调函数过滤数组中的单元
array_filter() — 用回调函数过滤数组中的单元
$a1 = array(“a”,”b”,2,3,4);
$return = array_filter($a1 , function($var){return($var & 1);
});
array_flip — 交换数组中的键和值
array_intersect_assoc — 带索引检查计算数组的交集
array_intersect_key — 使用键名比较计算数组的交集
array_intersect_uassoc — 带索引检查计算数组的交集,用回调函数比较索引
array_intersect_ukey — 用回调函数比较键名来计算数组的交集
array_intersect — 计算数组的交集
array_key_exists — 检查数组里是否有指定的键名或索引
array_key_first — Gets the first key of an array
array_key_last — Gets the last key of an array
array_keys — 返回数组中部分的或所有的键名
array_map — 为数组的每个元素应用回调函数
array_map() 函数将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新的值的数组。
方法一
function myfunction($v)
{return($v*$v);
}
$a=array(1,2,3,4,5);
$return = array_map(“myfunction”,$a);方法二
对$a中每个元素进行平方
$return = array_map(function($v){
return($v*$v);
},$a);
array_merge_recursive — 递归地合并一个或多个数组
array_merge — 合并一个或多个数组
array_multisort — 对多个数组或多维数组进行排序
// 假设, $arr 是一个二维数组, $arg1是取出的字段1, $arg2是取出的字段2, 需要多少个字段拿多少个! // 先用 内置函数 array_column 取出其中一个字段 array_multisort(array_column($arr, $arg1), SORT_ASC, array_column($arr, $arg2), SORT_DESC, $arr);
array_pad — 以指定长度将一个值填充进数组
array_pop — 弹出数组最后一个单元(出栈)
array_product — 计算数组中所有值的乘积
array_push — 将一个或多个单元压入数组的末尾(入栈)
array_rand — 从数组中随机取出一个或多个单元
array_reduce — 用回调函数迭代地将数组简化为单一的值
array_replace_recursive — 使用传递的数组递归替换第一个数组的元素
array_replace — 使用传递的数组替换第一个数组的元素
array_reverse — 返回单元顺序相反的数组
array_search — 在数组中搜索给定的值,如果成功则返回首个相应的键名
array_shift — 将数组开头的单元移出数组
array_slice — 从数组中取出一段
array_splice — 去掉数组中的某一部分并用其它值取代
array_sum — 对数组中所有值求和
array_udiff_assoc — 带索引检查计算数组的差集,用回调函数比较数据
array_udiff_uassoc — 带索引检查计算数组的差集,用回调函数比较数据和索引
array_udiff — 用回调函数比较数据来计算数组的差集
array_uintersect_assoc — 带索引检查计算数组的交集,用回调函数比较数据
array_uintersect_uassoc — 带索引检查计算数组的交集,用单独的回调函数比较数据和索引
array_uintersect — 计算数组的交集,用回调函数比较数据
array_unique — 移除数组中重复的值
array_unshift — 在数组开头插入一个或多个单元
array_values — 返回数组中所有的值
array_walk_recursive — 对数组中的每个成员递归地应用用户函数
array_walk — 使用用户自定义函数对数组中的每个元素做回调处理
compact — 建立一个数组,包括变量名和它们的值
count — 计算数组中的单元数目,或对象中的属性个数
current — 返回数组中的当前单元
each — 返回数组中当前的键/值对并将数组指针向前移动一步
end — 将数组的内部指针指向最后一个单元
extract — 从数组中将变量导入到当前的符号表
in_array — 检查数组中是否存在某个值
krsort — 对数组按照键名逆向排序
ksort — 对数组按照键名排序
list — 把数组中的值赋给一组变量
-next — 将数组中的内部指针向前移动一位
pos — current 的别名
prev — 将数组的内部指针倒回一位
range — 根据范围创建数组,包含指定的元素
reset — 将数组的内部指针指向第一个单元
rsort — 对数组逆向排序
shuffle — 打乱数组
echo、print、print_r、var_dump 区别
echo和print是语言结构、print_r和var_dump是普通函数
echo:输出一个或多个字符串
print:输出字符串
print_r:打印关于变量的易于理解的信息
var_dump:打印关于变量的易于理解的信息(带类型)
单引号和双引号的区别
双引号可以被分析器解析,单引号则不行
isset 和 empty 的区别
isset:检测变量是否已设置并且非 NULL
empty:判断变量是否为空,变量为 0/false 也会被认为是空;变量不存在,不会产生警告
include、require、include_once、require_once 的区别
require 和 include 几乎完全一样,除了处理失败的方式不同之外。require 在出错时产生 E_COMPILE_ERROR 级别的错误。换句话说将导致脚本中止而 include 只产生警告(E_WARNING),脚本会继续运行
include_once 语句在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次
Cookie 和 Session
Cookie:PHP 透明的支持 HTTP cookie 。cookie 是一种远程浏览器端存储数据并以此来跟踪和识别用户的机制
Session:会话机制(Session)在 PHP 中用于保持用户连续访问Web应用时的相关数据
传值和传引用的区别
传值导致对象生成了一个拷贝,传引用则可以用两个变量指向同一个内容
超全局变量
- 超全局变量
PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们
超全局变量:$GLOBALS、$_SERVER、$_GET、$_POST、$_FILES、$_COOKIE、$_SESSION、$_REQUEST、$_ENV
$GLOBALS — 引用全局作用域中可用的全部变量
$_SERVER — 服务器和执行环境信息
$_GET — HTTP GET 变量
$_POST — HTTP POST 变量
$_FILES — HTTP 文件上传变量
$_REQUEST — HTTP Request 变量
$_SESSION — Session 变量
$_ENV — 环境变量
$_COOKIE — HTTP Cookies
$php_errormsg — 前一个错误信息
$HTTP_RAW_POST_DATA — 原生POST数据
$http_response_header — HTTP 响应头
$argc — 传递给脚本的参数数目
$argv — 传递给脚本的参数数组
客户端/服务端 IP 获取,了解代理透传 实际IP 的概念
客户端IP: $_SERVER[‘REMOTE_ADDR’]
服务端IP: $_SERVER[‘SERVER_ADDR’]
客户端IP(代理透传): $_SERVER[‘HTTP_X_FORWARDED_FOR’]
面向对象
static、self、$this 的区别
static:static 可以用于静态或非静态方法中,也可以访问类的静态属性、静态方法、常量和非静态方法,但不能访问非静态属性
self:可以用于访问类的静态属性、静态方法和常量,但 self 指向的是当前定义所在的类,这是 self 的限制
$this:指向的是实际调用时的对象,也就是说,实际运行过程中,谁调用了类的属性或方法,$this 指向的就是哪个对象。但 $this 不能访问类的静态属性和常量,且 $this 不能存在于静态方法中
魔术方法
构造函数:PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作
析构函数:PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,如 C++。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行
常见魔术方法(Magic methods):
construct(), __destruct(), __call(),callStatic(),__get(), __set(),
__isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke()
public、protected、private、final 区别
对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问
PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承
类的静态调用和实例化调用
占用内存
静态方法在内存中只有一份,无论调用多少次,都是共用的
实例化不一样,每一个实例化是一个对象,在内存中是多个的
不同点
静态调用不需要实例化即可调用
静态方法不能调用非静态属性,因为非静态属性需要实例化后,存放在对象里
静态方法可以调用非静态方法,使用 self 关键字。php 里,一个方法被
self::
后,自动转变为静态方法调用类的静态函数时不会自动调用类的构造函数
PHP 不实例化调用方法
静态调用、使用 PHP 反射方式
Trait
自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait
yield 是什么,说个使用场景 yield、yield 核心原理是什么
一个生成器函数看起来像一个普通的函数,不同的是普通函数返回一个值,而一个生成器可以yield生成许多它所需要的值
traits 与 interfaces 区别 及 traits 解决了什么痛点
其他
Session共享
1)基于NFS的Session共享。NFS(Network File System)最早由Sun公司为解决Unix网络主机间的目录共享而研发。仅需将共享目录服务器mount到其他服务器的本地session目录即可。
2)基于数据库的Session共享。
3)基于Cookie的Session共享。原理是将全站用户的Session信息加密、序列化后以Cookie的方式,统一种植在根域名下(如:.host.com),利用浏览器访问该根域名下的所有二级域名站点时,会传递与之域名对应的所有Cookie内容的特性,从而实现用户的Cookie化Session 在多服务间的共享访问。
4)基于缓存(Memcache)的Session共享。Memcache是一款基于Libevent多路异步I/O技术的内存共享系统,简单的key + value数据存储模式使得代码逻辑小巧高效,因此在并发处理能力上占据了绝对优势,目前能达到2000/s平均查询,并且服务器CPU消耗依然不到10%。
1、如果你能修改到服务器配置文件,那就打开打开php.ini
修改下面两项:
session.save_handler = memcache
session.save_path = “tcp://127.0.0.1:11211”
2、修改网站根目录下的.htaccess文件
php_value session.save_handler “memcache”
php_value session.save_path “tcp://127.0.0.1:11211”
3、最常用的方法 在程序代码中修改(推荐)
ini_set(“session.save_handler”, “memcache”);
ini_set(“session.save_path”, “tcp://127.0.0.1:11211”);
http
http 请求的流程?
1. 域名解析
2. 发起TCP的3次握手
3. 建立TCP连接后发起http请求
4. 服务器端响应http请求,浏览器得到html代码
5. 浏览器解析html代码,并请求html代码中的资源
6. 浏览器对页面进行渲染呈现给用户
1、浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2、解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立TCP连接;
3、浏览器发出读取文件(URL 中域名后面部分对应的文件)的HTTP 请求,该请求报文作为 TCP 三次握手的第三个报文的数据发送给服务器;
4、服务器对浏览器请求作出响应,并把对应的 html 文本发送给浏览器;
5、释放 TCP连接;
6、浏览器将该 html 文本并显示内容;
HTTP中POST、GET、PUT、DELETE方式的区别?
HTTP定义了与服务器交互的不同的方法,最基本的是POST、GET、PUT、DELETE,与其比不可少的URL的全称是资源描述符,我们可以这样理解:url描述了一个网络上资源,而post、get、put、delete就是对这个资源进行增、删、改、查的操作!
表单中get和post提交方式的区别?
get是把参数数据队列加到提交表单的action属性所指的url中,值和表单内各个字段一一对应,从url中可以看到;post是通过HTTPPOST机制,将表单内各个字段与其内容防止在HTML的head中一起传送到action属性所指的url地址,用户看不到这个过程
对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据
get传送的数据量较小,post传送的数据量较大,一般被默认不受限制,但在理论上,IIS4中最大量为80kb,IIS5中为1000k,
get安全性非常低,post安全性较高
常见的HTTP状态码:
200 : 请求成功,请求的数据随之返回。
301 : 永久性重定向。
302 : 暂时行重定向。
401 : 当前请求需要用户验证。
403 : 服务器拒绝执行请求,即没有权限。
404 : 请求失败,请求的数据在服务器上未发现。
500 : 服务器错误。一般服务器端程序执行错误。
503 : 服务器临时维护或过载。这个状态时临时性的。
HTTP状态码分类:
1** - 信息,服务器收到的请求,需要请求者继续执行操作
2** - 成功,操作被成功接收并处理
3** - 重定向,需要进一步的操作以完成请求
4** - 客户端错误,请求包含语法错误或者无法完成请求
5** 服务器错误,服务器在处理请求的过程
502、504 错误产生原因及解决方式
502 表示网关错误,当 PHP-CGI 得到一个无效响应,网关就会输出这个错误
1. php.ini 的 memory_limit 过小
2. php-fpm.conf 中 max_children、max_requests 设置不合理
3. php-fpm.conf 中 request_terminate_timeout、max_execution_time 设置不合理
4. php-fpm 进程处理不过来,进程数不足、脚本存在性能问题
5. php-fpm 未启动
504 表示网关超时,PHP-CGI 没有在指定时间响应请求,网关将输出这个错误
原因:
1. 程序在处理大量数据,导致等待超时。
2. 程序中调用外部请求,而外部请求响应超时。
3. 连接数据库失败而没有停止,死循环重新连。
解决方法:
方法一:
开启php慢日志功能(找到php-fpm.conf配置文件,或者如果有加载*.conf文件,需要找一下对应目录下的配置文件,我这里在php-fpm.d文件夹中有www.conf文件)
将上面这行配置去除前面的分号并改为以下内容:
slowlog = var/log/$pool.slow.log
将上面这行配置去除前面的分号并改为以下内容:
request_slowlog_timeout = 5
方法二:
Nginx+PHP 架构,可以调整 FastCGI 超时时间,fastcgi_connect_timeout、fastcgi_send_timeout、fastcgi_read_timeout
500
php 代码问题,文件权限问题,资源问题
503
超载或者停机维护
php获取post方法payload(json)形式参数的方法
场景
vue-resource发送了一个post请求,在后台$_POST都获取不到数据
分析
研究完参数 发现参数是通过payload json方式传递的, 这种方式是没有办法从$_POST中获取的,
只有x-www-form-data multipart/form-data 这两种形式的payload才会填充$_POST, 而application/json则填充 php://input解决
$request_body = file_get_contents(‘php://input’);
$data = json_decode($request_body, true);
web安全
XSS
了解XSS攻击吗?如何防止?
XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本,然后利用不安全的Activex控件执行恶意的行为。
使用htmlspecialchars()函数对提交的内容进行过滤,使字符串里面的特殊符号实体化。
SQL注入
SQL注入漏洞产生的原因?如何防止?
SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。
防止SQL注入的方式:
开启配置文件中的magic_quotes_gpc 和 magic_quotes_runtime设置
执行sql语句时使用addslashes进行sql语句转换
Sql语句书写尽量不要省略双引号和单引号。
过滤掉sql语句中的一些关键词:update、insert、delete、select、 * 。
提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。
Php配置文件中设置register_globals为off,关闭全局变量注册
控制错误信息,不要在浏览器上输出错误信息,将错误信息写到日志文件中。
PHP网站的主要攻击方式有哪些?
命令注入(Command Injection)
eval 注入(Eval Injection)
客户端脚本攻击(Script Insertion)
跨网站脚本攻击(Cross Site Scripting, XSS)
SQL 注入攻击(SQL injection)
跨网站请求伪造攻击(Cross Site Request
Forgeries, CSRF)
Session 会话劫持(Session Hijacking)
Session 固定攻击(Session Fixation)
HTTP 响应拆分攻击(HTTP Response Splitting)
文件上传漏洞(File Upload Attack)
目录穿越漏洞(Directory Traversal)
远程文件包含攻击(Remote Inclusion)
动态函数注入攻击(Dynamic Variable
Evaluation)
URL 攻击(URL attack)
表单提交欺骗攻击(Spoofed Form
Submissions)
HTTP 请求欺骗攻击(Spoofed HTTP Requests)
本作品采用《CC 协议》,转载必须注明作者和本文链接