demi / php-gearman
Gearman作业服务器工作者助手
1.1.5
2018-01-29 18:55 UTC
Requires
- php: >=5.3.0
Suggests
- ext-gearman: PHP Gearman extension for running workers
README
Gearman作业服务器工作者助手
安装
- 运行
composer require "demi/php-gearman" "~1.0"
- 将gearman作业服务器作为PHP扩展安装: http://gearman.org/getting-started/#gearman_php_extension
- 安装supervisor
apt-get install supervisor
- (可选) 安装Gearman GUI: http://gaspaio.github.io/gearmanui
配置
Yii1/Yii2
在您常见的配置目录中的supervisor.php
return [ 'configFile' => '/etc/supervisor/conf.d/workers.conf', 'workersDirectory' => realpath(__DIR__ . '/../../'), 'restartSleepingTime' => 5, 'all' => [ 'crop_image' => ['numprocs' => 0, 'command' => '/usr/bin/php yii workers/crop-image'], 'bad_worker' => ['numprocs' => 0, 'command' => '/usr/bin/php yii workers/bad-worker'], ], 'sets' => [ 'general' => [ 'crop_image' => 5, ], 'minimal' => [ 'crop_image' => 50, 'bad_worker' => 50, ], 'maximal' => [ 'crop_image' => 100, 'bad_worker' => 100, ], ], ];
Gearman组件配置
Yii2
/common/config/main.php
'components' => [ 'gearman' => [ 'class' => '\demi\gearman\yii2\Component', 'host' => '127.0.0.1', 'port' => 4730, 'supervisorConfig' => require(__DIR__ . '/supervisor.php'), ], ],
/console/config/main.php
return [ 'controllerMap' => [ 'gearman' => [ 'class' => '\demi\gearman\yii2\SupervisorController', 'gearmanComponentName' => 'gearman', // name of component: Yii::$app->gearman (from previous config listing) ], ], ],
Yii1
/protected/config/main.php
'components' => [ 'gearman' => [ 'class' => '\demi\gearman\yii1\GearmanComponent', 'host' => '127.0.0.1', 'port' => 4730, 'supervisorConfig' => require(__DIR__ . '/supervisor.php'), ], ],
/protected/config/console.php
$mainConfig = require(dirname(__FILE__) . '/main.php'); return [ 'commandMap' => [ 'gearman' => [ 'class' => '\demi\gearman\yii1\SupervisorCommand', 'gearmanComponentName' => 'gearman', // name of component: Yii::app()->gearman (from previous config listing) ], ], 'components' => [ 'gearman' => $mainConfig['components']['gearman'], ], ],
Laravel
将服务提供者添加到 /config/app.php
'providers' => [ // Gearman helper demi\gearman\laravel5\GearmanServiceProvider::class ], 'aliases' => [ // Gearman helper 'Gearman' => demi\gearman\laravel5\GearmanFacade::class, ],
发布 /config/gearman.php
php artisan vendor:publish --provider="demi\gearman\laravel5\GearmanServiceProvider" --tag=config
用法
运行工作者
Gearman工作者 - 它是简单的循环控制台命令
Yii2
创建新的控制台控制器
/console/controllers/WorkersController.php
<?php namespace console\controllers; use Yii; use GearmanJob; /** * Gearman workers */ class WorkersController extends \yii\console\Controller { /** * Crop image worker */ public function actionCropImage() { Yii::$app->gearman->runWorker('crop_image', function (GearmanJob $job) { $workload = Yii::$app->gearman->deserializeWorkload($job->workload()); $imagePath = $workload['image_path']; if (empty($imagePath)) { return Yii::$app->gearman->serializeWorkload(['status' => 'error', 'message' => 'No image']); } // Do some job... return Yii::$app->gearman->serializeWorkload(['status' => 'success', 'foo' => 'bar']); }); } }
Yii1
创建新的控制台命令
/protected/commands/WorkersCommand.php
<?php /** * Gearman workers */ class WorkersCommand extends CConsoleCommand { /** * Crop image worker */ public function actionCropImage() { Yii::app()->gearman->runWorker('crop_image', function (GearmanJob $job) { $workload = Yii::app()->gearman->deserializeWorkload($job->workload()); $imagePath = $workload['image_path']; if (empty($imagePath)) { return Yii::app()->gearman->serializeWorkload(['status' => 'error', 'message' => 'No image']); } // Do some job... return Yii::app()->gearman->serializeWorkload(['status' => 'success', 'foo' => 'bar']); }); } }
Laravel
创建新的控制台命令
/app/Console/Commands/CropImage.php
<?php namespace App\Console\Commands; use Illuminate\Console\Command; use GearmanJob; use Gearman; /** * Gearman crop image worker */ class CropImage extends Command { /** * @inheritdoc */ protected $name = 'worker:crop-image'; /** * @inheritdoc */ protected $description = 'Worker for cropping image'; /** * Execute the console command. * * @return mixed */ public function handle() { Gearman::runWorker('crop_image', function (GearmanJob $job) { $workload = Gearman::deserializeWorkload($job->workload()); $imagePath = $workload['image_path']; if (empty($imagePath)) { return Gearman::serializeWorkload(['status' => 'error', 'message' => 'No image']); } // Do some job... return Gearman::serializeWorkload(['status' => 'success', 'foo' => 'bar']); }); } }
更新 /app/Console/Kernel.php
添加到 protected $commands
protected $commands = [ // ... \App\Console\Commands\CropImage::class, ]
更改supervisor配置并重启supervisor
Yii2
php yii gearman
Yii1
php yiic gearman
Laravel
php artisan gearman
示例
Yii2
任何位置
// synchronous $result = Yii::$app->gearman->doNormal('crop_image', ['image_path' => '/var/www/image.jpg']); var_dump(Yii::$app->gearman->deserializeWorkload($result)); // ['status' => 'success', 'foo' => 'bar'] $result = Yii::$app->gearman->doNormal('crop_image'); var_dump(Yii::$app->gearman->deserializeWorkload($result)); // ['status' => 'error', 'message' => 'No image'] // asynchronous $result = Yii::$app->gearman->doBackground('crop_image', ['image_path' => '/var/www/image.jpg']); var_dump($result); // job handle file descriptior $result = Yii::$app->gearman->doBackground('crop_image'); var_dump($result); // job handle file descriptior // Variants: // doLow(), doNormal(), doHigh(), // doLowBackground(), doBackground(), doHighBackground(),
Yii1
任何位置
// synchronous $result = Yii::app()->gearman->doNormal('crop_image', ['image_path' => '/var/www/image.jpg']); var_dump(Yii::app()->gearman->deserializeWorkload($result)); // ['status' => 'success', 'foo' => 'bar'] $result = Yii::app()->gearman->doNormal('crop_image'); var_dump(Yii::app()->gearman->deserializeWorkload($result)); // ['status' => 'error', 'message' => 'No image'] // asynchronous $result = Yii::app()->gearman->doBackground('crop_image', ['image_path' => '/var/www/image.jpg']); var_dump($result); // job handle file descriptior $result = Yii::app()->gearman->doBackground('crop_image'); var_dump($result); // job handle file descriptior // Variants: // doLow(), doNormal(), doHigh(), // doLowBackground(), doBackground(), doHighBackground(),
Laravel
任何位置
use Gearman; // synchronous $result = Gearman::doNormal('crop_image', ['image_path' => '/var/www/image.jpg']); var_dump(Gearman::deserializeWorkload($result)); // ['status' => 'success', 'foo' => 'bar'] $result = Gearman::doNormal('crop_image'); var_dump(Gearman::deserializeWorkload($result)); // ['status' => 'error', 'message' => 'No image'] // asynchronous $result = Gearman::doBackground('crop_image', ['image_path' => '/var/www/image.jpg']); var_dump($result); // job handle file descriptior $result = Gearman::doBackground('crop_image'); var_dump($result); // job handle file descriptior // Variants: // doLow(), doNormal(), doHigh(), // doLowBackground(), doBackground(), doHighBackground(),