salestools / php-gearman
此包已被放弃,不再维护。未建议替代包。
Gearman作业服务器工作助手
dev-master
2017-06-04 14:41 UTC
Requires
- php: >=5.3.0
Suggests
- ext-gearman: PHP Gearman extension for running workers
This package is auto-updated.
Last update: 2019-12-26 05:10:59 UTC
README
Gearman作业服务器工作助手
安装
- 运行
composer require "salestools/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' => '\salestools\gearman\yii2\Component',
'host' => '127.0.0.1',
'port' => 4730,
'supervisorConfig' => require(__DIR__ . '/supervisor.php'),
],
],
/console/config/main.php
return [
'controllerMap' => [
'gearman' => [
'class' => '\salestools\gearman\yii2\SupervisorController',
'gearmanComponentName' => 'gearman', // name of component: Yii::$app->gearman (from previous config listing)
],
],
],
Yii1
/protected/config/main.php
'components' => [
'gearman' => [
'class' => '\salestools\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' => '\salestools\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
salestools\gearman\laravel5\GearmanServiceProvider::class
],
'aliases' => [
// Gearman helper
'Gearman' => salestools\gearman\laravel5\GearmanFacade::class,
],
发布 /config/gearman.php
php artisan vendor:publish --provider="salestools\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(),