定制 recca0120/laravel-parallel 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

recca0120/laravel-parallel

最新稳定版本:v1.4.1

Composer 安装命令:

composer require recca0120/laravel-parallel

包简介

无描述信息

README 文档

README

Latest Version on Packagist Tests Total Downloads

Laravel Parallel

Requirements

  • Laravel versions 5.7, 6.x, 7.x, 8.x, 9.x, 10.x and 11.x
  • PHP 7.0 or greater

Installation

Install the package with composer:

composer require recca0120/laravel-parallel

Usage

  • make a product migration
<?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateProductsTable extends Migration { /**  * Run the migrations.  *  * @return void  */ public function up() { Schema::create('products', function (Blueprint $table) { $table->id(); $table->string('name'); $table->integer('quantity')->default(0); $table->timestamps(); }); } /**  * Reverse the migrations.  *  * @return void  */ public function down() { Schema::dropIfExists('products'); } } 
  • define product model App\Models\Product
<?php namespace App\Models; use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; /**  * Class Product.  * @property int id  * @property string name  * @property int quantity  * @package App\Models  * @mixin Builder  */ class Product extends Model { use HasFactory; protected $fillable = ['name', 'quantity']; protected $casts = ['quantity' => 'int']; }
  • define router in routes/web.php
<?php use App\Models\Product; use Illuminate\Support\Facades\Route; Route::get('/product/{productId}', function ($productId) { return Product::findOrFail($productId); }); Route::post('/product/{productId}', function ($productId) { $product = Product::findOrFail($productId); if ($product->quantity > 0) { // wrong, it will make test fail // $product->fill(['quantity' => $product->quantity - 1])->save(); // correct $product->where('id', $product->id) ->where('quantity', '>', 0) ->update(['quantity' => DB::raw('quantity - 1')]); } return $product->fresh(); });
  • testing
<?php namespace Tests\Feature; use App\Models\Product; use Illuminate\Foundation\Testing\DatabaseMigrations; use Recca0120\LaravelParallel\Tests\Concerns\WithParallelPhyiscalDatabase; use Recca0120\LaravelParallel\Tests\ParallelRequest; use Tests\TestCase; class RaceConditionTest extends TestCase { use DatabaseMigrations; use WithParallelPhyiscalDatabase; private $product; private $quantity = 10; public function test_race_condition() { $this->useParallelPhyiscalDatabase(); $this->product = Product::create(['name' => 'test', 'quantity' => $this->quantity]); $request = $this->app->make(ParallelRequest::class); $promises = collect(); for ($i = 0; $i < $this->quantity; $i++) { // you will get \GuzzleHttp\Promise\PromiseInterface $promise = $request->post('/product/'.$this->product->id); $promises->add($promise); } // you need wait response $promises->map->wait()->each->assertOk(); $this->get('/product/'.$this->product->id) ->assertOk() ->assertJsonPath('quantity', 0); } public function test_multiple_times_to_test_race_condition() { $this->useParallelPhyiscalDatabase(); $this->product = Product::create(['name' => 'test', 'quantity' => $this->quantity]); $request = $this->app->make(ParallelRequest::class); $promises = collect($request->times(10)->post('/product/'.$this->product->id)); // you need wait response $promises->map->wait()->each->assertOk(); $this->get('/product/'.$this->product->id) ->assertOk() ->assertJsonPath('quantity', 0); } }

License

The MIT License (MIT). Please see License File for more information.

统计信息

  • 总下载量: 109.38k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 64
  • 点击次数: 2
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 64
  • Watchers: 1
  • Forks: 4
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-01-04

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固