您的当前位置:首页laravel学习之ArrayAccess

laravel学习之ArrayAccess

2023-11-11 来源:六九美食网

->app[‘router‘] = $this->app->share(function ($app) { return new Router($app[‘events‘], $app);});

 

这里找了好久没有找到变量$this->app,断点进去后发现原来是调用了spl库里面的ArrayAccess接口,这个接口可以令对象像数组一样访问而且通过重写方法可以加上自己的逻辑,以下就是我了解这个接口的笔记。
class arr implements ArrayAccess{ public $a = array(); public function offsetExists($offset)//看数据是否存在 { // TODO: Implement offsetExists() method. echo "判断存在"; } public function offsetGet($offset)//获取数据 { // TODO: Implement offsetGet() method. echo "<br>"; echo "获取数据"; echo "<br>"; } public function offsetSet($offset, $value)//设置数据 { // TODO: Implement offsetSet() method. echo "设置数据"; echo "<br>"; } public function offsetUnset($offset)//删除数据 { // TODO: Implement offsetUnset() method. echo "删除数据"; echo "<br>"; }}$a = new arr();$a[‘name‘] = ‘aaa‘;//调用offsetSet,输出设置数据if (isset($a[‘name‘])) {}//offsetExists,输出判断存在echo $a[‘name‘];//offsetGet,输出获取数据unset($a[‘name‘]);//offsetUnset,输出删除数据

 

laravel学习之ArrayAccess

标签:array   function   name   this   turn   method   笔记   eve   laravel   

小编还为您整理了以下内容,可能对您也有帮助:

如何高效地学习 Laravel 框架

推荐学习路径

1. 框架的使用知识学习

基于以上的思想,我创建了 《Laravel 实战课程》,计划中有三本(也有可能更多),分别是:

    第一本 —— 《Laravel 入门教程 - 从零到部署上线》

    第二本 —— 《Laravel 进阶课程 - 从零开始构建论坛系统》

    第三本 —— 《Laravel 高级课程 - 构架 API 服务器》

    第一本书教授如何使用 Laravel 一步一步构建一个类似新浪微博的应用,书中很多技术话题会被一带而过,这是有意而为之的,我们希望让读者保持对编码线索的专注,不被篇幅悠长的名词解释分心。通过阅读本教程,你将学到如 HTML、CSS、JavaScript、PHP 和 Laravel 等 Web 开发相关的基础知识。不仅如此,本书还会对这些基础知识点进行延伸扩展,为你讲解一些在 Web 开发中更为专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流、Bootstrap 框架基本使用等。这些知识将为你未来的编程开发奠定下坚实的基础。

    第二本以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。编码规范遵循 Laravel 项目开发规范 ,应用程序架构思路贴近 Laravel 框架的设计哲学。在论坛系统的构建中,我们将学到多角色用户权限系统、管理员后台、注册验证码、图片上传、图片裁剪,XSS 防御、自定义命令行、自定义中间件、任务调度、队列系统的使用、应用缓存、Redis、模型事件监控、表单验证、消息通知、邮件通知、模型修改器等知识。在本课程的学习中,你不仅能学到使用 Laravel 开发一个论坛项目,还能学到安全优先、高扩展性的大型项目架构经验。

    第三本将以构建 API 服务器为目标,来展开。目前本课程正在紧张撰写中,敬请期待。

    2. 框架的底层实现学习

    学完了以上三本书,你将拥有一定的项目开发经验,对框架的功能使用也会有一个比较全面的系统性理解。这时候,会是学习『底层实现』的好时机。

    底层实现的知识学习,可以从文档开始,打开 Laravel 的文档中心 —— d.laravel-china.org ,找到最新版本的 Laravel 文档,然后仔细阅读 2、3 遍。因为有了上面的项目经验,此时的文档阅读啃起来会轻松多了。
    阅读文档后,可以尝试看下 Laravel 底层的源码,看看这些框架的功能都是怎么实现的。

    学习过程中可以适当做笔记,例如:

    zhangbao 同学的 Laravel 文档阅读笔记

    leoyang 同学的 Laravel 源码分析笔记

    错误的学习方法

    一上来就开始啃文档 d.laravel-china.org 。

    如果你是新手,有太多的新概念你需要学习,你会发现学习起来非常艰难,甚至怀疑文档是不是写的太烂了(社区里经常出现这种抱怨)。
    事实上,不是文档写的太烂,而是你把文档用错了。文档的『目的』是快速查阅,一份优秀文档的标准是语言简练,释义,这个 Laravel 的文档做的很棒。但是,文档并不适合做入门学习使用,上面我们已经讲过,原因是信息量太大。

    寻找网络上零散的课程进行学习。

    如果你想学习单个概念,这些零散的小课程会很方便。但是,如果是想以阅读大量课程来达到系统性学习的目的,你将会很失望。很多时候你会感觉 —— 你好像学了很多,学了很久,以为自己学会了,但是心里还是没底气。
    你需要的是通过项目,完整的项目,将所有的知识串起来去记忆。你的作品,清清楚楚摆在面前,看着你一步步构建出来的一套系统,自信心也会有所增加。

    一开始就学习高级话题,如 服务容器、服务提供器、Facades、Contracts、Repository 等

    很多时候你会发现这些话题晦涩难懂,很难学习。并且即使你毅力比较好,死记硬背,很快也会忘记,学习效率非常低下。然后最重要的,学会这些概念,并无法使你掌握构建一个完整项目的能力。

如何高效地学习 Laravel 框架

推荐学习路径

1. 框架的使用知识学习

基于以上的思想,我创建了 《Laravel 实战课程》,计划中有三本(也有可能更多),分别是:

    第一本 —— 《Laravel 入门教程 - 从零到部署上线》

    第二本 —— 《Laravel 进阶课程 - 从零开始构建论坛系统》

    第三本 —— 《Laravel 高级课程 - 构架 API 服务器》

    第一本书教授如何使用 Laravel 一步一步构建一个类似新浪微博的应用,书中很多技术话题会被一带而过,这是有意而为之的,我们希望让读者保持对编码线索的专注,不被篇幅悠长的名词解释分心。通过阅读本教程,你将学到如 HTML、CSS、JavaScript、PHP 和 Laravel 等 Web 开发相关的基础知识。不仅如此,本书还会对这些基础知识点进行延伸扩展,为你讲解一些在 Web 开发中更为专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流、Bootstrap 框架基本使用等。这些知识将为你未来的编程开发奠定下坚实的基础。

