第三选择

刻意练习,日渐精进

0%

PHP 垃圾回收机制

PHP 底层给变量赋值常量值时,会创建一个 zval 容器,容器有两个字段,is_ref 标识变量是否引用, refcount 标识指向 zval 容器的变量个数。
当 zval 容器的 refcount 归零并被检测到时,会从内存中删除。 PHP 会在根缓存区满了或者调用 gc_collect_cycles()函数时执行垃圾回收。

垃圾回收机制对性能的影响有以下两个方面:

  1. 节省内存空间的占用
  2. 增加脚本的执行时间

PHP 生成器的使用

生成器是 PHP 5.5 新发布的功能,提供了一种低性能开销和复杂度的方式去实现流程控制中的数据存储及输出。它不会实时返回生成的数组,而是在实际调用时逐步将得到的数据处理后输出。

举个简单的例子,range() 函数能够得到一个按指定步长递增/递减的数组,这个数组需要占用一定的内存。
如果传入 range(0,1000000),得到的数组所占用的空间将超过 100mb。然后我们通过生成器的方式来改造一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function xrange($start, $limit, $step = 1) {
if ($start < $limit) {
if ($step < 0) {
throw new Exception("Step must be +ev");
}

for ($i = start; $i <= $limit; $i += $step) {
yield $i;
}
} else {
if ($step > 0) {
throw new Exception("Step must be -ev");
}

for ($i = $start; $i >= $limit; $i += $step ) {
yield $i;
}
}
}

xrange(0, 1000000);

使用 xrange() 方法,相同的参数,占用的内存不到1000字节。这个特点,使得我们可以很方便地处理大文件(大至几个G的文件),利用 yield 关键字,不需要将整个文件的数据保存到内存中,每次只读取一行的数据来完成逻辑处理。

不知道平时小伙伴在用 Laravel 返回响应时,有没有想过:Laravel 到底是怎么把响应返回给到客户端的呢?简单的一句 response()->json() 的背后,经历了什么样曲折坎坷的故事?今天走进 Laravel,让我们来一探究竟。

response() 返回的是什么?

首先从最表层开始,我们在控制器中要输出 Json 响应时,只需要一句 response()->json() 就可以输出 Json 响应了,那我们先来看看这个 response() 输出的是什么:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/**
* Return a new response from the application.
* 从容器中返回一个响应类
*
* @param \Illuminate\View\View|string|array|null $content
* @param int $status
* @param array $headers
* @return \Illuminate\Http\Response|\Illuminate\Contracts\Routing\ResponseFactory
*/
function response($content = '', $status = 200, array $headers = [])
{
$factory = app(ResponseFactory::class);

if (func_num_args() === 0) {
return $factory;
}

return $factory->make($content, $status, $headers);
}
阅读全文 »

各位童鞋,今天我们来研究一下 Laravel 的生命周期,看看 Laravel 都在做些什么,话不多说,先贴代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 定义一个常量,记录框架启动的时间
define('LARAVEL_START', microtime(true));

// 注册 composer 的自动加载机制
require __DIR__.'/../vendor/autoload.php';

// 初始化容器
$app = require_once __DIR__.'/../bootstrap/app.php';

// app.php 中已经绑定了 Illuminate\Contracts\Http\Kernel::class
// 所以这里得到的是 App\Http\Kernel::class 的实例
$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

// 获取请求,处理完成后得到响应
$response = $kernel->handle(
$request = Illuminate\Http\Request::capture()
);

// 输出响应到客户端
$response->send();

// 调用中间件的 terminate 方法,以及容器的 terminate 方法,结束
$kernel->terminate($request, $response);

关于自动加载机制,如果有不了解的同学,可以先阅读一下这篇文章: PHP 的自动加载机制,至于 Composer 是怎么实现自动加载的,我们这篇文章里也给大家唠唠:Composer的自动加载机制

阅读全文 »

今天在修改项目 bug 的时候,有这么一个场景,需要去同步远程数据库的数据,但是不能确定是要新增还是更新,因此需要每一条进行判断。

一开始做的时候,是在遍历并进行判断以后,针对每一条的接口来执行数据库的插入或更新的操作。(现在看看觉得很蠢,性能太差了)

使用框架进行CURD操作时,每执行一次语句都需要连接一次数据库,并执行优化、分析的操作。因此希望可以尽可能的一次执行多条记录的操作。

批量插入的操作,日常中使用的非常多了,就不多赘述了,主要讲讲批量更新的语法。

因为日常是使用 Laravel 框架的,所以我也封装好了一个方法,有需要的可以直接拿去使用。

阅读全文 »

作为一名 WEB 开发,所做的项目大都是通过 HTTP 协议建立连接的,但又有多少人清楚 HTTP 建立连接的过程究竟是怎么一回事呢?这本书也发现了现今环境下存在的这个问题,于是选择用图文并茂,更浅显易懂的方式,来讲述 HTTP 的相关知识。在学习完本书,对 HTTP 协议有了一个基础的认识后,也计划花点时间拜读一下 《HTTP权威指南》和 《TCP/IP 详解,卷1》两本圣经,向计算机世界的更深处出发。

阅读全文 »

主题:

  1. NexT 主题
    简约的黑白搭配,还有各类拓展,值得推荐,github地址

功能性:

  1. Leancloud: 阅读统计,为每篇文章添加阅读次数显示
    配置操作文档

    注意要注册国际版的,国内的需要添加已备案的域名,比较麻烦。

  2. Valine: 评论系统,可以增加博客的互动。文档说明

    如果要禁用某些页面的评论的话:可以在文章的 Front-matter 增加 comments:false 的属性

阅读全文 »

本次项目的后台使用 iview-admin 搭建,前后端是分离的,需要给后台管理也写一套接口(看了几篇资料说可以把iview-admin 放到 laravel 项目里跑,但没有成功,卒),于是想用 passport 来做后台接口的认证。谁知过程一波三折,折腾了两天,算是摸清了坑也爬起来了。坑了一次不能再被坑第二次,也不希望后面的人接着被坑,于是就有了这篇文章,给大家介绍一下整体的流程和避坑操作。

阅读全文 »