<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>PHP on 王站站</title>
    <link>/tags/php/</link>
    <description>Recent content in PHP on 王站站</description>
    <image>
      <title>王站站</title>
      <url>/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
      <link>/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
    </image>
    <generator>Hugo</generator>
    <language>zh</language>
    <lastBuildDate>Mon, 24 Dec 2018 01:12:24 +0000</lastBuildDate>
    <atom:link href="/tags/php/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>面试汇总</title>
      <link>/posts/4537645869/</link>
      <pubDate>Mon, 24 Dec 2018 01:12:24 +0000</pubDate>
      <guid>/posts/4537645869/</guid>
      <description>&lt;h3 id=&#34;mysql&#34;&gt;MySQL&lt;/h3&gt;
&lt;h4 id=&#34;mysql隔离级别如何避免脏读和幻读&#34;&gt;mysql隔离级别、如何避免脏读和幻读&lt;/h4&gt;
&lt;p&gt;&lt;a href=&#34;https://blog.csdn.net/johnstrive/article/details/46724315&#34;&gt;https://blog.csdn.net/johnstrive/article/details/46724315&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Read Uncommitted（读取未提交内容）&lt;/strong&gt;
在该隔离级别，所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用，因为它的性能也不比其他级别好多少。读取未提交的数据，也被称之为脏读（Dirty Read）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Read Committed（读取提交内容）&lt;/strong&gt;
这是大多数数据库系统的默认隔离级别（但不是MySQL默认的）。它满足了隔离的简单定义：一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读（Nonrepeatable Read），因为同一事务的其他实例在该实例处理其间可能会有新的commit，所以同一select可能返回不同结果。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repeatable Read（可重读）&lt;/strong&gt;
这是MySQL的默认事务隔离级别，它确保同一事务的多个实例在并发读取数据时，会看到同样的数据行。不过理论上，这会导致另一个棘手的问题：幻读 （Phantom Read）。简单的说，幻读指当用户读取某一范围的数据行时，另一个事务又在该范围内插入了新行，当用户再读取该范围的数据行时，会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制（MVCC，Multiversion Concurrency Control）机制解决了该问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Serializable（可串行化）&lt;/strong&gt;
这是最高的隔离级别，它通过强制事务排序，使之不可能相互冲突，从而解决幻读问题。简言之，它是在每个读的数据行上加上共享锁。在这个级别，可能导致大量的超时现象和锁竞争。
这四种隔离级别采取不同的锁类型来实现，若读取的是同一个数据的话，就容易发生问题。例如：
**脏读(Drity Read)：**某个事务已更新一份数据，另一个事务在此时读取了同一份数据，由于某些原因，前一个RollBack了操作，则后一个事务所读取的数据就会是不正确的。
**不可重复读(Non-repeatable read):**在一个事务的两次查询之中数据不一致，这可能是两次查询过程中间插入了一个事务更新的原有的数据。
**幻读(Phantom Read):**在一个事务的两次查询中数据笔数不一致，例如有一个事务查询了几列(Row)数据，而另一个事务却在此时插入了新的几列数据，先前的事务在接下来的查询中，就会发现有几列数据是它先前所没有的。&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;隔离级别&lt;/th&gt;
					&lt;th&gt;脏读&lt;/th&gt;
					&lt;th&gt;不可重复读&lt;/th&gt;
					&lt;th&gt;幻读&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Read Uncommitted&lt;/td&gt;
					&lt;td&gt;√&lt;/td&gt;
					&lt;td&gt;√&lt;/td&gt;
					&lt;td&gt;√&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Read Committed&lt;/td&gt;
					&lt;td&gt;×&lt;/td&gt;
					&lt;td&gt;√&lt;/td&gt;
					&lt;td&gt;√&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Repeatable Read&lt;/td&gt;
					&lt;td&gt;×&lt;/td&gt;
					&lt;td&gt;×&lt;/td&gt;
					&lt;td&gt;√&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Serializable&lt;/td&gt;
					&lt;td&gt;×&lt;/td&gt;
					&lt;td&gt;×&lt;/td&gt;
					&lt;td&gt;×&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;mysql主从同步原理和过程&#34;&gt;mysql主从同步原理和过程&lt;/h4&gt;