    第二本以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。编码规范遵循 Laravel 项目开发规范 ,应用程序架构思路贴近 Laravel 框架的设计哲学。在论坛系统的构建中,我们将学到多角色用户权限系统、管理员后台、注册验证码、图片上传、图片裁剪,XSS 防御、自定义命令行、自定义中间件、任务调度、队列系统的使用、应用缓存、Redis、模型事件监控、表单验证、消息通知、邮件通知、模型修改器等知识。在本课程的学习中,你不仅能学到使用 Laravel 开发一个论坛项目,还能学到安全优先、高扩展性的大型项目架构经验。

    第三本将以构建 API 服务器为目标,来展开。目前本课程正在紧张撰写中,敬请期待。

    2. 框架的底层实现学习

    学完了以上三本书,你将拥有一定的项目开发经验,对框架的功能使用也会有一个比较全面的系统性理解。这时候,会是学习『底层实现』的好时机。

    底层实现的知识学习,可以从文档开始,打开 Laravel 的文档中心 —— d.laravel-china.org ,找到最新版本的 Laravel 文档,然后仔细阅读 2、3 遍。因为有了上面的项目经验,此时的文档阅读啃起来会轻松多了。
    阅读文档后,可以尝试看下 Laravel 底层的源码,看看这些框架的功能都是怎么实现的。

    学习过程中可以适当做笔记,例如:

    zhangbao 同学的 Laravel 文档阅读笔记

    leoyang 同学的 Laravel 源码分析笔记

    错误的学习方法

    一上来就开始啃文档 d.laravel-china.org 。

    如果你是新手,有太多的新概念你需要学习,你会发现学习起来非常艰难,甚至怀疑文档是不是写的太烂了(社区里经常出现这种抱怨)。
    事实上,不是文档写的太烂,而是你把文档用错了。文档的『目的』是快速查阅,一份优秀文档的标准是语言简练,释义,这个 Laravel 的文档做的很棒。但是,文档并不适合做入门学习使用,上面我们已经讲过,原因是信息量太大。

    寻找网络上零散的课程进行学习。

    如果你想学习单个概念,这些零散的小课程会很方便。但是,如果是想以阅读大量课程来达到系统性学习的目的,你将会很失望。很多时候你会感觉 —— 你好像学了很多,学了很久,以为自己学会了,但是心里还是没底气。
    你需要的是通过项目,完整的项目,将所有的知识串起来去记忆。你的作品,清清楚楚摆在面前,看着你一步步构建出来的一套系统,自信心也会有所增加。

    一开始就学习高级话题,如 服务容器、服务提供器、Facades、Contracts、Repository 等

    很多时候你会发现这些话题晦涩难懂,很难学习。并且即使你毅力比较好,死记硬背,很快也会忘记,学习效率非常低下。然后最重要的,学会这些概念,并无法使你掌握构建一个完整项目的能力。

laravel中的$this['key']形式原理

这个由于这种写法的类实现了ArrayAccess 这个接口以后就可以实现了像访问数组一样访问对象,即
$this['key'] == $this->key

laravel中的$this['key']形式原理

这个由于这种写法的类实现了ArrayAccess 这个接口以后就可以实现了像访问数组一样访问对象,即
$this['key'] == $this->key

如何安装Laravel框架

通过 Laravel 安装器安装

1.先下载 Laravel 安装器 PHAR 文件。为了方便起见,将该文件重命名为 laravel 并移动至 /usr/local/bin目录。完成后,只需在你指定的目录下输入简单的 laravel new 命令即可创建一个全新的Laravel安装。例如,laravel new blog 将创建一个名为 blog 的目录,该目录中包含了一份全新的Laravel安装以及所需的依赖项。这种安装方法比通过 Composer 安装要快许多

通过 Composer create-project 命令安装Lar

1.还可以通过在命令行执行 Composer create-project 命令来安装Laravel:

composer create-project laravel/laravel --prefer-dist

通过下载Laravel包安装

1.Composer安装完成后,下载最新版Laravel框架,把它解压缩到你服务器上的一个目录中。然后在Laravel应用的根目录下运行命令行命令 php composer.phar install (或者 composer install )来安装所有的框架依赖包。在此过程中,为了成功完成安装,你需要在服务器上安装好Git。

当Laravel框架安装好后,你可以使用命令行命令 php composer.phar update 来更新框架。

END

服务器环境要求

1.Laravel框架有一些系统要求:

PHP最低版本: 5.3.7MCrypt PHP扩展

从PHP 5.5版本开始,针对某些操作系统的安装包需要你自己手工安装PHP的JSON扩展模块。如果你使用的是Ubuntu,可以通过, apt-get install php5-json 命令直接安装。

配置

Laravel框架几乎无需配置就可立即使用。你可以自由地快速开始开发。然而,你也许希望先查看下app/config/app.php 配置文件和相关的文档说明。它包含了一些你也许要修改的配置选项,如 时区 和 地区 等。

权限设置

Laravel框架有一个目录需要额外设置权限: 需要为 app/storage 目录下的文件设置写权限。

路径设置

一些框架目录路径是可以设置的。如果需要改变这些目录的位置,可以查看 bootstrap/paths.php 文件中的设置。

Laravel框架通过设置 public/.htaccess 文件去除链接中的index.php。 如果你你的服务器使用的是Apache,请开启mod_rewrite 模块。

为什么说PHP框架Laravel最值得推荐

技术层面上

从技术上讲,Laravel 更加激进和现代化 —— PHP7 的适用,Composer 包依赖,测试覆盖率 100%,合理的版本发布计划,优雅的架构设计(中间件、路由、Artisan 命令行、代码迁移、假数据填充),再加上精心设计接口带来的愉悦编码体验,可以说 Laravel 很多地方都做对了。
数据分析趋势

从趋势讲,因为 Laravel 很多地方都做对了,PHP 社区对其接受度极高,以下的几张图可以说明一切。
图一:Github 上最受欢迎的 PHP 项目



图二:谷歌搜索的 Trending



图三:编程网站 Sitepoint 上的用户调查第一名



看完上面对比,你大概就知道该选择哪个了,大部分情况下我都会选择第一个,道理很简单,学习的人多, 资料多,社区 活跃。
Laravel 开发者社区

Laravel 在国内的生态圈发展也日趋成熟,你可以很轻松的在网上找到很多 Laravel 相关的中文学习资料、技术讨论社区:

