queue:work 原理分析

最近在项目中使用了队列,因此研究一下相关的源码。本文只是粗略的进行分析,如果发现了错误欢迎大家讨论交流。

基本实现

php artisan queue:work 的代码实现是在Illuminate\Queue\Console\WorkCommand中。那么,让我们看一下它是怎样处理的:

public function handle()
{
	if ($this->downForMaintenance() && $this->option('once')) {
		return $this->worker->sleep($this->option('sleep'));
	}

	$this->listenForEvents();

	$connection = $this->argument('connection') ?: $this->laravel['config']['queue.default'];

	$queue = $this->getQueue($connection);

	$this->runWorker($connection, $queue);	
}


protected function runWorker($connection, $queue)
{
	// 设置缓存
	$this->worker->setCache($this->laravel['cache']->driver());

	return $this->worker->{$this->option('once') ? 'runNextJob' : 'daemon'}(
		$connection, $queue, $this->gatherWorkerOptions()
	);

上面的代码逻辑很简单,代码的核心逻辑在最后一行runWorker中,根据传参的不同,执行方法可能为 runNextJob 或者 daemon,由于本文的目的为研究原理,故只分析 daemon 方法。

Laravel 请求生命周期

本文主要介绍了一个 Http 请求在 Laravel 中是怎样处理的。

public/index.php

所有 Laravel 程序均起始于 public/index.php 文件。

<?php

define('LARAVEL_START', microtime(true));

require __DIR__.'/../vendor/autoload.php';

$app = require_once __DIR__.'/../bootstrap/app.php';

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);

index 里的代码很简单,首先定义了一个常量 LARAVEL_START ,接着引入了 composer 库中的 autoloader。随后加载 Laravel 的 Application 实例。接着到了最重要的部分,通过 Http Kernel 处理请求,最后将响应进行返回。

深入理解 Laravel 中的数据库连接

本文为 Diving Laravel 的译文。 在这篇文章中我们将会探索 Laravel 中的多数据库连接。

Laravel API throttle 原理分析

Laravel 自从5.2版本起就加入了throttle中间件来进行限流。下面我们看一下具体的原理是怎样实现的。

Laravel 登录原理剖析

简介

Laravel 中实现用户认证非常简单。实际上,几乎所有东西都已经为你配置好了。其配置文件位于 config/auth.php,其中包含了用于调整认证服务行为的注释清晰的选项配置。

其核心是由 Laravel 的认证组件的「看守器」和「提供器」组成。看守器定义了该如何认证每个请求中用户。例如,Laravel 自带的 session 看守器会使用 session 存储和 cookies 来维护状态。

提供器中定义了该如何从持久化的存储数据中检索用户。Laravel 自带支持使用 Eloquent 和数据库查询构造器来检索用户。当然,你可以根据需要自定义其他提供器。

不过对大多数应用而言,可能永远都不需要修改默认身份认证配置。

《软技能:代码之外的生存准则》读后感

我觉得不管是刚毕业的程序员,还是已经毕业多年的都应该读一下这本书。

职业篇

设定目标

在程序员的发展道路上,我们每个人都会给自己定一个目标,比如当一名架构师、全栈工程师、项目经理、CTO 等等。在设立好一个大的目标后,需要将一个大目标分解为 N 个对应的小目标。如果没有进行分解,那么当你偏离你的目标时也不会察觉。

简单概括为 设定一个大目标,然后分解为若干个小目标,例如:月度目标,周目标,每日目标。 最后每天对照大目标,每日三省吾身——我在追求什么。

5个让你的开发更加轻松的辅助函数

本文为翻译文章,原文章地址: 5 Laravel Helpers to Make Your Life Easier

在Laravel框架中有许多的辅助函数来帮助开发者更加有效率的进行开发。在这篇文章中,我会列出我个人比较喜欢的5个辅助函数

data_get()

data_get()辅助方法能够让你使用[.]符号来获取数组或者对象中的值。’array_get()’方法也是同样的道理。如果数组或者对象的key不存在的话,这个方法第三个可选参数可以设置一个默认值。

$array = ['albums' => ['rock' => ['count' => 75 ]]];

$count = data_get($array, 'albums.rock.count'); // 75
$avgCost = data_get($array, 'albums.rock.avg_cost', 0); // 0

$object->albums->rock->count = 75;

$count = data_get($object, 'albums.rock.count'); // 75
$avgCost = data_get($object, 'albums.rock.avg_cost', 0); // 0