&lt;p&gt;slave（从服务器）&lt;/p&gt;
&lt;p&gt;master（主服务器）&lt;/p&gt;
&lt;p&gt;mysql主从是异步复制过程&lt;/p&gt;
&lt;p&gt;master开启bin-log功能，日志文件用于记录数据库的读写增删
需要开启3个线程，master IO线程，slave开启 IO线程 SQL线程，
Slave 通过IO线程连接master，并且请求某个bin-log，position之后的内容。
MASTER服务器收到slave IO线程发来的日志请求信息，io线程去将bin-log内容，position返回给slave IO线程。
slave服务器收到bin-log日志内容，将bin-log日志内容写入relay-log中继日志，创建一个master.info的文件，该文件记录了master ip 用户名 密码 master bin-log名称，bin-log position。
slave端开启SQL线程，实时监控relay-log日志内容是否有更新，解析文件中的SQL语句，在slave数据库中去执行。&lt;/p&gt;</description>
    </item>
    <item>
      <title>面试题目</title>
      <link>/posts/312099341/</link>
      <pubDate>Mon, 17 Dec 2018 01:12:17 +0000</pubDate>
      <guid>/posts/312099341/</guid>
      <description>&lt;h5 id=&#34;1什么是引用变量在php中用什么符号定义引用变量&#34;&gt;1.什么是引用变量？在PHP中，用什么符号定义引用变量？&lt;/h5&gt;
&lt;p&gt;在PHP中引用意味着用不同的名字访问同一个变量内容。使用&amp;amp;符号。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;?php

// 定义一个变量
$a = range(0, 1000);
var_dump(memory_get_usage());

// 定义变量b，将a变量的值赋值给b
// COW Copy On Write
$b = $a;
var_dump(memory_get_usage());

// 对a进行修改
$a = range(0, 1000);
var_dump(memory_get_usage());
&lt;/code&gt;&lt;/pre&gt;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;?php