    Laravel China 社区 - 国内最大的 Laravel 开发者社区;

    Laravel 中文文档 - Laravel China 社区维护的中文文档,涵盖 5.1, 5.2, 5.3, 5.4, 5.5 版本;

    Laravel 资讯专栏 - 为 Laravel 开发者提供最新最热的技术资讯

    Laravel CheatSheat - Laravel 速查表

    Composer 中文镜像 - Packagist 中国全量镜像,让 Composer 速度如飞;

    《Laravel 入门教程 - 从零到部署上线》

    《Laravel 进阶课程 - 从零开始构建论坛系统》

    好吧!其实框架没有最好,只有适合你的才是最好的。深入了解2个以上框架,对比其中处理问题的方法和思路,能选用相应组件和优化框架来处理你的项目问题的时候,也许你就是个中高手了!

技术层面上

从技术上讲,Laravel 更加激进和现代化 —— PHP7 的适用,Composer 包依赖,测试覆盖率 100%,合理的版本发布计划,优雅的架构设计(中间件、路由、Artisan 命令行、代码迁移、假数据填充),再加上精心设计接口带来的愉悦编码体验,可以说 Laravel 很多地方都做对了。
数据分析趋势

从趋势讲,因为 Laravel 很多地方都做对了,PHP 社区对其接受度极高,以下的几张图可以说明一切。
图一:Github 上最受欢迎的 PHP 项目



图二:谷歌搜索的 Trending



图三:编程网站 Sitepoint 上的用户调查第一名



看完上面对比,你大概就知道该选择哪个了,大部分情况下我都会选择第一个,道理很简单,学习的人多, 资料多,社区 活跃。
Laravel 开发者社区

Laravel 在国内的生态圈发展也日趋成熟,你可以很轻松的在网上找到很多 Laravel 相关的中文学习资料、技术讨论社区:

    Laravel China 社区 - 国内最大的 Laravel 开发者社区;

    Laravel 中文文档 - Laravel China 社区维护的中文文档,涵盖 5.1, 5.2, 5.3, 5.4, 5.5 版本;

    Laravel 资讯专栏 - 为 Laravel 开发者提供最新最热的技术资讯

    Laravel CheatSheat - Laravel 速查表

    Composer 中文镜像 - Packagist 中国全量镜像,让 Composer 速度如飞;

    《Laravel 入门教程 - 从零到部署上线》

    《Laravel 进阶课程 - 从零开始构建论坛系统》

    好吧!其实框架没有最好,只有适合你的才是最好的。深入了解2个以上框架,对比其中处理问题的方法和思路,能选用相应组件和优化框架来处理你的项目问题的时候,也许你就是个中高手了!

为什么说PHP框架Laravel最值得推荐

技术层面上

从技术上讲,Laravel 更加激进和现代化 —— PHP7 的适用,Composer 包依赖,测试覆盖率 100%,合理的版本发布计划,优雅的架构设计(中间件、路由、Artisan 命令行、代码迁移、假数据填充),再加上精心设计接口带来的愉悦编码体验,可以说 Laravel 很多地方都做对了。
数据分析趋势

从趋势讲,因为 Laravel 很多地方都做对了,PHP 社区对其接受度极高,以下的几张图可以说明一切。
图一:Github 上最受欢迎的 PHP 项目



图二:谷歌搜索的 Trending



图三:编程网站 Sitepoint 上的用户调查第一名



看完上面对比,你大概就知道该选择哪个了,大部分情况下我都会选择第一个,道理很简单,学习的人多, 资料多,社区 活跃。
Laravel 开发者社区

Laravel 在国内的生态圈发展也日趋成熟,你可以很轻松的在网上找到很多 Laravel 相关的中文学习资料、技术讨论社区:

    Laravel China 社区 - 国内最大的 Laravel 开发者社区;

    Laravel 中文文档 - Laravel China 社区维护的中文文档,涵盖 5.1, 5.2, 5.3, 5.4, 5.5 版本;

    Laravel 资讯专栏 - 为 Laravel 开发者提供最新最热的技术资讯

    Laravel CheatSheat - Laravel 速查表

    Composer 中文镜像 - Packagist 中国全量镜像,让 Composer 速度如飞;

    《Laravel 入门教程 - 从零到部署上线》

    《Laravel 进阶课程 - 从零开始构建论坛系统》

    好吧!其实框架没有最好,只有适合你的才是最好的。深入了解2个以上框架,对比其中处理问题的方法和思路,能选用相应组件和优化框架来处理你的项目问题的时候,也许你就是个中高手了!

技术层面上

从技术上讲,Laravel 更加激进和现代化 —— PHP7 的适用,Composer 包依赖,测试覆盖率 100%,合理的版本发布计划,优雅的架构设计(中间件、路由、Artisan 命令行、代码迁移、假数据填充),再加上精心设计接口带来的愉悦编码体验,可以说 Laravel 很多地方都做对了。
数据分析趋势

从趋势讲,因为 Laravel 很多地方都做对了,PHP 社区对其接受度极高,以下的几张图可以说明一切。
图一:Github 上最受欢迎的 PHP 项目



图二:谷歌搜索的 Trending



图三:编程网站 Sitepoint 上的用户调查第一名



看完上面对比,你大概就知道该选择哪个了,大部分情况下我都会选择第一个,道理很简单,学习的人多, 资料多,社区 活跃。
Laravel 开发者社区

Laravel 在国内的生态圈发展也日趋成熟,你可以很轻松的在网上找到很多 Laravel 相关的中文学习资料、技术讨论社区:

    Laravel China 社区 - 国内最大的 Laravel 开发者社区;

    Laravel 中文文档 - Laravel China 社区维护的中文文档,涵盖 5.1, 5.2, 5.3, 5.4, 5.5 版本;

    Laravel 资讯专栏 - 为 Laravel 开发者提供最新最热的技术资讯

    Laravel CheatSheat - Laravel 速查表

    Composer 中文镜像 - Packagist 中国全量镜像,让 Composer 速度如飞;

    《Laravel 入门教程 - 从零到部署上线》

    《Laravel 进阶课程 - 从零开始构建论坛系统》

