1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/FEIGE-swoole-worker

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

swoole-worker

Join the chat at https://gitter.im/swoole-worker/Lobby

What is it

Этот проект является версией workerman (v3.4.5), перенесённой на swoole. Из него были удалены зависимости от pcntl, libevent, event и ev, вместо них используются swoole_process и swoole_event, предоставляемые swoole, а для таймеров применяется swoole_timer. Для сервера используется расширение stream.

Requires

  • PHP версии 5.4 или выше.
  • POSIX-совместимая операционная система (Linux, OSX, BSD).
  • Расширения POSIX и Swoole для PHP.
  • swoole версии 1.9.18 или 2.0.8.

Thanks

  • workerman — Workerman — это открытый высокопроизводительный PHP-фреймворк для разработки сокет-серверов на чистом PHP.
  • swoole — асинхронный, параллельный и высокопроизводительный сетевой коммуникационный движок для PHP, написанный на чистом C.
  • Документация Workerman: http://doc.workerman.net/.
  • Документация Swoole: https://wiki.swoole.com/wiki/index.

Installation

composer require fage1151/swoole-worker

Basic Usage

Использование аналогично workerman.

Веб-сокет сервер

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;

// Создание веб-сокета сервера
$ws_worker = new Worker("websocket://0.0.0.0:2346");

// 4 процесса
$ws_worker->count = 4;

// Вызывается при новом соединении
$ws_worker->onConnect = function($connection) {
    echo "Новое соединение\n";
};

// Вызывается при получении данных
$ws_worker->onMessage = function($connection, $data) {
    // Отправить приветствие $data
    $connection->send('hello ' . $data);
};

// Вызывается при закрытии соединения
$ws_worker->onClose = function($connection) {
    echo "Соединение закрыто\n";
};

// Запуск рабочего
Worker::runAll();

HTTP-сервер

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;

// #### HTTP рабочий ####
$http_worker = new Worker("http://0.0.0.0:2345");

// 4 процесса
$http_worker->count = 4;

// Вызывается при получении данных
$http_worker->onMessage = function($connection, $data) {
    // $_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER, $_FILES доступны
    var_dump($_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER, $_FILES);
    // отправить данные клиенту
    $connection->send("hello world \n");
};

// запустить всех рабочих
Worker::runAll();

Веб-сервер

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\WebServer;
use Workerman\Worker;

// Веб-сервер
$web = new WebServer("http://0.0.0.0:80");

// 4 процесса
$web->count = 4;

// Установить корень доменов
$web->addRoot('www.your_domain.com', '/your/path/Web');
$web->addRoot('www.another_domain.com', '/another/path/Web');
// запустить всех рабочих
Worker::runAll();

TCP-сервер

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;

// #### создать сокет и слушать порт 1234 ####
$tcp_worker = new Worker("tcp://0.0.0.0:1234");

// 4 процесса
$tcp_worker->count = 4;

// Вызывается при новом соединении
$tcp_worker->onConnect = function($connection) {
    echo "Новое Connection\n";
};

// Вызывается при получении данных
$tcp_worker->onMessage = function($connection, $data) {
    // отправить данные клиенту
    $connection->send("привет $data \n");
};

// Вызывается при новом соединении
$tcp_worker->onClose = function($connection) {
    echo "Connection closed\n";
};

Worker::runAll();

Включение SSL.

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;

// Контекст SSL.
$context = array(
    'ssl' => array(
        'local_cert' => '/your/path/of/server.pem',
        'local_pk'   => '/your/path/of/server.key',
    )
);

// Создать веб-сокет-сервер с контекстом SSL.
$ws_worker = new Worker("websocket://0.0.0.0:2346", $context);

// Включить SSL. WebSocket+SSL означает защищённый WebSocket (wss://). 
// Аналогичные подходы для Https и т. д.
$ws_worker->transport = 'ssl';

$ws_worker->onMessage = function($connection, $data) {
    // Send hello $data
    $connection->send('hello ' . $data);
};

Worker::runAll();

Пользовательский протокол

Protocols/MyTextProtocol.php