// zval变量容器(需要安装xdebug扩展)
$a = range(0, 3);
xdebug_debug_zval(&amp;#39;a&amp;#39;);

// 定义变量b，把a的值赋值给b
$b = $a;
xdebug_debug_zval(&amp;#39;a&amp;#39;);

// 修改a
$a = range(0, 3);
xdebug_debug_zval(&amp;#39;a&amp;#39;);
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;2php中字符串可以使用那三种定义方法以及各自的区别是什么&#34;&gt;2.PHP中字符串可以使用那三种定义方法以及各自的区别是什么？&lt;/h5&gt;
&lt;p&gt;定义方式：单引号，双引号，heredoc和newdoc.&lt;/p&gt;
&lt;p&gt;单引号：不能解析变量，不能解析转义字符，只能解义单引号和反斜线本身，变量和变量，变量和字符串，字符串和字符串之间可以用.连接&lt;/p&gt;
&lt;p&gt;双引号：可以解析变量，变量可以使用特殊字符和{}包含，可以解义所有的转义字符，可以使用.连接&lt;/p&gt;
&lt;p&gt;单引号效率高&lt;/p&gt;
&lt;p&gt;heredoc类似于双引号，newdoc类似于单引号，两者都是用来处理大文本&lt;/p&gt;
&lt;p&gt;八大数据类型：标量（浮点，整型，字符串，布尔），复合（数组，对象），特殊（null，资源）&lt;/p&gt;
&lt;p&gt;布尔中与false七种：0,0.0,&amp;rsquo;&amp;rsquo;,&amp;lsquo;0&amp;rsquo;,false,array(),NULL&lt;/p&gt;
&lt;p&gt;超全局数组：$GLOBALS,$_GET,$_POST,$_REQUEST,$_SESSION,$_COOKIE,$_SERVER,$_FILES,$_ENV&lt;/p&gt;
&lt;p&gt;$_SERVER[&amp;rsquo;&amp;hellip;&amp;rsquo;]在下面⬇&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;        // HTTP_HOST 			主机名
		// HTTP_USER_AGENT 		获取终端设备, 浏览器版本
		// 
		// SERVER_SOFTWARE 		获取服务器环境
		// SERVER_NAME 			服务器名 
		// SERVER_ADDR 			服务器地址 (IP)
		// REMOTE_ADDR 			客户端IP地址 	 
		// 
		// SCRIPT_FILENAME		脚本地址(盘符)
		// SCRIPT_NAME 			脚本地址(网址)
		// 
		// REQUEST_URI 			传输地址(带参数)
		// REQUEST_METHOD 		传输方式
		// QUERY_STRING 		传输参数
		// 
		// HTTP_REFERER 		获取上一级的来源地址
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;null：直接赋值为NULL，未定义变量，unset销毁的变量&lt;/p&gt;</description>
    </item>
    <item>
      <title>云之梦面试题</title>
      <link>/posts/3650482178/</link>
      <pubDate>Mon, 10 Dec 2018 01:12:10 +0000</pubDate>
      <guid>/posts/3650482178/</guid>
      <description>&lt;h5 id=&#34;第一课总结最新php面试教程httpwwwphpcncourse876html&#34;&gt;第一课总结(最新PHP面试教程http://www.php.cn/course/876.html)&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1.自己充满正能量,心态好,多吃苦,提升技能.
2.团队要正能量,融入团队,积极乐观.
3.人品第一,技能其次.
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;第二课&#34;&gt;第二课&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Use du.  当前目录的空间(Linux)

crontab -e
分时日月周(Linux)
cp f1.txt f2.txt 复制

看Linux启动信息:dmesg
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;第三课&#34;&gt;第三课&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;加号(+)可以进行数组合并
月:m和n
日:d和j(带不带前导零)
preg_split(/-|_/,$arr)  正则分割
str_split($arr,3)  按长度分割
str_replace(&amp;#39;1&amp;#39;,&amp;#39;2&amp;#39;,$str) 字符串替换(把1换成2)
preg_replace(/linux|php/,&amp;#39;js&amp;#39;,$arr) 字符串正则替换

类:protect,public,private
interface 接口
abstract 抽象类或抽象方法
final 最终版本的类或方法
static 静态属性或方法
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;5从表login中选出name字段包含admin的前10条结果所有信息的sql语句&#34;&gt;5.从表login中选出name字段包含admin的前10条结果所有信息的sql语句&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;select * from login where name like &amp;#34;%admin%&amp;#34; limit 10;
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;6解释左连接右链接内连接索引&#34;&gt;6.解释:左连接,右链接,内连接,索引&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;左连接:left ... join ... on
以左表为主导,先输出左边表的所有数据,右边匹配的输出,不匹配的值为null.
内连接:inner ... join ... on
相当于普通多表查询
索引:主键,唯一,普通
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;7简述论坛中无限分类等等实现原理&#34;&gt;7.简述论坛中无限分类等等实现原理&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;表字段至少4列:
id,name,pid(父类id),path(分类地图)
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;10描述一下大流量高并发量网站的解决方案&#34;&gt;10.描述一下大流量高并发量网站的解决方案&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1.服务器负载均衡
2.web服务器用nginx(3万)替换apache(3千)  (最大并发数)
6.调高apache的默认并发数调大
7.减少客户在服务器上的连接断开时间
4.数据缓存(memcache,redis,tp文件缓存)
5.表索引
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;11如何设计或配置mysql才能达到高效的使用目的&#34;&gt;11.如何设计或配置MySQL,才能达到高效的使用目的?&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1.mysql服务器主从复制
2.表分区
3.表引擎 数据小量尽量选择myisam
4.索引优化 用desc解析sql语句看字段
  是否需要优化
5.服务器优化
  max_connections=1500 并发连接数
  wait_timeout=120 链接关闭时间
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;12如何防sql注入&#34;&gt;12.如何防sql注入?&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;1.表单尽量使用post提交
2.使用HTTP_REFERER检查源文件
3.开启addslashes 在特殊符号前加\
4.使用htmlspecialchars对字符串实体
5.提高并发连接数
6.减小链接关闭时间
7.用户授权登录
8.定期给mysql打补丁
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;23isset和empty的区别&#34;&gt;23.isset()和empty()的区别?&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;isset()为假(false),只有未定义变量
empty()为空(true):未定义,0,false,&amp;#39;&amp;#39;,&amp;#39;0&amp;#39;,array(),null
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;24如何在页面之间传递变量&#34;&gt;24.如何在页面之间传递变量?&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;get,post,ajax,curl,cookie,session
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;25冒泡排序&#34;&gt;25.冒泡排序?&lt;/h5&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;function mysort($arr){
    for($i=0;$i&amp;lt;count($arr)-1;$i++){
        for($j=0;$j&amp;lt;count($arr)-$i-1;$j++){
            if($arr[$j]&amp;gt;$arr[$j+1]){
                $x = $arr[$j];
                $arr[$j] = $arr[$j+1];
                $arr[$j+1] = $x;
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;h5 id=&#34;mysql中二次排序&#34;&gt;mysql中二次排序&lt;/h5&gt;
&lt;p&gt;第一次排完,第二次排序在第一次排序之后,
不影响第一次排序的基础上进行排序&lt;/p&gt;</description>
    </item>
    <item>
      <title>Laravel框架学习笔记</title>
      <link>/posts/575855887/</link>
      <pubDate>Mon, 30 Jul 2018 01:07:30 +0000</pubDate>
      <guid>/posts/575855887/</guid>
      <description>&lt;h2 id=&#34;001需求和安装&#34;&gt;001需求和安装&lt;/h2&gt;
&lt;h3 id=&#34;需求&#34;&gt;需求&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PHP &amp;gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; 7.3
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;BCMath PHP 拓展
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Ctype PHP 拓展
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Fileinfo PHP 拓展
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;JSON PHP 拓展
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Mbstring PHP 拓展
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OpenSSL PHP 拓展
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;PDO PHP 拓展
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Tokenizer PHP 拓展
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;XML PHP 拓展
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;安装&#34;&gt;安装&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;composer create-project --prefer-dist laravel/laravel blog
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;运行&#34;&gt;运行&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;php artisan serve
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;注: 需要给&lt;code&gt;storage&lt;/code&gt;文件夹写权限&lt;/p&gt;
&lt;h2 id=&#34;002文件夹结构的详细&#34;&gt;002文件夹结构的详细&lt;/h2&gt;
&lt;h3 id=&#34;根目录&#34;&gt;根目录&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;app 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;bootstrap 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;config 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;database 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;public 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;resources 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;routes 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;storage 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tests 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;vendor 目录
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;app目录&#34;&gt;APP目录&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Broadcasting 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Console 目录 用于控制台注册
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Events 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Exceptions 目录 注册处理异常方法
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Http 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Jobs 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Listeners 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Mail 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Models 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Notifications 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Policies 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Providers 目录
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Rules 目录
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;M:&lt;code&gt;app/Models&lt;/code&gt; V:&lt;code&gt;resource/views&lt;/code&gt;  C:&lt;code&gt;app/Controllers&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>workerman学习笔记</title>
      <link>/posts/3059268860/</link>
      <pubDate>Mon, 28 May 2018 01:05:28 +0000</pubDate>
      <guid>/posts/3059268860/</guid>
      <description>&lt;h2 id=&#34;序言&#34;&gt;序言&lt;/h2&gt;
&lt;p&gt;Workerman, 高性能socket框架.&lt;/p&gt;
&lt;p&gt;Workerman是一款纯PHP开发的开源高性能的PHP socket 服务框架。&lt;/p&gt;
&lt;p&gt;Workerman每个进程能维持上万并发连接。&lt;/p&gt;
&lt;p&gt;同时支持TCP、UDP、UNIXSOCKET，支持长连接，支持Websocket、HTTP、WSS、HTTPS等通讯协议以及各种自定义协议。拥有定时器、异步socket客户端、异步Mysql、异步Redis、异步Http、异步消息队列等众多高性能组件。&lt;/p&gt;
&lt;h3 id=&#34;应用方向&#34;&gt;应用方向&lt;/h3&gt;
&lt;p&gt;1、即时通讯类&lt;/p&gt;
&lt;p&gt;2、物联网类&lt;/p&gt;
&lt;p&gt;3、游戏服务器类&lt;/p&gt;
&lt;p&gt;4、HTTP服务&lt;/p&gt;
&lt;p&gt;5、SOA服务化&lt;/p&gt;
&lt;p&gt;6、其它服务器软件&lt;/p&gt;
&lt;p&gt;7、中间件&lt;/p&gt;
&lt;h2 id=&#34;原理&#34;&gt;原理&lt;/h2&gt;
&lt;p&gt;Worker是WorkerMan中最基本容器, 采用Epoll(需要装event扩展)+非阻塞IO，每个Worker进程都能上万的客户端连接，并处理这些连接上发来的数据。&lt;/p&gt;
&lt;p&gt;主进程与worker子进程关系[https://wenda.workerman.net/uploads/answer/20140815/5670ea17653a1a6e6811ed5148f77c96.png]&lt;/p&gt;
&lt;h2 id=&#34;开发必读&#34;&gt;开发必读&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1、windows环境限制&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2、workerman不依赖apache或者nginx&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3、workerman是命令行启动的&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4、长连接必须加心跳&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5、客户端和服务端协议一定要对应才能通讯&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6、连接失败可能的原因&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7、不要使用exit die sleep语句&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8、不要使用pcntl_fork函数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9、业务代码里不要有死循环&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10、改代码要重启&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11、长连接应用建议用GatewayWorker框架&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;12、支持更高并发&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&#34;入门指引&#34;&gt;入门指引&lt;/h2&gt;
&lt;h3 id=&#34;特性&#34;&gt;特性&lt;/h3&gt;
&lt;p&gt;1、纯PHP开发&lt;/p&gt;
&lt;p&gt;2、支持PHP多进程&lt;/p&gt;
&lt;p&gt;3、支持TCP、UDP&lt;/p&gt;
&lt;p&gt;4、支持长连接&lt;/p&gt;
&lt;p&gt;5、支持各种应用层协议&lt;/p&gt;
&lt;p&gt;6、支持高并发&lt;/p&gt;
&lt;p&gt;7、支持服务平滑重启&lt;/p&gt;
&lt;p&gt;8、支持文件更新检测及自动加载&lt;/p&gt;
&lt;p&gt;9、支持以指定用户运行子进程&lt;/p&gt;
&lt;p&gt;10、支持对象或者资源永久保持&lt;/p&gt;
&lt;p&gt;11、高性能&lt;/p&gt;
&lt;p&gt;12、支持HHVM&lt;/p&gt;
&lt;p&gt;13、支持分布式部署&lt;/p&gt;
&lt;p&gt;14、支持守护进程化&lt;/p&gt;
&lt;p&gt;15、支持多端口监听&lt;/p&gt;
&lt;p&gt;16、支持标准输入输出重定向&lt;/p&gt;
&lt;h3 id=&#34;简单的开发示例&#34;&gt;简单的开发示例&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;创建http_test.php文件&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;&amp;lt;?&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;php&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Workerman\Worker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;require_once&lt;/span&gt; &lt;span class=&#34;no&#34;&gt;__DIR__&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;.&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;/Workerman/Autoloader.php&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 创建一个Worker监听2345端口，使用http协议通讯
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$http_worker&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Worker&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;http://0.0.0.0:2345&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 启动4个进程对外提供服务
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$http_worker&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;count&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 接收到浏览器发送的数据时回复hello world给浏览器
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$http_worker&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;onMessage&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;function&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$connection&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;// 向浏览器发送hello world
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nv&#34;&gt;$connection&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;hello world&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 运行worker
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;Worker&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;::&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;runAll&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;php&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;http_test&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;php&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;start&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&amp;hellip;&lt;/p&gt;</description>
    </item>
    <item>
      <title>phalapi框架学习笔记</title>
      <link>/posts/644540286/</link>
      <pubDate>Mon, 07 May 2018 01:05:07 +0000</pubDate>
      <guid>/posts/644540286/</guid>
      <description>&lt;h1 id=&#34;1-快速开发&#34;&gt;1 快速开发&lt;/h1&gt;
&lt;h2 id=&#34;11-安装&#34;&gt;1.1 安装&lt;/h2&gt;
&lt;h3 id=&#34;composer一键安装&#34;&gt;composer一键安装&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;composer create-project phalapi/phalapi&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;手动下载安装&#34;&gt;手动下载安装&lt;/h3&gt;
&lt;p&gt;下载 &lt;a href=&#34;https://github.com/phalapi/phalapi/tree/master-2x&#34;&gt;phalapi&lt;/a&gt; 项目&lt;strong&gt;master-2x分支&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;composer update&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;nginx配置&#34;&gt;Nginx配置&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;......&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;location&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kn&#34;&gt;index&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;index.php&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# 开启URI路由匹配
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# location / {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;#       try_files $uri $uri/ /?$args;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# if (!-e $request_filename) {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;#        rewrite ^/(.*)$ /index.php last;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;......&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nginx -t
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nginx -s reload
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;12-运行hello-world&#34;&gt;1.2 运行Hello world&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://docs.phalapi.net/#/v2.0/hello-world&#34;&gt;点击此处&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;13-如何请求接口服务&#34;&gt;1.3 如何请求接口服务&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;http://docs.phalapi.net/#/v2.0/how-to-request?id=%e5%bc%80%e5%90%afuri%e8%b7%af%e7%94%b1%e5%8c%b9%e9%85%8d&#34;&gt;开启url匹配&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;http://docs.phalapi.net/#/v2.0/how-to-request?id=%E6%89%A9%E5%B1%95%EF%BC%9A%E5%A6%82%E4%BD%95%E5%AE%9A%E5%88%B6%E6%8E%A5%E5%8F%A3%E6%9C%8D%E5%8A%A1%E7%9A%84%E4%BC%A0%E9%80%92%E6%96%B9%E5%BC%8F%EF%BC%9F&#34;&gt;扩展：如何定制接口服务的传递方式？&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;14-接口响应与在线调试&#34;&gt;1.4 接口响应与在线调试&lt;/h2&gt;
&lt;h3 id=&#34;跨域&#34;&gt;跨域&lt;/h3&gt;
&lt;p&gt;在&lt;code&gt;./config/di.php&lt;/code&gt;后面的位置添加&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 允许跨域
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;\PhalApi\DI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;addHeaders&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Access-Control-Allow-Origin&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;*&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// *代表允许任何网址请求
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// $response-&amp;gt;addHeaders(&amp;#39;Access-Control-Allow-Origin&amp;#39;, &amp;#39;www.phalapi.net&amp;#39;); // 推荐指定网站
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;addHeaders&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Access-Control-Allow-Methods&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;POST,GET,OPTIONS,DELETE&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 允许请求的类型
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;addHeaders&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Access-Control-Allow-Credentials&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;true&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 设置是否允许发送 cookies
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;addHeaders&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Access-Control-Allow-Headers&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Content-Type,Content-Length,Accept-Encoding,X-Requested-with, Origin&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// 设置允许自定义请求头的字段
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;在线调试&#34;&gt;在线调试&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单次请求开启调试&lt;/strong&gt;：默认添加请求参数&lt;code&gt;&amp;amp;__debug__=1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全部请求开启调试&lt;/strong&gt;：把配置文件&lt;code&gt;./config/sys.php&lt;/code&gt;文件中的配置改成&lt;code&gt;&#39;debug&#39; =&amp;gt; true,&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;自定义埋点&#34;&gt;自定义埋点&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 添加纪录埋点，并指定节点标识
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;PhalApi\DI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;tracer&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;mark&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;DO_SOMETHING&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;自定义调试信息&#34;&gt;自定义调试信息&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$x&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;this is x&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$y&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;this is y&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;\PhalApi\DI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setDebug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;XXX_x&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$x&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// XXX扩展
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;\PhalApi\DI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setDebug&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;XXX_y&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$y&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;15-api接口层&#34;&gt;1.5 Api接口层&lt;/h2&gt;
&lt;h3 id=&#34;异常抛出&#34;&gt;异常抛出&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;use&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;App\Common\AppException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;......&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;throw&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;AppException&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;提示消息&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;......&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;手动指定ret状态码&#34;&gt;手动指定ret状态码&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 手动设置ret为1000
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// ret=200时表示正常返回，ret=4xx表示额端非法请求，ret=500表示服务器内部错误，手动设置时应设置成其他整数范围，避免语义冲突
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;\PhalApi\DI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setRet&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;// 手动设置提示消息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;\PhalApi\DI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&#34;na&#34;&gt;setMsg&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;手动设置提示消息&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;钩子函数&#34;&gt;钩子函数&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/phalapi/kernal/blob/master/src/Api.php&#34;&gt;PhalApi\Api::getRules()&lt;/a&gt;，获取参数设置的规则，可由开发人员根据需要重载&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://github.com/phalapi/kernal/blob/master/src/Api.php&#34;&gt;PhalApi\Api::userCheck()&lt;/a&gt;，用户身份验证，可由开发人员根据需要重载，此通用操作一般可以使用委托或者放置在应用接口基类&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;16-dataapi通用数据接口&#34;&gt;1.6 DataApi通用数据接口&lt;/h2&gt;
&lt;h3 id=&#34;dataapi有哪些接口&#34;&gt;DataApi有哪些接口？&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;PhalApi\Api\DataApi&lt;/code&gt;目前有5个数据接口（后面会进一步扩展）：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