    好吧!其实框架没有最好,只有适合你的才是最好的。深入了解2个以上框架,对比其中处理问题的方法和思路,能选用相应组件和优化框架来处理你的项目问题的时候,也许你就是个中高手了!

laravel 怎么检测队列是否执行

队列Service
laravel把队列相关的服务全封装在一个Service里面,通过Queue Service Provider 注册到IOC中.在Queue Serivce里提供了多种服务,关于它做了什么请看以下代码中的注释(代码有点多,就不全部贴出来了)
public function register()
{
// 注册Manager, 而Manager为队列服务的统一入口
$this->registerManager();
// 注册队列的各种命令
$this->registerWorker();

$this->registerListener();
// 注册任务执行失败后的记录
$this->registerFailedJobServices();
// 未知
$this->registerQueueClosure();
}

讲配置文件
在Queue Service注入到IOC后,我们就可以使用队列了。
一个队列服务最基本的就是把任务写入队列,再将其拿出来执行, 很简单.所以队列服务最基本的要素有四点:任务,进队列,出队列,执行.在这里,我们就跟着这四个要素的步伐,看看它们在laravel中是如何实现的.这里,先以官方的示例来分析,有了一个具体概念之后再举一反三,学会它的本质。
任务
队列服务就是围绕着任务进行的.在手册上,通过它的实例SendReminderEmail,我们可以很清楚地知道,laravel可以对一个任务做很多事,比如:可设置重新执行的次数,说明该任务(若失败)可以被执多次(针对的是单个Job);可设置是否可以延迟执行;对该Job设置处理的队列名称,等等.这些功能都是\Illuminate\Bus\Queueable提供的,当然,实例中还有一个\Illuminate\Queue\InteractsWithQueue,而它则是针对Job所用(稍后再说).一个任务建立完成后,就需要使其进入队列了。当然了,除了以上几个特点,还有任务的执行逻辑等等,要全面地了解任务,就需要清楚它的数据结构,其在队列中的数据结构会在进入队列中讲到.
任务进队列
示例中,在定义了任务之后,就将其用Controller中的方法使其进入了队列,那么这一点是如何实现的?
代码在:\Illuminate\Foundation\Bus\DispatchesJobs
protected function dispatch($job)
{
return app(Dispatcher::class)->dispatch($job);
}

/**
* Dispatch a command to its appropriate handler in the current process.
*
* @param mixed $job
* @return mixed
*/
public function dispatchNow($job)
{
return app(Dispatcher::class)->dispatchNow($job);
}

这段代码的意图得了解app(Dispather::class), 这个则在\Illuminate\Bus\BusServiceProvider中表现的很明确了(为什么是这里就不分析了),app(Dispather::class)就是\Illuminate\Bus\Dispatcher.现在,上面代码中的dispatch与 dispatchNow方法就会逐渐清晰起来.简言之,该Dispatcher类做了两件事,执行该任务或把该任务放入队列,也就是将队列任务分为了两种执行方式,立即执行或以消息队列执行,与队列相关的代码如下:
/**
* 把任务分发到队列中
* @param string $command 任务类
*/
public function dispatchToQueue($command)
{
$connection = isset($command->connection) ? $command->connection : null;
// laravel里内置了多种队列服务,这里则解析出来
$queue = call_user_func($this->queueResolver, $connection);

// 队列服务解析不成功则抛出异常
if (! $queue instanceof Queue) {
throw new RuntimeException('Queue resolver did not return a Queue implementation.');
}

// 在任务类中可自定义queue方法进入队列
if (method_exists($command, 'queue')) {
return $command->queue($queue, $command);
} else {
// 系统提供的一种进入队列方式
return $this->pushCommandToQueue($queue, $command);
}
}

/**
* 根据不同的任务属性选择不同的进入队列方式
* 这里所提到的方式在手册中有提到
* @param Queue $queue 队列服务
* @param $command 任务类
*/
protected function pushCommandToQueue($queue, $command)
{
// 该推任务设置了延迟,且设置队列名称
if (isset($command->queue, $command->delay)) {
return $queue->laterOn($command->queue, $command->delay, $command);
}
//设置队列名称
if (isset($command->queue)) {
return $queue->pushOn($command->queue, $command);
}
//设置延迟
if (isset($command->delay)) {
return $queue->later($command->delay, $command);
}
// default
return $queue->push($command);
}

到现在为止,Controller已经展示了一种进入队列的方法,很明显它是经过封装提供的接口,虽然很好用,但有些操作是我们所不必须的,比如:是否立即执行,进入队列就需设置不同的任务参数等等,需要更好的为我们所用,就再深入一点,找出它进入队列的关键点(与Redis交互的地方).上面已经提到call_user_func($this->queueResolver, $connection);会得到一个队列服务,那么$this->queueResolver是什么?在\Illuminate\Bus\BusServiceProvider:23就可以看到:
// 理解这个回调,则需要了解Illuminate\Contracts\Queue\Factory
// 在vendor/laravel/framework/src/Illuminate/Foundation/Application.php:1051 可以看到它与Illuminate\Queue\QueueManager的关系了
$this->app->singleton('Illuminate\Bus\Dispatcher', function ($app) {
return new Dispatcher($app, function ($connection = null) use ($app) {
return $app['Illuminate\Contracts\Queue\Factory']->connection($connection);
});
});

QueueManager
在laravel中,Service对外的统一接口都是其Manager,其中与所需服务交互的基本上是通过__call 方法提供,这种方式有两个优点,一,提供统一的接口,二,分层明确(将实际的处理由__call转发,与配置相关的则由manager自己解决).
现在为了使任务进入队列的过程更清晰,一步一步找到了QueueManager,这个类设置了很多事件接口,和其他连接相关方法.其中connection方法就展示了一个队列服务是如何解析出来的了.
其实这段解析的代码唯一的难点中于:
protected function getConnector($driver)
{
if (isset($this->connectors[$driver])) {
return call_user_func($this->connectors[$driver]);
}

throw new InvalidArgumentException("No connector for [$driver]");
}

为什么这么一段简单的代码就能解析队列服务?查看QueueServiceProvider就一目了然了.其中就注册了很多队列服务.redis的队列服务处理则是\Illuminate\Queue\RedisQueue.
QueueManager的功能现在很清晰了.1,解析队列服务 2,转发(__call)处理到相应的队列服务中 3,提供队列相关接口 .既然QueueManager有这么多队列相关的功能,那么我们完全可以把它作为一个队列处理的入口(直接获取队列服务再进行操作是并不是明智的选择),巧的是laravel也是这么做的.所以现在有两种方式进入队列,1,使用\Illuminate\Foundation\Bus\DispatchesJobs间接与队列服务通信 2,使用QueueManager间接与队列服务通信.当然这些方法都是在\Illuminate\Queue\RedisQueue(队列服务的接口)上扩展的.所以掌握该类,就能明白队列的各种行为了.
RedisQueue
队列服务在lavavel中提供了多种,这里只对以Redis队列服务进行分析学习.所以有关队列的处理都集中在\Illuminate\Queue\RedisQueue.上面也说到了,有两种方式进入队列, 分别使用,看它们产生的任务数据结构有什么区别?(数据结构便于分析,在后面会提到)
在Controller使用 $this->dispatch((new SendReminderEmail()));即以任务类进入
{
"job": "Illuminate\\Queue\\CallQueuedHandler@call",
"data": {
"command": "O:26:\"App\\Jobs\\SendReminderEmail\":4:{s:5:\"queue\";s:5:\"email\";s:10:\"connection\";N;s:5:\"delay \";N;s:6:\"\u0000*\u0000job\";N;}"
},
"id": "7u00jImd8CAns0fQO8jedqkQmnbQsfsr",
"attempts": 1
}

直接使用 Queue::push(SendReminderEmail::class , ['email'=>'123456789@qq.com'],'email');
{
"job": "App\\Jobs\\SendReminderEmail",
"data": {
"email": "123456789@qq.com"
},
"id": "I0OeBIQjJjisQrZ7STX3zexrBLF7Uilx",
"attempts": 1
}

上面讲到,构成消息队列需要两个进程,所以上面的进入队列是一个进程,现在的出队列及执行任务则在另一个进程中执行。lavarel提供了两个命令来启动该进程,quque:work ,queue:litsen 当然,再理解了如何完成这些操作后完全可以自己写一个命令,现在看看它是如何出队列和如何执行任务?
任务出队列
在手册中,对于一个任务可以指定多种属性,比如,延迟,失败次数,队列名称等等,当然,所有可执行操作或功能都得依赖数据结构,数据结构的制定也是为了实现相应的行为.所以,RedisQueue的代码对应上面的数据结构来理解就比较容易了。
RedisQueue是所有队列服务(Redis)的基础接口,所以任务出队列的操作也能在这找到。假设现在已经对RedisQueue的代码已经有点熟悉了,不难发现,有一个稍复杂的pop方法(出队列)。那么,问题出现了,出队列是如何实现的?解决了这个问题,任务出队列就可算是完成了.
队列应有的功能
查看php artisan queue:work --help命令的使用方法,整理有关队列所需的功能或服务:
指定队列名称
任务的执行逻辑
任务执行延迟
任务中失败的最大次数
当然还有其他关于该命令的功能,比如:是否以守护进程执行,是否强制执行,*进程执行的memory,无任务时的等待时间.这些与命令相关的因不同的命令而异,与队列任务无关.这样,在理清队列任务需要的功能后,我们就可以分析它的数据结构,理解代码了.
队列数据结构
数据结构都是依据行为而建立.所以在查看pop方法时,可考虑以上几个点.上面的数据结构中,已经可以看到队列的执行逻辑,所需参数,失败次数,这些一目了然,就不啰嗦了.在整个pop方法中,有这么几个队列,queue:delayed,queue:reserved,queue.本来取出一个任务用lpop就可完成,为什么要多用两个集合(注意,是有序集合不是队列)来完成pop操作呢?因为要实现任务延迟和失败处理.
其执行过程如图:

过程解析:
(1). 取任务,因为要实现延迟的功能,所以在有序集合里的score是过期时间,过期时间的含义则是在此时间之前不执行,也就达到了延迟执行的效果.延迟的含义在这里指的并不是在多少秒后执行,而是在多少秒内不执行.对于过期的任务,就将其rpush到队列中,直到lpop操作将其拿走.
(1).为什么在存在queue:reserved集合并且把lpop的任务zadd进支?因为只要lpop了job就可以将其记录下来,若此时任务还未开始执行进程就非正常终止了,该任务就不会丢失,再次执行时,依据上面的步骤就可以将其取出,防止意外使job丢失.
(2).队列的执行都是依据json中的类来完成,这部分较简单,略.
(3).当任务执行成功时,要手动删除queue:reserved中的任务;当任务执行失败,删除queue:reserved中的任务,再将其记录下来,记录方式是zadd queue:delayed, 并且将该任务的执行次数加一,这个过程RedisQueue已经封装(RedisQueue::release)好了.
这一系列的过程就完成了让队列任务延迟的功能.所以这么复杂的操作都是为了实现延迟的功能,当然,有更好的点子可以考虑自己实现.
执行任务
到此,任务的执行在json数据结构中表现的很明确,整个处理过程也很清晰了.需要注意的是当任务执行成功后要删除任务.对于如何执行出队列,以及如何执行队列任务,可以详细看看queue:work命令(\Illuminate\Queue\Console\WorkCommand::fire), 它是最好的示例;
队列处理命令的自定义
在使用queue:work之后,会发现它并不有处理所有的情况.所以在本文中一直提到过,自写一个处理命令是可行的.当面临queue:work所不能解决的问题时,可以好好考虑下自己编写.在实际开发中,任务的种类繁多,对于不同的任务应该有不同的处理方案.所以,有以下几个问题是经常遇到的:
比如:
调用服务发生错误且由服务提供方造成,需另作记录,而这样的错误不算作job的执行错误
营销短信只能在9:00到20:00之间发送, 所以在该时间段内没有执行的必要
与数据库交互时,数据库连接是有时间*的,而以守护进程的方式执行则无时间*,这样就会报错
所以,面临laravel所提供命令的局限性,有自定义处理命令的能力是很有必要的.

laravel 怎么检测队列是否执行

队列Service
laravel把队列相关的服务全封装在一个Service里面,通过Queue Service Provider 注册到IOC中.在Queue Serivce里提供了多种服务,关于它做了什么请看以下代码中的注释(代码有点多,就不全部贴出来了)
public function register()
{
// 注册Manager, 而Manager为队列服务的统一入口
$this->registerManager();
// 注册队列的各种命令
$this->registerWorker();

$this->registerListener();
// 注册任务执行失败后的记录
$this->registerFailedJobServices();
// 未知
$this->registerQueueClosure();
}

讲配置文件
在Queue Service注入到IOC后,我们就可以使用队列了。
一个队列服务最基本的就是把任务写入队列,再将其拿出来执行, 很简单.所以队列服务最基本的要素有四点:任务,进队列,出队列,执行.在这里,我们就跟着这四个要素的步伐,看看它们在laravel中是如何实现的.这里,先以官方的示例来分析,有了一个具体概念之后再举一反三,学会它的本质。
任务
队列服务就是围绕着任务进行的.在手册上,通过它的实例SendReminderEmail,我们可以很清楚地知道,laravel可以对一个任务做很多事,比如:可设置重新执行的次数,说明该任务(若失败)可以被执多次(针对的是单个Job);可设置是否可以延迟执行;对该Job设置处理的队列名称,等等.这些功能都是\Illuminate\Bus\Queueable提供的,当然,实例中还有一个\Illuminate\Queue\InteractsWithQueue,而它则是针对Job所用(稍后再说).一个任务建立完成后,就需要使其进入队列了。当然了,除了以上几个特点,还有任务的执行逻辑等等,要全面地了解任务,就需要清楚它的数据结构,其在队列中的数据结构会在进入队列中讲到.
任务进队列
示例中,在定义了任务之后,就将其用Controller中的方法使其进入了队列,那么这一点是如何实现的?
代码在:\Illuminate\Foundation\Bus\DispatchesJobs
protected function dispatch($job)
{
return app(Dispatcher::class)->dispatch($job);
}

/**
* Dispatch a command to its appropriate handler in the current process.
*
* @param mixed $job
* @return mixed
*/
public function dispatchNow($job)
{
return app(Dispatcher::class)->dispatchNow($job);
}

这段代码的意图得了解app(Dispather::class), 这个则在\Illuminate\Bus\BusServiceProvider中表现的很明确了(为什么是这里就不分析了),app(Dispather::class)就是\Illuminate\Bus\Dispatcher.现在,上面代码中的dispatch与 dispatchNow方法就会逐渐清晰起来.简言之,该Dispatcher类做了两件事,执行该任务或把该任务放入队列,也就是将队列任务分为了两种执行方式,立即执行或以消息队列执行,与队列相关的代码如下:
/**
* 把任务分发到队列中
* @param string $command 任务类
*/
public function dispatchToQueue($command)
{
$connection = isset($command->connection) ? $command->connection : null;
// laravel里内置了多种队列服务,这里则解析出来
$queue = call_user_func($this->queueResolver, $connection);

// 队列服务解析不成功则抛出异常
if (! $queue instanceof Queue) {
throw new RuntimeException('Queue resolver did not return a Queue implementation.');
}

// 在任务类中可自定义queue方法进入队列
if (method_exists($command, 'queue')) {
return $command->queue($queue, $command);
} else {
// 系统提供的一种进入队列方式
return $this->pushCommandToQueue($queue, $command);
}
}

/**
* 根据不同的任务属性选择不同的进入队列方式
* 这里所提到的方式在手册中有提到
* @param Queue $queue 队列服务
* @param $command 任务类
*/
protected function pushCommandToQueue($queue, $command)
{
// 该推任务设置了延迟,且设置队列名称
if (isset($command->queue, $command->delay)) {
return $queue->laterOn($command->queue, $command->delay, $command);
}
//设置队列名称
if (isset($command->queue)) {
return $queue->pushOn($command->queue, $command);
}
//设置延迟
if (isset($command->delay)) {
return $queue->later($command->delay, $command);
}
// default
return $queue->push($command);
}

到现在为止,Controller已经展示了一种进入队列的方法,很明显它是经过封装提供的接口,虽然很好用,但有些操作是我们所不必须的,比如:是否立即执行,进入队列就需设置不同的任务参数等等,需要更好的为我们所用,就再深入一点,找出它进入队列的关键点(与Redis交互的地方).上面已经提到call_user_func($this->queueResolver, $connection);会得到一个队列服务,那么$this->queueResolver是什么?在\Illuminate\Bus\BusServiceProvider:23就可以看到:
// 理解这个回调,则需要了解Illuminate\Contracts\Queue\Factory
// 在vendor/laravel/framework/src/Illuminate/Foundation/Application.php:1051 可以看到它与Illuminate\Queue\QueueManager的关系了
$this->app->singleton('Illuminate\Bus\Dispatcher', function ($app) {
return new Dispatcher($app, function ($connection = null) use ($app) {
return $app['Illuminate\Contracts\Queue\Factory']->connection($connection);
});
});

QueueManager
在laravel中,Service对外的统一接口都是其Manager,其中与所需服务交互的基本上是通过__call 方法提供,这种方式有两个优点,一,提供统一的接口,二,分层明确(将实际的处理由__call转发,与配置相关的则由manager自己解决).
现在为了使任务进入队列的过程更清晰,一步一步找到了QueueManager,这个类设置了很多事件接口,和其他连接相关方法.其中connection方法就展示了一个队列服务是如何解析出来的了.
其实这段解析的代码唯一的难点中于:
protected function getConnector($driver)
{
if (isset($this->connectors[$driver])) {
return call_user_func($this->connectors[$driver]);
}

throw new InvalidArgumentException("No connector for [$driver]");
}

为什么这么一段简单的代码就能解析队列服务?查看QueueServiceProvider就一目了然了.其中就注册了很多队列服务.redis的队列服务处理则是\Illuminate\Queue\RedisQueue.
QueueManager的功能现在很清晰了.1,解析队列服务 2,转发(__call)处理到相应的队列服务中 3,提供队列相关接口 .既然QueueManager有这么多队列相关的功能,那么我们完全可以把它作为一个队列处理的入口(直接获取队列服务再进行操作是并不是明智的选择),巧的是laravel也是这么做的.所以现在有两种方式进入队列,1,使用\Illuminate\Foundation\Bus\DispatchesJobs间接与队列服务通信 2,使用QueueManager间接与队列服务通信.当然这些方法都是在\Illuminate\Queue\RedisQueue(队列服务的接口)上扩展的.所以掌握该类,就能明白队列的各种行为了.
RedisQueue
队列服务在lavavel中提供了多种,这里只对以Redis队列服务进行分析学习.所以有关队列的处理都集中在\Illuminate\Queue\RedisQueue.上面也说到了,有两种方式进入队列, 分别使用,看它们产生的任务数据结构有什么区别?(数据结构便于分析,在后面会提到)
在Controller使用 $this->dispatch((new SendReminderEmail()));即以任务类进入
{
"job": "Illuminate\\Queue\\CallQueuedHandler@call",
"data": {
"command": "O:26:\"App\\Jobs\\SendReminderEmail\":4:{s:5:\"queue\";s:5:\"email\";s:10:\"connection\";N;s:5:\"delay \";N;s:6:\"\u0000*\u0000job\";N;}"
},
"id": "7u00jImd8CAns0fQO8jedqkQmnbQsfsr",
"attempts": 1
}

直接使用 Queue::push(SendReminderEmail::class , ['email'=>'123456789@qq.com'],'email');
{
"job": "App\\Jobs\\SendReminderEmail",
"data": {
"email": "123456789@qq.com"
},
"id": "I0OeBIQjJjisQrZ7STX3zexrBLF7Uilx",
"attempts": 1
}

上面讲到,构成消息队列需要两个进程,所以上面的进入队列是一个进程,现在的出队列及执行任务则在另一个进程中执行。lavarel提供了两个命令来启动该进程,quque:work ,queue:litsen 当然,再理解了如何完成这些操作后完全可以自己写一个命令,现在看看它是如何出队列和如何执行任务?
任务出队列
在手册中,对于一个任务可以指定多种属性,比如,延迟,失败次数,队列名称等等,当然,所有可执行操作或功能都得依赖数据结构,数据结构的制定也是为了实现相应的行为.所以,RedisQueue的代码对应上面的数据结构来理解就比较容易了。
RedisQueue是所有队列服务(Redis)的基础接口,所以任务出队列的操作也能在这找到。假设现在已经对RedisQueue的代码已经有点熟悉了,不难发现,有一个稍复杂的pop方法(出队列)。那么,问题出现了,出队列是如何实现的?解决了这个问题,任务出队列就可算是完成了.
队列应有的功能
查看php artisan queue:work --help命令的使用方法,整理有关队列所需的功能或服务:
指定队列名称
任务的执行逻辑
任务执行延迟
任务中失败的最大次数
当然还有其他关于该命令的功能,比如:是否以守护进程执行,是否强制执行,*进程执行的memory,无任务时的等待时间.这些与命令相关的因不同的命令而异,与队列任务无关.这样,在理清队列任务需要的功能后,我们就可以分析它的数据结构,理解代码了.
队列数据结构
数据结构都是依据行为而建立.所以在查看pop方法时,可考虑以上几个点.上面的数据结构中,已经可以看到队列的执行逻辑,所需参数,失败次数,这些一目了然,就不啰嗦了.在整个pop方法中,有这么几个队列,queue:delayed,queue:reserved,queue.本来取出一个任务用lpop就可完成,为什么要多用两个集合(注意,是有序集合不是队列)来完成pop操作呢?因为要实现任务延迟和失败处理.
其执行过程如图:

过程解析:
(1). 取任务,因为要实现延迟的功能,所以在有序集合里的score是过期时间,过期时间的含义则是在此时间之前不执行,也就达到了延迟执行的效果.延迟的含义在这里指的并不是在多少秒后执行,而是在多少秒内不执行.对于过期的任务,就将其rpush到队列中,直到lpop操作将其拿走.
(1).为什么在存在queue:reserved集合并且把lpop的任务zadd进支?因为只要lpop了job就可以将其记录下来,若此时任务还未开始执行进程就非正常终止了,该任务就不会丢失,再次执行时,依据上面的步骤就可以将其取出,防止意外使job丢失.
(2).队列的执行都是依据json中的类来完成,这部分较简单,略.
(3).当任务执行成功时,要手动删除queue:reserved中的任务;当任务执行失败,删除queue:reserved中的任务,再将其记录下来,记录方式是zadd queue:delayed, 并且将该任务的执行次数加一,这个过程RedisQueue已经封装(RedisQueue::release)好了.
这一系列的过程就完成了让队列任务延迟的功能.所以这么复杂的操作都是为了实现延迟的功能,当然,有更好的点子可以考虑自己实现.
执行任务
到此,任务的执行在json数据结构中表现的很明确,整个处理过程也很清晰了.需要注意的是当任务执行成功后要删除任务.对于如何执行出队列,以及如何执行队列任务,可以详细看看queue:work命令(\Illuminate\Queue\Console\WorkCommand::fire), 它是最好的示例;
队列处理命令的自定义
在使用queue:work之后,会发现它并不有处理所有的情况.所以在本文中一直提到过,自写一个处理命令是可行的.当面临queue:work所不能解决的问题时,可以好好考虑下自己编写.在实际开发中,任务的种类繁多,对于不同的任务应该有不同的处理方案.所以,有以下几个问题是经常遇到的:
比如:
调用服务发生错误且由服务提供方造成,需另作记录,而这样的错误不算作job的执行错误
营销短信只能在9:00到20:00之间发送, 所以在该时间段内没有执行的必要
与数据库交互时,数据库连接是有时间*的,而以守护进程的方式执行则无时间*,这样就会报错
所以,面临laravel所提供命令的局限性,有自定义处理命令的能力是很有必要的.

关于php学习,哪个网站资料比较合适?

做PHP相关工作已经有7年了,如果是初学者,推荐有两个PHP100、PHP CHINA .

PHP100

-------------

PHP100中文网是国内第一家以PHP资源分享为主的专业网站,也提供了PHP中文交流社区。面向PHP学习研究者提供:最新PHP资讯、原创内容、开源代码和PHP视频教程等相关内容。