<?php
namespace Protocols;
/**
 * Определённый пользователем протокол
 * Формат Текст+"\n"
 */
class MyTextProtocol
{
    public static function input($recv_buffer) { Данный текст написан на языке PHP.

// Find the position of the first occurrence of "\n" $pos = strpos($recv_buffer, "\n"); // Not a complete package. Return 0 because the length of package can not be calculated if ($pos === false) { return 0; } // Return length of the package return $pos + 1; }

public static function decode($recv_buffer) { return trim($recv_buffer); }

public static function encode($data) { return $data . "\n"; }


```php
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;

// #### MyTextProtocol worker ####
$text_worker = new Worker("MyTextProtocol://0.0.0.0:5678");

$text_worker->onConnect = function ($connection) {
    echo "New connection\n";
};

$text_worker->onMessage = function ($connection, $data) {
    // send data to client
    $connection->send("hello world \n");
};

$text_worker->onClose = function ($connection) {
    echo "Connection closed\n";
};

// run all workers
Worker::runAll();

Timer

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use Workerman\Lib\Timer;

$task = new Worker();
$task->onWorkerStart = function ($task) {
    // 2.5 seconds
    $time_interval = 2.5;
    $timer_id = Timer::add($time_interval, function () {
        echo "Timer run\n";
    });
};

// run all workers
Worker::runAll();

AsyncTcpConnection (tcp/ws/text/frame etc...)

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;

$worker = new Worker();
$worker->onWorkerStart = function() {
    // Websocket protocol for client.
    $ws_connection = new AsyncTcpConnection("ws://echo.websocket.org:80");
    $ws_connection->onConnect = function($connection) {
        $connection->send('hello');
    };
    $ws_connection->onMessage = function($connection, $data) {
        echo "recv: $data\n";
    };
    $ws_connection->onError = function($connection, $code, $msg) {
        echo "error: $msg\n";
    };
    $ws_connection->onClose = function($connection) {
        echo "connection closed\n";
    };
    $ws_connection->connect();
};
Worker::runAll();

Async Tcp Client

<?php
/**
 * run with command
 * php start.php start
 */

use \Workerman\Worker;
use \Workerman\Clients\Tcp;
require_once '../Autoloader.php';
$worker = new Worker();

$worker->onWorkerStart = function (Worker $worker) {
    $url = 'www.workerman.net:80';
    $tcp = new Tcp($url);
    $tcp->onConnect = function ($client) {
        $client->send('123');
    };
    $tcp->onReceive = function ($client, $data) {
        var_dump($data);
    };
    $tcp->connect();
};
$worker->count = 1;
Worker::$stdoutFile = '/tmp/oauth.log';
Worker::$logFile = __DIR__ . '/workerman.log';
Worker::$pidFile = __DIR__ . "/" . str_replace('/', '_', __FILE__) . ".pid";
// 运行所有服务
Worker::runAll();

Async WebSocket Client

<?php
/**
 * run with command
 * php start.php start
 */

use \Workerman\Worker;
use \Workerman\Clients\Ws;
use \Swoole\Http\Client;
require_once '../Autoloader.php';
$worker = new Worker();

$worker->onWorkerStart = function (Worker $worker) {
    $url = 'laychat.workerman.net:9292';
    $tcp = new Ws($url);
    $tcp->onConnect = function (Client $client) {
        var_dump($client);
    };
    $tcp->onMessage = function (Client $client, $data) {
        $client->push('{"type":"ping"}');
        var_dump($data);
    };
    $tcp->connect();
};
$worker->count = 1;
Worker::$stdoutFile = '/tmp/oauth.log';
Worker::$logFile = __DIR__ . '/workerman.log';
Worker::$pidFile = __DIR__ . "/" . str_replace('/', '_', __FILE__) . ".pid";
// 运行所有服务
Worker::runAll();

Aysnc Dns Client

<?php
require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
$worker = new Worker('tcp://0.0.0.0:6161');
$worker->onWorkerStart = function() {
   swoole_async_dns_lookup("www.baidu.com", function($host, $ip) {
       echo "{$host} : {$ip}\n";
   });
};
$worker->onMessage = function($connection, $host) {

};
``` **Worker::runAll();**

### Async Http Client
*https网站需要依赖openssl必须在编译swoole时启用--enable-openssl*
onWorkerStart = function (Worker $worker) { $url = 'http://www.workerman.net'; $request_method = 'get'; $data = ['uid' => 1]; $http = new Http($url, $request_method); $http->onResponse = function ($cli) { var_dump($cli->body); }; $http->request($data); }; $worker->count = 1; Worker::$stdoutFile = '/tmp/oauth.log'; Worker::$logFile = __DIR__ . '/workerman.log'; Worker::$pidFile = __DIR__ . "/" . str_replace('/', '_', __FILE__) . ".pid"; // 运行所有服务 Worker::runAll(); ``` ### Async Mysql Client ```php onWorkerStart = function () { global $mysql; $mysql = new Mysql; $server = array( 'host' => '192.168.56.102', 'port' => 3306, 'user' => 'test', 'password' => 'test', 'database' => 'test', 'charset' => 'utf8', //指定字符集 'timeout' => 2, // 可选:连接超时时间(非查询超时时间),默认为SW_MYSQL_CONNECT_TIMEOUT(1.0) ); $mysql->connect($server, function (Mysql $db, $r) { if ($r === false) { var_dump($db->connect_errno, $db->connect_error); die; } }); }; $worker->onMessage = function ($connection, $data) { global $mysql; $sql = 'show tables'; $mysql->query($sql, function (Mysql $db, $r) { if ($r === false) { var_dump($db->error, $db->errno); } elseif ($r === true) { var_dump($db->affected_rows, $db->insert_id); } var_dump($r); }); }; Worker::runAll(); ``` ### Async Redis Client *Использование Redis-клиента, необходимо установить hiredis-библиотеку.* *При компиляции swoole, в команде configure добавить --enable-async-redis.* Document https://wiki.swoole.com/wiki/page/p-redis.html ```php onWorkerStart = function () { global $client; $client = new Redis; $client->connect('127.0.0.1', 6379, function (Redis $client, $result) { echo "connect\n"; var_dump($result); $db = 0; $client->select($db); $password = '111111'; $client->auth($password); }); }; $worker->onMessage = function ($connection, $data) { global $client; $client->set('key', 'swoole', function (Redis $client, $result) { var_dump($result); $client->get('key', function (Redis $client, $result) { var_dump($result); $client->close(); }); }); }; Worker::runAll(); ``` ### Async Zmq Client *Установить:* ``` apt-get install libzmq-dev pecl install zmq composer require swoole/zmq ``` ```php onWorkerStart = function () { $zmq = new Swoole\Async\ZMQ(); $zmq->connect('tcp://0.0.0.0:5555'); Swoole\Timer::tick(1000, function () use ($zmq) { static $i = 0; $msg = "hello-" . $i++; echo "Sending: $msg\n"; $zmq->send($msg); }); }; $worker->onMessage = function ($connection, $data) { }; Worker::runAll(); ``` ### Document IDE-автоматический помощник https://github.com/eaglewu/swoole-ide-helper Swoole официальный сайт https://wiki.swoole.com/wiki/index/prid-1 Workerman руководство http://doc.workerman.net/ ## Доступные команды ```php test.php start ``` ```php test.php start -d ``` ![workerman start](http://www.workerman.net/img/workerman-start.png) ```php test.php status ``` ![workerman satus](http://www.workerman.net/img/workerman-status.png?a=123) ```php test.php stop ``` ```php test.php restart ``` ```php test.php reload ```

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

На основе workerman, который базируется на swoole_process, поддерживается миллисекундный таймер, событийное управление, постоянный процесс, асинхронный HTTP, клиенты Redis и MySQL, а также протоколы TCP, WebSocket и HTTP для сервера. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/FEIGE-swoole-worker.git
git@api.gitlife.ru:oschina-mirror/FEIGE-swoole-worker.git
oschina-mirror
FEIGE-swoole-worker
FEIGE-swoole-worker
master