[
  {
    "path": "README.md",
    "content": "最近面试了不少公司，正好把记得的问题做个总结。\n\n本文 [github](https://github.com/sushengbuhuo/php-interview-2018) 会持续更新 \n\n本文[sf](https://segmentfault.com/a/1190000015651120)\n\n欢迎关注公众号：苏生不惑  每周更新文章，一个有趣又有用的公众号\n\n![关注](https://mmbiz.qpic.cn/mmbiz_jpg/sZeVtjGD4lFg1Ijxp4V5UfVuOkP90u1H3Ifm02J5ibEdoTsvpavaSGO2tGBrH2fxUibI8uiclUo0QrFguhfjnialbw/640?wx_fmt=jpeg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)\n\n# 简历\n\n关于简历怎么写，知乎上有很多对应问题，可以自行搜索，这里推荐几个简历相关的 repo\n\n[程序员写简历时，常用的例句范式]( https://github.com/resumejob/awesome-resume)\n\n[简历常用例句 ](https://github.com/resumejob/awesome-resume) \n\n[程序员简历模板](https://github.com/geekcompany/ResumeSample )\n\n[在线简历]( http://cv.ftqq.com/#)\n\n[md简历](https://resume.mdnice.com/)\n\n# 笔试题\n\n### 写一个email的正则\n```js\n$mail = 'test@sina.com';  //邮箱地址\n$pattern = \"/^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,})$/\";\npreg_match($pattern, $mail, $matches);\n//验证可以使用 filter_var($email, FILTER_VALIDATE_EMAIL)\n```\n### 关系比较 \n[参考官网](http://php.net/manual/zh/types.comparisons.php)\n\n![clipboard.png](https://segmentfault.com/img/bVbdOqw?w=835&h=497)\n\n### echo (int)((0.1+0.7)*10);//7\n看似有穷的小数, 在计算机的二进制表示里却是无穷的 http://www.cnblogs.com/datang6777/p/7049159.html \necho serialize(0.1+0.7); //d:0.79999999999999993;\n\n### 熟悉的linux命令\nps cat tail top awk\n\n### javascript跨域如何实现\njsonp 和 cors\n\n### 熟悉的5种设计模式及用单例模式建立一个数据库连接\n单例 工厂 策略 适配器 观察者\n```js\n<?php\n//参考 https://www.cnblogs.com/Steven-shi/p/5858229.html \nclass DBHelper\n{\n    private $link;\n    static private $_instance;\n\n    // 连接数据库\n    private function __construct($host, $username, $password)\n    {\n        $this->link = mysql_connect($host, $username, $password);\n        $this->query(\"SET NAMES 'utf8'\", $this->link);\n        //echo mysql_errno($this->link) . \": \" . mysql_error($link). \"n\";\n        //var_dump($this->link);\n        return $this->link;\n    }\n    private function __clone()\n    {\n    }\n    public static function get_class_nmdb($host, $username, $password)\n    {\n        //$connector = new nmdb($host, $username, $password);\n        //return $connector;\n\n        if (FALSE == (self::$_instance instanceof self)) {\n            self::$_instance = new self($host, $username, $password);\n        }\n        return self::$_instance;\n    }\n    // 连接数据表\n    public function select_db($database)\n    {\n        $this->result = mysql_select_db($database);\n        return $this->result;\n    }\n    // 执行SQL语句\n    public function query($query)\n    {\n        return $this->result = mysql_query($query, $this->link);\n    }\n    // 将结果集保存为数组\n    public function fetch_array($fetch_array)\n    {\n        return $this->result = mysql_fetch_array($fetch_array, MYSQL_ASSOC);\n    }\n    // 获得记录数目\n    public function num_rows($query)\n    {\n        return $this->result = mysql_num_rows($query);\n    }\n    // 关闭数据库连接\n    public function close()\n    {\n        return $this->result = mysql_close($this->link);\n    }\n}\n$connector = DBHelper::get_class_nmdb($host, $username, $password);\n$connector -> select_db($database);\n?>\n```\n### 冒泡排序 大数在前 小数在后\n```js\n$arr=[5,2,8,1,9];\n$len=count($arr);\nfor($k=1;$k<$len;$k++)\n{\n    for($j=0;$j<$len-$k;$j++){\n        if($arr[$j]<$arr[$j+1]){\n            list($arr[$j+1],$arr[$j])=[$arr[$j],$arr[$j+1]];\n            \n        }\n    }\n}\nprint_r($arr);\n```\n### 如何实现单点登录\n利用 jwt 实现 session 共享，具体使用 jwt 参考 http://blog.leapoahead.com/2015/09/07/user-authentication-with-jwt/ \n### 出现性能瓶颈如何快速定位解决\n服务器负载 慢日志 xhprof 慢sql\n### 熟悉的 nosql 和 sql 有什么区别（优势，劣势）\n Memcache，Redis 都是内存数据库 \nredis是一个开源的支持多种数据类型的key=>value的存储数据库。支持字符串、列表、集合、有序集合、哈希五种类型\nmemcache 只支持简单的key/value数据结构，不像Redis可以支持丰富的数据类型。\n 无法进行持久化，数据不能备份，只能用于缓存使用，且重启后数据全部丢失\n\n### 如何保证代码质量\n高质量代码三要素：可读性，可维护性，可变更性 代码质量评价：低耦合，高内聚  https://segmentfault.com/a/1190000004355331 \n\n### 学习PHP的渠道 看过的PHP书，了解的PHP开源项目 \nphp.net sf google \n《Modern PHP》《PHP核心技术和最佳实践》《PHP the right way》\nlaravel carbon querylist等\n\n### mysql innodb 有哪些索引类型 分别在什么场景下使用\n索引的本质还是提升查询数据库的速度，减少服务器I/O开销 \n主键 唯一 普通 联合 \n\n### 对一个链表顺序反转\n\n### 实现PHP5中的 var_dump 函数\n```js\nfunction mydump() {\n        $args   = func_num_args();\n        for($i = 0;$i < $args; $i ++) {\n            $param = func_get_arg($i);\n            switch(gettype($param)) {\n                case 'NULL' :\n                    echo 'NULL';\n                    break;\n                case 'boolean' :\n                    echo ($param ? 'bool(true)' : 'bool(false)');\n                    break;\n                case 'integer' :\n                    echo \"int($param)\";\n                    break;\n                case 'double' :\n                    echo \"float($param)\";\n                    break;\n                case 'string' :\n                    dumpString($param);\n                    break;\n                case 'array' :\n                    dumpArr($param);\n                    break;\n                case 'object' :\n                    dumpObj($param);\n                    break;\n                case 'resource' :\n                    echo 'resource';\n                    break;\n                default :\n                    echo 'UNKNOWN TYPE';\n                    break;\n            }\n        }\n    }\n \n \nfunction dumpString($param) {\n    $str = sprintf(\"string(%d) %s\",strlen($param),$param);\n    echo $str;\n}\n \nfunction dumpArr($param) {\n    $len = count($param);\n    echo \"array($len) {\\r\\n\";\n    foreach($param as $key=>$val) {\n        if(is_array($val)) {\n            dumpArr($val);\n        } else {\n            echo sprintf('[\"%s\"] => %s(%s)',$key,gettype($val),$val);\n        }\n    }\n    echo \"}\\r\\n\";\n}\n \nfunction dumpObj($param) {\n    $className = get_class($param);\n    $reflect = new ReflectionClass($param);\n    $prop = $reflect->getDefaultProperties();\n    echo sprintf(\"Object %s #1(%d) {\\r\\n\",$className,count($prop));\n    foreach($prop as $key=>$val) {\n        echo \"[\\\"$key\\\"] => \";\n        mydump($val);\n    }\n    echo \"}\";\n}\n \nclass MyClass\n{\n    protected $_name;\n    function test()\n    {\n        echo \"hello\";\n    }\n}\n \n$str    = \"test\";\nmydump(new MyClass(),$str);\necho \"\\r\\n\";\n$arr2   = array(\n    \"1\"     => \"Ddaddad\",\n    \"one\"   => array(\"two\" => \"Dddd\" ),\n    \"three\" => 1\n);\nmydump($arr2); \nmydump(1,true,null);\n```\n### 如何设计一个微博\n用户可以关注他人 可以发布微博 可以查看关注人的微博 可以评论微博\n\n用户表 关注表 微博表 评论表 \n\n### 获取上周一和周日的日期\n`echo date('Y-m-d',strtotime('monday last week'));`\n`echo date('Y-m-d', strtotime('-' . (6+date('w')) . ' days'));`\n`echo date('Y-m-d',strtotime('sunday last week'));`\n### 对数组实现去除空元素 排重 按值从大到小排序 重新建立数字索引 \n`array_values(rsort(array_unique(array_filter($arr))))`\n### 对二维数组按照 title+pubscore 去重\n```js\nfunction unique_by_key($arr, $key1,$key2) {\n  $tmp_key = [];\n  foreach ($arr as $key => $item) {\n      if ( in_array($item[$key1].$item[$key2], $tmp_key) ) {\n        unset($arr[$key]);\n      } else {\n        $tmp_key[] = $item[$key1].$item[$key2];\n    }\n  }\n  return $arr;\n}\n//使用示例：\n$arr = array(\n  array('id' => 1, 'title' => 'a','pubscore'=>1),\n  array('id' => 2, 'title' => 'a','pubscore'=>1),\n  array('id' => 3, 'title' => 'b','pubscore'=>2),\n  array('id' => 4, 'title' => 'c','pubscore'=>3),\n  array('id' => 5, 'title' => 'd','pubscore'=>3),\n);\nprint_r(unique_by_key($arr,'title','num'));\n\n```\n### 写一个正则 匹配新闻标题不能为数字，纯字母，不能包含 彩票/广告/启示\n\n### linux 压缩 解压缩命令\n`tar -cvf jpg.tar *.jpg`\n`tar -xvf jpg.tar`\n### linux下后台执行 test.php 将结果输出到test.log\n`php test.php & >test.log`\n### 写一个shell命令 实现找出所有包含 spread的进程，杀死这些进程并记录日志，日志包含杀死进程名称和杀死进程的时间\n`ps -ef |grep spread |grep -v grep |awk '{print $2}'|xargs kill -9`\n`kill -9 $(ps -ef | grep spread| grep -v grep | awk '{print $2}')`\n### 一个json 转化输出有层级的文本\n参考 https://segmentfault.com/a/1190000008265618\n### 排行榜统计 sql \n订单表有如下字段\nid 自增id\nuser_id 购买者id\nproduct_id 商品id\ntime 购买时间\nprice 订单总价\n找出销量大于1000的商品，按销量倒序 和 找出消费最多的10个用户\n\n`select product_id,count(*) s from orders group by product_id order by s  having s>1000;`\n\n`select user_id,sum(price) s from orders group by user_id order by s desc limit 10;`\n\n### 列出你知道的魔术方法 ，并说明他们的用途\n\n[参考手册](http://php.net/manual/zh/language.oop5.magic.php)\n\n### 写出你知道的http头部属性 注意大小写 并说明用途\n```js\nAccept\t指定客户端能够接收的内容类型\tAccept: text/plain, text/html\nAccept-Charset\t浏览器可以接受的字符编码集。\tAccept-Charset: iso-8859-5\nAccept-Encoding\t指定浏览器可以支持的web服务器返回内容压缩编码类型。\tAccept-Encoding: compress, gzip\nAccept-Language\t浏览器可接受的语言\tAccept-Language: en,zh\nAccept-Ranges\t可以请求网页实体的一个或者多个子范围字段\tAccept-Ranges: bytes\nAuthorization\tHTTP授权的授权证书\tAuthorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==\nCache-Control\t指定请求和响应遵循的缓存机制\tCache-Control: no-cache\nConnection\t表示是否需要持久连接。（HTTP 1.1默认进行持久连接）\tConnection: close\nCookie\tHTTP请求发送时，会把保存在该请求域名下的所有cookie值一起发送给web服务器。\tCookie: $Version=1; Skin=new;\nContent-Length\t请求的内容长度\tContent-Length: 348\nContent-Type\t请求的与实体对应的MIME信息\tContent-Type: application/x-www-form-urlencoded\nDate\t请求发送的日期和时间\tDate: Tue, 15 Nov 2010 08:12:31 GMT\nExpect\t请求的特定的服务器行为\tExpect: 100-continue\nFrom\t发出请求的用户的Email\tFrom: user@email.com\nHost\t指定请求的服务器的域名和端口号\tHost: www.zcmhi.com\nIf-Match\t只有请求内容与实体相匹配才有效\tIf-Match: “737060cd8c284d8af7ad3082f209582d”\nIf-Modified-Since\t如果请求的部分在指定时间之后被修改则请求成功，未被修改则返回304代码\tIf-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT\nIf-None-Match\t如果内容未改变返回304代码，参数为服务器先前发送的Etag，与服务器回应的Etag比较判断是否改变\tIf-None-Match: “737060cd8c284d8af7ad3082f209582d”\nIf-Range\t如果实体未改变，服务器发送客户端丢失的部分，否则发送整个实体。参数也为Etag\tIf-Range: “737060cd8c284d8af7ad3082f209582d”\nIf-Unmodified-Since\t只在实体在指定时间之后未被修改才请求成功\tIf-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT\nMax-Forwards\t限制信息通过代理和网关传送的时间\tMax-Forwards: 10\nPragma\t用来包含实现特定的指令\tPragma: no-cache\nProxy-Authorization\t连接到代理的授权证书\tProxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==\nRange\t只请求实体的一部分，指定范围\tRange: bytes=500-999\nReferer\t先前网页的地址，当前请求网页紧随其后,即来路\tReferer: http://www.zcmhi.com/archives/71.html\nTE\t客户端愿意接受的传输编码，并通知服务器接受接受尾加头信息\tTE: trailers,deflate;q=0.5\nUpgrade\t向服务器指定某种传输协议以便服务器进行转换（如果支持）\tUpgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11\nUser-Agent\tUser-Agent的内容包含发出请求的用户信息\tUser-Agent: Mozilla/5.0 (Linux; X11)\nVia\t通知中间网关或代理服务器地址，通信协议\tVia: 1.0 fred, 1.1 nowhere.com (Apache/1.1)\nWarning\t关于消息实体的警告信息\tWarn: 199 Miscellaneous warning\n```\n### 有一个文本文件，内容为ip 每行一个ip 格式为 \n1.2.3.4 \n4.5.6.7\n2.3.4.5\n1.2.3.4\n写出 shell命令 统计 ip出现的次数 结果类似\n1.2.3.4 2\n4.5.6.7  1\n2.3.4.5  1\n\n`awk '{arr[$1]++;}END{for(i in arr){print i , arr[i] }}' test.txt`\n### __destruction() 和 __autoload()触发时机\nunset 和 加载一个为包含的文件\n### 如何实现一个数组[1,2,3]连续复制3次变为[1,2,3,1,2,3,1,2,3]\n```js\n$arr=[1,2,3];\nprint_r(f($arr,3));\nfunction f($arr,$num){\n    return array_filter(explode(',',str_repeat(implode(',',$arr).',',$num)));\n}\n```\n \n### 抽象类和接口的区别，分别在什么场景使用\n抽象类可以实现的功能，接口也可以实现。\n抽象类的接口的区别，不在于编程实现，而在于程序设计模式的不同。\n一般来讲，抽象用于不同的事物，而接口用于事物的行为。\n参考 https://segmentfault.com/a/1190000004699158 \n\n### 猴子选大王 \n一群猴子排成一圈，按1，2，...，n依次编号。然后从第1只开始数，数到第m只,把它踢出圈，从它后面再开始数，再数到第m只，在把它踢出去...，如此不停的进行下去，直到最后只剩下一只猴子为止，那只猴子就叫做大王。要求编程模拟此过程，输入m、n,输出最后那个大王的编号\n```js\necho monkey(10,4);//5\nfunction monkey($m,$n){\n    $arr=range(1,$m);\n    $i=0;\n    while(count($arr)>1){\n        if(($i+1)%$n==0){\n            unset($arr[$i]);\n        }else{\n            $arr[]=$arr[$i];\n            unset($arr[$i]);\n        }\n        $i++;\n    }\n    return $arr[$i];\n}\n```\n### 写一个快速排序\n```js\nfunction quickSort($arr) {\n    $len = count($arr);\n    if($len <= 1) {\n        return $arr;\n    }\n\n    $base = $min = $max = [];\n\n    $base_item = $arr[0];\n\n    for($i = 0; $i < $len ; $i++) {\n        if($arr[$i] < $base_item) {\n            $min[] = $arr[$i];\n        }elseif($arr[$i] > $base_item) {\n            $max[] = $arr[$i];\n        }else {\n            $base[] = $arr[$i];\n        }\n    }\n\n    $min = quickSort($min);\n    $max = quickSort($max);\n    return array_merge($min,$base,$max);\n}\n```\n### 实现一个发红包功能，100元发给8人\n\n### 实现斐波那契数列\n```js\n\nfunction fib($n) {\n    if($n <= 0) return 0;\n    if ($n <= 2) return 1;\n    return fib($n - 1) + fib($n - 2);\n} \n \nfunction fib2($n) {\nif ($n <= 2) return 1;\n$arr = [0,1,1];\nfor ($i = 3; $i <= $n; $i++) {\n    $arr[$i] = $arr[$i - 1] + $arr[$i - 2];\n}\nreturn $arr[$n];\n} \n```\n### 二分查找\n```js\nfunction binSearch($arr,$search){\n$height=count($arr)-1;\n$low=0;\nwhile($low<=$height){\n$mid=floor(($low+$height)/2);//获取中间数\nif($arr[$mid]==$search){\nreturn $mid;\n}elseif($arr[$mid]<$search){//当中间值小于所查值时，则$mid左边的值都小于$search，此时要将$mid赋值给$low\n$low=$mid+1;\n}elseif($arr[$mid]>$search){//中间值大于所查值,则$mid右边的所有值都大于$search,此时要将$mid赋值给$height\n$height=$mid-1;\n}\n}\nreturn \"查找失败\";\n}\n```\n### 二维数组转换成一维数组\n```js\n$user = array(\n     array('id' => 100, 'username' => 'a1'),\n     array('id' => 101, 'username' => 'a2'),\n     array('id' => 102, 'username' => 'a3'),\n     array('id' => 103, 'username' => 'a4'),\n     array('id' => 104, 'username' => 'a5'),\n);\n$result = array_reduce($user, function ($result, $value) {\n    return array_merge($result, array_values($value));\n}, array());\n/*\nArray\n(\n    [0] => 100\n    [1] => a1\n    [2] => 101\n    [3] => a2\n    [4] => 102\n    [5] => a3\n    [6] => 103\n    [7] => a4\n    [8] => 104\n    [9] => a5\n)\n*/\n$result = [];\narray_walk_recursive($user, function($value) use (&$result) {\n    array_push($result, $value);\n});\n$result = [];\narray_map(function ($value) use (&$result) {\n    $result = array_merge($result, array_values($value));\n}, $user);\n```\n### 2次foreach 输出什么\n```js\n//参考https://segmentfault.com/q/1010000008279730\n$arr = [1,2,3];\n    foreach($arr as &$v) {\n        //nothing todo.\n    }\n    foreach($arr as $v) {\n        //nothing todo.\n    }\n    var_export($arr);\n    //output:array(0=>1,1=>2,2=>2)\n ```\n# 面试题\n\n### nginx 热启动\nnginx -s reload\n\n### 读取1G大文件\n使用游标或者yield生成器来获取数据库的数据  https://segmentfault.com/a/1190000012334856\n\n### http  https 区别 \n HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议，要比http协议安全。 参考 https://www.itcodemonkey.com/article/4195.html \n\n### redis 持久化\n aof rdb  http://www.hoohack.me/2018/04/04/deep-learning-redis-durability \nhttps://juejin.im/entry/5b35ad87f265da597759804b/ \n### 权限如何设计\nuser用户表、role角色表、perm权限表、role-user用户角色关联表、role-perm角色权限关联表\n### apache nginx 区别\nhttps://juejin.im/entry/5b34b2d7e51d4558ae19f2eb \nnginx从入门到实践 https://juejin.im/post/5a2600bdf265da432b4aaaba\n### 数据库锁的了解\n乐观锁（代码处理）与悲观锁( select for update) http://www.hollischuang.com/archives/934\n\n### 2038 时间问题\n```js\n //解决：DateTime 或者 使用64位操作系统\n\n$str_time = '2100-10-02'; \n function newStrToTime($str_time) { \n$result = strtotime($str_time);\nif(empty($result)) { \n$date = new DateTime($str_time); \n$result = $date->format('U'); \n} \nreturn $result; \n} \n```\n### 谈谈最近微信支付 xxe 漏洞\nphp 调用simplexml_load_string之前把外部引用实体关掉：  \nlibxml_disable_entity_loader(true);  \n$data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);\n\n### 写个定时任务\n`*　　*　　*　　*　　*　 command`     \n分　时　日　月　周　命令 \n工具 https://crontab-generator.org/ \nhttps://crontab.guru/   \nhttps://tool.lu/crontab/\n https://atool.vip/crontab\n### opcache了解\n缓存字节码 \n### array_merge + 区别 \n[参考](https://segmentfault.com/a/1190000014838713)\n### 如何实现多继承\n\ntrait的出现就是一种解决需要多继承场景的方式。 使用场景是如果多个类都要用到同样的属性或者方法，这个时候使用Traits可以方便的给类增加这些属性或方法，而不用每个类都去继承一个类，如果说继承类是竖向扩展一个类，那么Traits是横向扩展一个类，从而实现代码复用。 \n \n[PHP中Trait详解及其应用]( https://segmentfault.com/a/1190000008009455 )\n\n### PHP 多线程\n https://www.cnblogs.com/kluan/p/5934228.html \nhttps://www.cnblogs.com/zhenbianshu/p/7978835.html\n```js\nclass Request extends Thread {\n    public $url;\n    public $response;\n    public function __construct($url) {\n        $this->url = $url;\n    }\n    public function run() {\n        $this->response = file_get_contents($this->url);\n    }\n}\n$ch = new Request(\"www.baidu.com\");\n$ch ->start();\n```\n### php执行流程 \n浏览器输入URL->Nginx(从配置文件中加载nginx的fast-cgi模块)->php-fpm(fastcgi的进程管理器)\n先到php-fpm的master进程(负责监听端口,接收Nginx的请求,据子进程的状态将请求分配给子进程去处理)->worker进程负责处理请求\nworker 进程则一般有多个(具体数量根据实际需要配置)，每个进程内部都嵌入了一个 PHP 解释器，是 PHP 代码真正执行的地方。\n master 进程做的事情是 PHP环境初始化、事件监听(重启/重载、关闭、分发请求)、子进程状态\nhttps://youngperson.github.io/blog/#/posts/16\n### 如何优化 mysql \n### 如何防 SQL 注入\n1 表单尽量用 post 提交,核心用户验证都走 post,避开 get容易暴露客户数据\n2 使用HTTP_REFERER 检查源文件是否来自本系统\n3 开启addslashes在特殊符号前加\\\n4 使用htmlspecialchars对字符串转实体\n5 用户授权登录\n6 使用PDO\n\n数据库字段冗余，增添索引、优化sql、分库分表 主从分离  \n### 常用 git 命令\ngit add git log git pull git push  git remote git checkout \n### php7常用新特性\n比如标量类型声明、返回类型声明\n### 自动加载如何实现的\nspl_autoload_register composer\n### 用过哪些PHP扩展\ncurl mb \n### php 异步如何实现\ncurl_multi_exec \n### 了解的微服务\n\n### redis 过期如何处理\n惰性删除与定期删除\n### explain 关注哪些\ntype 字段 const、eq_reg、ref、range、index和ALL\n### 对你最有挑战的项目是怎样的\n\n### laravel 优势是什么\n# 非技术问题\n为什么从上家公司离职？\n未来三年的职业规划的怎样的？\n你有什么问的？\n\n# 资源 \n\n[PHP面试准备]( https://github.com/xianyunyh/PHP-Interview)\n\n[关于面试/谈Offer/程序员职场生涯等]( https://github.com/lietoumai/awesome-offer)\n\n[少写PHP \"烂\"代码](https://segmentfault.com/a/1190000015274515) \n\n[PHP工程师面试题目]( https://github.com/hookover/php-engineer-interview-questions)\n\n[PHPer 面试指南](https://github.com/todayqq/PHPerInterviewGuide )\n\n[一个16年毕业生所经历的php面试](https://github.com/OMGZui/noteBook/blob/master/level.md)\n\n[找工作遇到的面试题目]( https://cloud.tencent.com/developer/article/1104156 )\n\n[大话编程]( https://mp.weixin.qq.com/s/nCx7Jb5WRXGzkpsuth6LAw) \n\nhttps://mp.weixin.qq.com/s/13OJ8YAXLj3tqAC0aZ1e_Q\n\n[strace帮助你调试PHP代码]( https://www.jianshu.com/p/cbc716f8a932? )\n\n[Resetful API 设计规范](https://godruoyi.com/posts/resetful-api-design-specifications )\n\n[Java 基础知识、底层原理 面试]( https://github.com/crossoverJie/Java-Interview)\n\n[PHP基础数据结构专题系列目录地址](https://github.com/xx19941215/light-tips)\n\n[后端架构师技术图谱]( https://github.com/xingshaocheng/architect-awesome)\n\n[记一次面试，分享我整理的答案](https://laravel-china.org/articles/9143/write-an-interview-and-share-my-answers)\n\n[PHP 面试知识点汇总 ](https://github.com/eaglewu/php-interview-best-practices-in-china )\n\n[平时积累 ](https://github.com/OMGZui/noteBook)\n\n[PHP 代码简洁之道](https://github.com/ryanmcdermott/clean-code-javascript )\n\n[PHP PSR 标准规范]( https://www.twle.cn/l/yufei/phppsr/php-psr-index.html)\n\n [psr](https://laravel-china.org/docs/psr )\n \n[PHP 开发知识结构 ](https://github.com/han8gui/PHPer) \n\n[PHP多进程系列笔记](https://mp.weixin.qq.com/s/af2my0IC4VIo1WNaCvZAaA)\n\n[Redis从入门到实践]( https://juejin.im/post/5a912b3f5188257a5c608729) \n\n[浅谈消息队列及常见的消息中间件](https://juejin.im/post/5b41fe36e51d45191252e79e)\n\n[《程序员练级攻略》推荐必读书籍清单 ](https://time.geekbang.org/column/article/10793) \n\n[redis开发设计规范及案例分析](https://mp.weixin.qq.com/s/vS8IMgBIrfGpZYNUwtXrPQ )\n\n[MySQL运维：索引与查询性能优化](https://juejin.im/entry/5b444bf05188251a8d36d034)\n\n[从输入URL到页面展示到底发生了什么 ](https://juejin.im/entry/5b44155f6fb9a04f932fdf80)\n\n[数据结构与算法](https://mp.weixin.qq.com/s/FslsYpofN5vE20TEfJNwrw)\n\n[PHP面试：说说你理解的二叉树吧]( https://segmentfault.com/a/1190000015635928)\n\n[初中级PHP面试基础汇总 ](https://segmentfault.com/a/1190000015412706)\n\n https://segmentfault.com/a/1190000010250591 \n \n[php 经典排序算法（解析）]( https://segmentfault.com/a/1190000011751912)\n\n[PHP面试之一：PHP基础知识点]( https://segmentfault.com/a/1190000011335262)\n\n[PHPer、Laravel 面试可能会遇到的问题及答案](https://github.com/todayqq/caseInterviewQuestions )\n\n[PHPer 面试指南-扩展阅读资源整理](https://segmentfault.com/a/1190000012971148)\n\n[3年PHPer的面试总结]( http://coffeephp.com/articles/4)\n\n[PHP 无限级分类最佳实践](https://segmentfault.com/a/1190000008265618)\n\n[数据库面试题(开发者必看)]( https://segmentfault.com/a/1190000013517914)\n\n[10个值得深思的PHP面试问题](https://segmentfault.com/a/1190000005032279)\n\n[php 高并发](https://www.cnblogs.com/phpper/p/6716248.html)\n\n[SegmentFault 技术周刊 Vol.31 - 码农也要学算法](https://segmentfault.com/a/1190000010600318) \n\n[SegmentFault 技术周刊 Vol.6 - 面试那些事儿](https://segmentfault.com/a/1190000006950447) \n\n[笔试面试](https://segmentfault.com/a/1190000012770931)\n\n[PHP常见算法-面试篇 ](http://www.cnblogs.com/zswordsman/p/5824599.html)\n\n[PHPer 面试指南-扩展阅读资源整理](https://segmentfault.com/a/1190000012971148)\n\n[shell在手分析服务器日志不愁]( https://segmentfault.com/a/1190000009745139)\n\n[PHPer 面试可能会遇到的问题](https://github.com/justcodingnobb/fuck-php-interview)\n\n[程序员的自我修养](https://www.kancloud.cn/kancloud/a-programmer-prepares/78223)\n\n[小土刀的面试刷题笔记](https://wdxtub.com/interview/14520847747820.html)\n\n[笔试面试知识整理](https://github.com/HIT-Alibaba/interview)\n\n[MySQL 避坑宝典](https://github.com/XiaoMi/soar/blob/master/doc/heuristic.md)\n"
  },
  {
    "path": "love_china.py",
    "content": "#Python表白祖国  https://weibo.com/5780793700/I9lerpmzZ?type=comment#_rnd1570079816878  \nfrom turtle import*#从海龟绘图( Turtle)模块中导入全部西数(星号*代表全部\nsetup(600,400,0,0)#设定大小,四个参数依次为:宽度、高度、起始点x值、起始点y值\nbgcolor('red')#背景颜色设为红色('red')\nfi1lcolor('yellow')\ncolor('ye11ow')#线条及填充颜色设为黄色(\"ye1ow\nspeed(10)#画笔运行速度\n#大五角星部分\nbegin_fi11()#开始填充\nup()#提起(up)画笔,此时移动画笔,不会进行绘画\ngoto(-280,100)#前任(goto)指定坐标(这里是280,100)\ndown()#放下(down)画笔,此时移动画笔,直接进行绘画\nfor i in range(5):#for循环语句,范围( range)设为5,意思是以下指令重复5次,用于画出五角星的五条边\n      fd(150)# forwardd的简写,意为向前移动画笔150单位\n      rt(144)# righte的简写,向右旋转144度(这两条指令重复5次)\nend_fill()#结東填充\n#四颗小五角星部分\nbegin_fill()#开始填充\nup()#提起画笔\ngoto(-100,180)#前住指定坐标\nheading(305)#设置朝向角度(这里是305度)\ndown()#放下画笔\nfor i in range(5):#for循环语句,同上\n      fd(50)#向前50单位\n      1t(144)#1eft的简写,向左旋转144度\nend_fi11()#结東填充\nbegin_fi11()其余三颗小五角星原理相同\nup()\ngoto(-50,110)\nsetheading (30)\nfor i in range(5):\n     fd(50)\n     t(144\nend_fill()\nbegin_fill()\nup()\ngoto(-40,50)\nsetheading (5)\ndown ()\nfor i in range(5):\n    fd(50)\n    rt(144)\nend_fill()\nbegin_fill()\ngoto(-100,10)\nsetheading (300)\ndown ()\nfor i in range(5):\n    fd(50)\n    1t(144)\nend_fill()\n"
  }
]