简介
之前我们已经学习了 Events 和 Listeners ,这次我们来学习 Jobs。
Jobs的创建
运行命令行 php artisan make:job CompileReports 创建一个Job类,Job类的结构简单,一般来说只会包含一个让队列用来调用此任务的 handle 方法,具体代码如下:
class CompileReports extends Job implements SelfHandling{ /** * Create a new job instance. * * @return void */ public function __construct() { // } /** * Execute the job. * * @return void */ public function handle() { // }}
可以通过 php artisan help make:job 观察相关参数,执行 php artisan make:job CompileReports --queued ,对比发现和之前类区别为多实现了 ShouldQueue 接口,这意味着可以按队列顺序执行。
增加路由和控制器
默认路由 routes.php 中增加:
Route::get('reports', 'ReportsController@index');
通过执行命令行 php artisan make:controller ReportsController --plain ,创建 ReportsController 控制器,增加测试方法:
class ReportsController extends Controller{ // public function index() { $job = new CompileReports(); $this->dispatch($job); return 'Done'; } }
ReportsController 控制器的 Controller 父类中,默认已经 use DispatchesJobs ,定义好了 dispatch($job) 方法,用来调度任务。这时我们访问页面效果如下图:
Job中参数处理
改写 CompileReports.php 代码,构造函数中接受 $reportId 参数:
class CompileReportsextends Jobimplements SelfHandling, ShouldQueue{ protected $reportId; /** * Create a new job instance. * * @return void */ public function __construct($reportId) { // $this->reportId = $reportId; } /** * Execute the job. * * @return void */ public function handle() { // var_dump('Compiling the reports with the id '. $this->reportId .' within the Job class.'); }}
ReportsController 控制器中接受请求中参数,转发给Job处理:
class ReportsController extends Controller{ public function index(Request $request) { $job = new CompileReports($request->input('reportId')); $this->dispatch($job); return 'Done'; }}
访问页面效果如下:
Job中多参数处理
ReportsController 中改为调用 dispatchFrom 方法:
class ReportsController extends Controller{ // public function index(Request $request) { //$job = new CompileReports($request->input('reportId')); // $this->dispatchFrom(CompileReports::class, $request); $this->dispatchFrom('App\Jobs\CompileReports', $request); return 'Done'; } }
其中 DispatchesJobs 中定义了 dispatch 及 dispatchFrom,如下:
trait DispatchesJobs{ /** * Dispatch a job to its appropriate handler. * * @param mixed $job * @return mixed */ protected function dispatch($job) { return app('Illuminate\Contracts\Bus\Dispatcher')->dispatch($job); } /** * Marshal a job and dispatch it to its appropriate handler. * * @param mixed $job * @param array $array * @return mixed */ protected function dispatchFromArray($job, array $array) { return app('Illuminate\Contracts\Bus\Dispatcher')->dispatchFromArray($job, $array); } /** * Marshal a job and dispatch it to its appropriate handler. * 整理参数列表,传递给job * @param mixed $job * @param \ArrayAccess $source * @param array $extras * @return mixed */ protected function dispatchFrom($job, ArrayAccess $source, $extras = []) { return app('Illuminate\Contracts\Bus\Dispatcher')->dispatchFrom($job, $source, $extras); }}
CompileReports 类中改写传入参数:
class CompileReportsextends Jobimplements SelfHandling, ShouldQueue{ protected $reportId; protected $type; /** * Create a new job instance. * * @return void */ public function __construct($reportId, $type) { // $this->reportId = $reportId; $this->type = $type; } /** * Execute the job. * * @return void */ public function handle() { // var_dump('Compiling the '. $this->type .' reports with the id '. $this->reportId .' within the Job class.'); }}
访问效果如下图:
在 Job 中添加 DispatchesJobs 引用后,可继续分派Job:
/*** Execute the job.** @return void*/public function handle(){ // var_dump('Compiling the '. $this->type .' reports with the id '. $this->reportId .' within the Job class.'); var_dump(sprintf('Compiling the %s report with the id %s within the Job class', $this->type, $this->reportId)); // 增加 DispatchesJobs 引用后,可继续分派 job if(true) { $this->dispatch(new DoSomethingElse); }}
访问效果如下图:

APHPDependencyInjectionContainerisatoolthatmanagesclassdependencies,enhancingcodemodularity,testability,andmaintainability.Itactsasacentralhubforcreatingandinjectingdependencies,thusreducingtightcouplingandeasingunittesting.

Select DependencyInjection (DI) for large applications, ServiceLocator is suitable for small projects or prototypes. 1) DI improves the testability and modularity of the code through constructor injection. 2) ServiceLocator obtains services through center registration, which is convenient but may lead to an increase in code coupling.

PHPapplicationscanbeoptimizedforspeedandefficiencyby:1)enablingopcacheinphp.ini,2)usingpreparedstatementswithPDOfordatabasequeries,3)replacingloopswitharray_filterandarray_mapfordataprocessing,4)configuringNginxasareverseproxy,5)implementingcachingwi

PHPemailvalidationinvolvesthreesteps:1)Formatvalidationusingregularexpressionstochecktheemailformat;2)DNSvalidationtoensurethedomainhasavalidMXrecord;3)SMTPvalidation,themostthoroughmethod,whichchecksifthemailboxexistsbyconnectingtotheSMTPserver.Impl

TomakePHPapplicationsfaster,followthesesteps:1)UseOpcodeCachinglikeOPcachetostoreprecompiledscriptbytecode.2)MinimizeDatabaseQueriesbyusingquerycachingandefficientindexing.3)LeveragePHP7 Featuresforbettercodeefficiency.4)ImplementCachingStrategiessuc

ToimprovePHPapplicationspeed,followthesesteps:1)EnableopcodecachingwithAPCutoreducescriptexecutiontime.2)ImplementdatabasequerycachingusingPDOtominimizedatabasehits.3)UseHTTP/2tomultiplexrequestsandreduceconnectionoverhead.4)Limitsessionusagebyclosin

Dependency injection (DI) significantly improves the testability of PHP code by explicitly transitive dependencies. 1) DI decoupling classes and specific implementations make testing and maintenance more flexible. 2) Among the three types, the constructor injects explicit expression dependencies to keep the state consistent. 3) Use DI containers to manage complex dependencies to improve code quality and development efficiency.

DatabasequeryoptimizationinPHPinvolvesseveralstrategiestoenhanceperformance.1)Selectonlynecessarycolumnstoreducedatatransfer.2)Useindexingtospeedupdataretrieval.3)Implementquerycachingtostoreresultsoffrequentqueries.4)Utilizepreparedstatementsforeffi


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

Dreamweaver Mac version
Visual web development tools

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

WebStorm Mac version
Useful JavaScript development tools

Zend Studio 13.0.1
Powerful PHP integrated development environment
