Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/garveen/laravoole
Laravel && ( Swoole || Workerman ) to get 10x faster than php-fpm
https://github.com/garveen/laravoole
Last synced: 30 days ago
JSON representation
Laravel && ( Swoole || Workerman ) to get 10x faster than php-fpm
- Host: GitHub
- URL: https://github.com/garveen/laravoole
- Owner: garveen
- License: mit
- Created: 2015-11-28T22:36:11.000Z (about 9 years ago)
- Default Branch: master
- Last Pushed: 2017-11-21T12:21:25.000Z (about 7 years ago)
- Last Synced: 2024-08-03T21:04:09.270Z (4 months ago)
- Language: PHP
- Homepage:
- Size: 175 KB
- Stars: 890
- Watchers: 51
- Forks: 133
- Open Issues: 25
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
- awesome-php-cn - Laravoole - Laravel && ( Swoole || Workerman ) 获得比php-fpm快10倍的速度 (目录 / 框架 frameworks)
README
# Laravoole
Laravel on Swoole Or Workerman
10x faster than php-fpm
[![Latest Stable Version](https://poser.pugx.org/garveen/laravoole/v/stable)](https://packagist.org/packages/garveen/laravoole)
[![Total Downloads](https://poser.pugx.org/garveen/laravoole/downloads)](https://packagist.org/packages/garveen/laravoole)
[![Latest Unstable Version](https://poser.pugx.org/garveen/laravoole/v/unstable)](https://packagist.org/packages/garveen/laravoole)
[![License](https://poser.pugx.org/garveen/laravoole/license)](https://packagist.org/packages/garveen/laravoole)
[![Build Status](https://travis-ci.org/garveen/laravoole.svg?branch=master)](https://travis-ci.org/garveen/laravoole)
[![Code Coverage](https://scrutinizer-ci.com/g/garveen/laravoole/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/garveen/laravoole/?branch=master)## Depends On
php>=5.5.16
laravel/laravel^ 5.1
## Suggests
php>=7.0.0
ext-swoole>=1.7.21
workerman/workerman>=3.0
## Install
To get started, add laravoole to you composer.json file and run `composer update`:
```
"garveen/laravoole": "^0.5.0"
```or just run shell command:
```shell
composer require garveen/laravoole
```Once composer done its job, you need to register Laravel service provider, in your config/app.php:
```
'providers' => [
...
Laravoole\LaravooleServiceProvider::class,
],
```**Notice: You should NOT use file session handler, because it is not stable at this environement. Use redis or other handler instead.**
## Usage
```shell
php artisan laravoole [start | stop | reload | reload_task | restart | quit]
```## Migrations
### Upgrade to 0.4
Event names has changed:
- `laravoole.on_request` => `laravoole.requesting`
- `laravoole.on_requested` => `laravoole.requested`
- `laravoole.swoole.websocket.on_close` => `laravoole.swoole.websocket.closing`## Config
To generate `config/laravoole.php`:
```shell
php artisan vendor:publish --provider="Laravoole\LaravooleServiceProvider"
```Most of things can be configured with `.env`, and you should use `LARAVOOLE_{UPPER_CASE}` format, for example,
```php
[
'base_config' => [
'host' => '0.0.0.0',
]
]
```is equals with
```env
LARAVOOLE_HOST=0.0.0.0
```## Events
You can handle events by editing `EventServiceProvider`:
```php
public function boot()
{
parent::boot();
\Event::listen('laravoole.requesting', function ($request) {
\Log::info($request->segments());
});
}
```- `laravoole.requesting`(`Illuminate\Http\Request`)
- `laravoole.requested`(`Illuminate\Http\Request`, `Illuminate\Http\Response`)
- `laravoole.swoole.websocket.closing`(`Laravoole\Request`, int `$fd`)## base_config
This section configures laravoole itself.
### mode
`SwooleHttp` uses swoole to response http requests
`SwooleFastCGI` uses swoole to response fastcgi requests (just like php-fpm)
`SwooleWebSocket` uses swoole to response websocket requests **AND** http requests
`WorkermanFastCGI` uses workerman to response fastcgi requests (just like php-fpm)
#### user defined wrappers
You can make a new wrapper implements `Laravoole\Wrapper\ServerInterface`, and put its full class name to `mode`.
### pid_file
Defines a file that will store the process ID of the main process.
### deal\_with\_public
When using Http mode, you can turn on this option to let laravoole send static resources to clients. Use this ***ONLY*** when developing.
### host and port
Default `host` is `127.0.0.1`, and `port` is `9050`
## handler_config
This section configures the backend, e.g. `swoole` or `workerman`.
### Swoole
As an example, if want to set worker_num to 8, you can set `.env`:
```INI
LARAVOOLE_WORKER_NUM=8
```or set `config/laravoole.php`:
```php
[
'handler_config' => [
'worker_num' => 8,
]
]
```See Swoole's document:
[简体中文](http://wiki.swoole.com/wiki/page/274.html)
[English](https://cdn.rawgit.com/tchiotludo/swoole-ide-helper/dd73ce0dd949870daebbf3e8fee64361858422a1/docs/classes/swoole_server.html#method_set)
### Workerman
As an example, if want to set worker_num to 8, you can set `.env`:
```INI
LARAVOOLE_COUNT=8
```or set `config/laravoole.php`:
```php
[
'handler_config' => [
'count' => 8,
]
]
```See Workerman's document:
[简体中文](http://doc3.workerman.net/worker-development/property.html)
[English](http://wiki.workerman.net/Workerman_documentation#Properties)
## Websocket Usage
### Subprotocols
See Mozilla's Document: [Writing WebSocket server](https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#Subprotocols)
The default subprotocol is [jsonrpc](http://json-rpc.org/), but has some different: `params` is an object, and two more properties:
`status` as HTTP status code
`method` is the same as request's method
You can define your own subprotocol, by implements `Laravoole\WebsocketCodec\CodecInterface` and add to `config/laravoole.php`.
### Client Example:
```html
WebSocket Test
p{word-wrap: break-word;}
tr:nth-child(odd){background-color: #ccc}
tr:nth-child(even){background-color: #eee}WebSocket Test
var wsUri = "ws://localhost:9050/websocket";
var protocols = ['jsonrpc'];
var output = document.getElementById("output");function send(message) {
websocket.send(message);
log('Sent', message);
}function log(type, str) {
str = str.replace(/&/g, '&').replace(/"/g, '"').replace(/'/g, ''').replace(/</g, '<').replace(/>/g, '>');
output.insertAdjacentHTML('beforeend', '<tr><td>' + type + '</td><td><p>' + htmlEscape(str) + '</p></td></tr>');
}websocket = new WebSocket(wsUri, protocols);
websocket.onopen = function(evt) {
log('Status', "Connection opened");
send(JSON.stringify({method: '/', params: {hello: 'world'}, id: 1}));
setTimeout(function(){ websocket.close() },1000)
};
websocket.onclose = function(evt) { log('Status', "Connection closed") };
websocket.onmessage = function(evt) { log('<span style="color: blue;">Received</span>', evt.data) };
websocket.onerror = function(evt) { log('<span style="color: red;">Error</span>', evt.data) };