    PHP100中的100个视频,虽然看着有点多,但是如果想入门的话,10几个视频就可以了,这里面不仅有入门的教程,还有中阶、高阶的教程,完全可以把你从一个什么都不懂的PHP菜鸟,变成PHP的使用高手。

    介绍php开发环境,让您快速搭建您的工作环境,测试环境,开始PHP的编程之旅;php开发工具

,工欲善其事必先利其器,IDE,数据库管理,版本控制等等,称心..,带你进行PHP语言开发,手把手在视频教程中教你如何开发一个留言板功能,学会这些,你就可以入门了。

    当然如果遇到问题怎么办,PHP100还有一个技术论坛,分类也很全,不仅包含PHP技术相关的内容,还包含PHP相关的好多技术语言,例如linux、apache、mysql、javascript、ajax等等。

PHP CHINA

----------------

之所以推荐这个,是因为,N年前我自己就是在这里进行过培训的学员,也是深受益处,还有个很出名的开源论坛也是出自这里的,Discuz! ,这里不仅有学习相关的资料,也可以报名进行培训,还可以学习Discuz!相关的源码。

    当然这里也有一个属于自己的论坛,里面有一部分人都是初学者,都是在这里做培训的学员,所以会看到很多初级的问题,也可以提一些基础问题,很多人会帮你解答。

当然别的地方也会有很多资料很全的网站,以上两个只是个人推荐,希望对你有帮助

新手php框架要先学laravel好还是tp?

对于新手来说是学习php框架最佳的选择是tp

thinkphp,国内的PHP框架,具有简单,快速,兼容等优点,。从5.0版本开始,号称为API开发而设计的高性能框架。配置开发也是非常简单,一般下载框架就可以直接开发,开发代码风格也符合国人思想,所以简单,快捷,适合新手的php框架。

Laravel框架,是当今最熟练,流行和广泛使用的开源框架之一。Laravel具有多种功能,例如模板引擎,MVC架构支持,安全性高,开发者工具,数据库迁移等。这些Laravel高级功能使它比其他PHP框架更好。新手为什么不强烈推荐呢?主要是Laravel框架是一个国际的框架,很多是英文,虽然有翻译文档,但是对于英语不好的新手来说,更是折磨。所以比较建议tp

新手php框架要先学laravel好还是tp?

对于新手来说是学习php框架最佳的选择是tp

thinkphp,国内的PHP框架,具有简单,快速,兼容等优点,。从5.0版本开始,号称为API开发而设计的高性能框架。配置开发也是非常简单,一般下载框架就可以直接开发,开发代码风格也符合国人思想,所以简单,快捷,适合新手的php框架。

Laravel框架,是当今最熟练,流行和广泛使用的开源框架之一。Laravel具有多种功能,例如模板引擎,MVC架构支持,安全性高,开发者工具,数据库迁移等。这些Laravel高级功能使它比其他PHP框架更好。新手为什么不强烈推荐呢?主要是Laravel框架是一个国际的框架,很多是英文,虽然有翻译文档,但是对于英语不好的新手来说,更是折磨。所以比较建议tp

laravel 优雅在哪?

用什么框架都会增加相应的学习成本,这点我先说明一下。
然后就是laravel。为什么优雅?这是对于国外用户比较亲切吧,因为用laravel编写的流程,假设换做是中文,是可以直接读出来的。这就是优雅的地方吧。
php是可以随便就改,而且实时生效,但这个是初学时的想法了,当项目越做越大,就会发现,改一个字,都会牵一发而动全身,这就是程序开发。
你所述的重载命令,如果想要以后用到laravel,就好好习惯,不用背,因为laravel每个拓展都会告诉你安装命令。
有一点值得说,像我做独立开发,只能得益于laravel,TP或其他框架不是不好,是我懒得继续去学了,而且,laravel不仅仅是后端,你要记住这句话。
你能想象到的,比如:地图API、admin后台管理系统、各类富文本编辑器、结合VUE的前端等等等等。

个人觉得比较完善,这里没有对比其他框架,所以单方面习惯用laravel。安全、快速、还全面。
当你习惯那些操作之后,也会得心应手,学语言,就是要耐得住,加油。学什么框架都一样

laravel 优雅在哪?

用什么框架都会增加相应的学习成本,这点我先说明一下。
然后就是laravel。为什么优雅?这是对于国外用户比较亲切吧,因为用laravel编写的流程,假设换做是中文,是可以直接读出来的。这就是优雅的地方吧。
php是可以随便就改,而且实时生效,但这个是初学时的想法了,当项目越做越大,就会发现,改一个字,都会牵一发而动全身,这就是程序开发。
你所述的重载命令,如果想要以后用到laravel,就好好习惯,不用背,因为laravel每个拓展都会告诉你安装命令。
有一点值得说,像我做独立开发,只能得益于laravel,TP或其他框架不是不好,是我懒得继续去学了,而且,laravel不仅仅是后端,你要记住这句话。
你能想象到的,比如:地图API、admin后台管理系统、各类富文本编辑器、结合VUE的前端等等等等。

个人觉得比较完善,这里没有对比其他框架,所以单方面习惯用laravel。安全、快速、还全面。
当你习惯那些操作之后,也会得心应手,学语言,就是要耐得住,加油。学什么框架都一样

php都是学什么内容啊?想学php有必要报php培训班吗?

首先,必须会一部分前端

需要了解的知识包括HTML、CSS、JavaScript,不需要深入地学习,有个概念性的理解即可。至于可以推荐的书籍还真没有没有,因为这一部分主要是练习,熟能生巧。如果是没有任何基础的,需要带领入门的话,可以去视频网站搜索相关课程视频,网上很多。

其次,关于知识学习有三个阶段

1. PHP入门段

可以在网上找到各类PHP热门视频,基本上这些视频里面都会讲到如何使用编辑,配置环境等一系列基础教程。能撸出一个个人站点/ 企业小站 就可以进入下一步了这样可以先对编程有一个初步的认识,如果没有任何电脑基础不推荐直接看书。

2. 进步段

这时候需要PHP手册了,了解常用函数。学习MySQL( 数据库 ),了解PHP各大框架 --thinkPHP,Yii,Laravel等, 然后选一款框架尝试搭建一blog,实现常规登录、注册、文章发布和修改。

3. 提高段

这一阶段的知识点主要包括:了解Linux ,在Linux下搭建 PHP环境(这时候要脱离 xamp,wamp等之流了);知道&&使用版本控制:git svn;

详细的了解之后需要的就是不断地去补充这些自己不懂的东西,多学,多问,多练,如果喜欢编程,想成为一名PHP程序员,想看PHP视频教程的话推荐扣丁学堂的,最重要的就是尽快入手,不要拖。

Django和Laravel 哪个的学习成本更低一些

两种框架都用过 小项目推荐Django.入门相对更简单,效率更高.还有就是python对比php语法上的天然优势.大项目推荐laravel.
我先学习的Django..当需要laravel的时候我内心是拒绝的.毕竟习惯python的语法在去使用php真的很难受.

Django和Laravel 哪个的学习成本更低一些

两种框架都用过 小项目推荐Django.入门相对更简单,效率更高.还有就是python对比php语法上的天然优势.大项目推荐laravel.
我先学习的Django..当需要laravel的时候我内心是拒绝的.毕竟习惯python的语法在去使用php真的很难受.

显示全文