PHP高性能 高价值的PHP API
API基础知识
模版开发:
客户端请求服务器,web server获取请求之后将PHP中的数据通过变量的方式传给模版(一般为html文件),然后将模版中的信息拼接成一个输出,然后将输出返回给web server,然后web server 再返回给浏览器。
api开发
只需要吧数据通过规定的格式返回,一般为json或者xml格式,全程不和模版打交道。
好处:前后端分离,前后端更加专注自己的开发。而且一套api接口,可以供多端使用,如ios,Android,web,h5
api有状态性的实现
http是无状态的,每次连接都是独立的,所以api的方式也是无状态的,解决办法就是通过session的方式。用户请求服务器的时候,在服务器生成一个session,将这个sessionid连同请求的内容一同返回给用户,在用户的客户端使用cookie保存这个id。用户再次请求的时候会携带这个id发送到服务器,服务器通过这个id找到对应的session内容。
工具介绍:
Restful Api-接口设计
概述
一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
如可以定义,客户端通过四个HTTP动词(POST、DELETE、PUT、GET),对服务器端资源进行操作,实现”表现层状态转化”(增删改查)。
资源
所谓”资源”,就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源标识符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。
URI 是统一资源标识符,而 URL 是统一资源定位符
URI代表资源的名称。URL代表资源的路径地址
通过URI找到资源是通过对名称进行标识
通过URL找到资源是对网络位置进行标识
设计误区
最常见的一种设计错误,就是URI包含动词。因为”资源”表示一种实体,所以应该是名词,URI不应该有动词,动词应该放在HTTP协议中。
举例来说,某个URI是/posts/show/1,其中show是动词,这个URI就设计错了,正确的写法应该是/posts/1,然后用GET方法表示show: get/1
将API的版本号放入URL中
https://api.example.com/v1/
注意
(1)API的身份认证应该使用OAuth 2.0框架。
(2)服务器返回的数据格式,应该尽量使用JSON,避免使用XML。
Rest,soap,rpc区别
API开发框架:yaf框架
Yaf是一款C语言写的PHP框架。它以PHP扩展的方式运行框架。 在 PHP 启动的时候加载, 并常驻内存. 更快的执行速度, 更少的内存占用.
只实现了MVC最核心部分的功能:路由、MVC。
Yaf内核够精简稳定,所以,几乎不会遇到运行上的问题。风险可控,性能优异。当然,因为简单,所以,你需要实现DB的封闭、Session的扩展等操作。
下载yaf:
http://pecl.php.net/package/yaf
PECL是PHP扩展的存储库,提供所有已知扩展的目录和用于下载和开发PHP扩展的托管工具。
yaf是PHP的一个扩展,使用yaf框架,需要安装yaf.so这个扩展
安装yaf
下载下来的yaf包里面是一些c文件,需要进行编译。
编译Yaf,
进入Yaf的源码目录, 依次执行(其中$PHP_BIN是PHP的bin目录,PHP的bin目录一般加入了环境变量,所以可以就不用写这个位置了):
$PHP_BIN/phpize
./configure —with-php-config=$PHP_BIN/php-config
make
Sudo make install
Make install 会吧yaf源码中的yaf.so扩展放到PHP指定的扩展目录中,然后打开PHP.ini,加载yaf.so扩展:
Sudo vim /usr/local/php5/lib/php.ini
增加:
[yaf]
extension=yaf.so
yaf.environ=”product”
重启Apache :sudo apachectl restart
查看phpinfo,看是否有yaf扩展,有就表示扩展安装成功。
编译的一些知识:
https://blog.csdn.net/chang_ge/article/details/80848354
phpize的作用可以这样理解:侦测环境(phpize工具是在php安装目录下,基于这点phpize对应了当时的php环境,所以是要根据该php的配置情况生成对应的configure文件),在当前目录下建立一个configure文件。
./configure它是个shell脚本文件,主要用于编译安装源代码库和软件。这一步一般用来生成 Makefile,为下一步的编译做准备
Make,这一步是用来编译的,它从Makefile中读取指令,然后编译
sudo make install,这一步是用来安装的,它也从Makefile中读取指令,安装到指定的位置
安装yaf遇到的问题:
刚开始运行phpize的时候报错,找不到autoconf,解决办法,安装autoconf:
mac安装方式,brew install autoconf ,然后运行phpize,如果还报错,试着将yaf的源代码换一份,重新进行编译。因为原先的源代码在运行phpize的时候出错了,导致安装完autoconf之后,一些文件错误了。
mac和centos都可用下边方法解决:
$ wget http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz
$ tar -zvxf m4-1.4.9.tar.gz
$ cd m4-1.4.9/
$ ./configure && make && make install
$ cd ../
$ wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.62.tar.gz
$ tar -zvxf autoconf-2.62.tar.gz
$ cd autoconf-2.62/
$ ./configure && make && make install
如果是Ubuntu的话,可以:
sudo apt-get install m4
sudo apt-get install autoconf
或者直接:
sudo apt-get install autoconf
因为autoconf 依赖于m4,所以会自动下载解决这个依赖关系.
创建yaf项目
https://github.com/laruence/php-yaf,下载源码,因为 Yaf 提供的命令工具没有随 Yaf 源码一起,在该项目下面有一个tools文件夹,里面就是命令行工具。
里面有一个tools/cg/
输入命令
./yaf_cg yafceshi
就会在当前目录下新建一个output目录,里面就生成一个最简单的yafceshi项目
编写路由规则:
mac下Apache服务器:
.htaccess文件默认的路由规则改为:
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
访问:Localhost/yafceshi,出现:Hello World! I am Stranger表示成功
第三方接口
邮件:nette/mail
短信:sms.cn 云信,测试的时候这个短信商有免费条数,建议选择阿里云的短信商,文档客服有优势
Push 推送通知服务:个推
Ip地址转换接口:www.ipip.net
API自测脚本
专业PHP测试框架:phpunit
自测脚本:使用curl扩展:curl/curl
https://packagist.org/packages/curl/curl
就是在一个测试脚本中,使用curl带入参数,请求功能路由,
新同事可以看测试脚本,快速知道项目的功能
封装公共方法
可以使用静态方法,调用方便
统一的错误状态码和说明应该封装到一个类中,一个功能点的错误号码使用一个号段标识,
异常处理
调用model操作数据库的时候,可以在控制器中使用try catch 将调用model的代码包含起来,遇到异常就可以给调用接口的地方返回错误信息。
API文档工具
通过解析注释,生成文档,文档包含类的详细属性。效果不是很好,不太详细,除非注释写的很详细。而且根据PHPdocumentor的注释规范来写。
orm框架
doctrine/orm
ORM提供了对数据库的映射,不用sql直接编码,能够像操作对象一样从数据库获取数据
ORM的缺点是会牺牲程序的执行效率和会固定思维模式。
从系统结构上来看,采用ORM的系统一般都是多层系统,系统的层次多了,效率就会降低。ORM是一种完全的面向对象的做法,而面向对象的做法也会对性能产生一定的影响。
API接口时间开销
1,接口的整体时间开销
可以使用postman工具查看:
如果使用浏览器调试的话可以在开发者工具的network栏看到请求的时间。
也可以将接口请求的时间记录到日志中:刚请求接口的时间和接口处理完后的时间差
2,借助xhprof工具,查看接口的各个环节的开销
XHProf是facebook 开发的一个测试php性能的扩展,
使用XHProf对PHP进行性能优化,查找性能瓶颈
xhprof提供了基于web的图形界面对分析结果进行查看。
官网的xhporf只支持PHP5.2,GitHub上有人再次基础上做了PHP7的支持:
https://github.com/longxinH/xhprof
服务监:supervisord
supervisor管理进程,我们只需要将要管理进程的可执行文件的路径添加到supervisor的配置文件中。此时被管理进程被视为supervisor的子进程,若该子进程异常中断,则父进程可以准确的获取子进程异常中断的信息,通过在配置文件中设置autostart=ture,可以实现对异常中断的子进程的自动重启。