workerman是什么?
Workerman是一个异步事件驱动的PHP框架,具有高性能,可轻松构建快速,可扩展的网络应用程序。支持HTTP,Websocket,SSL和其他自定义协议。支持libevent,HHVM,ReactPHP。
推荐:《workerman教程》
要求
PHP 5.3或更高版本 兼容POSIX的操作系统(Linux,OSX,BSD) 用于PHP的POSIX和PCNTL扩展
安装
composer require workerman/workerman
基本用法
websocket服务器
<?php require_once __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; // 创建一个Websocket服务器 $ws_worker = new Worker("websocket://0.0.0.0:2346"); $ws_worker->count = 4; // 在新连接到来时发出 $ws_worker->onConnect = function($connection) { echo "New connection\n"; }; // 接收数据时发出 $ws_worker->onMessage = function($connection, $data) { // Send hello $data $connection->send('hello ' . $data); }; // 连接关闭时发出 $ws_worker->onClose = function($connection) { echo "Connection closed\n"; }; // 运行worker Worker::runAll();
http服务器
require_once __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; // #### http worker #### $http_worker = new Worker("http://0.0.0.0:2345"); $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"); }; // 运行所有workers Worker::runAll();
WebServer
require_once __DIR__ . '/vendor/autoload.php'; use Workerman\WebServer; use Workerman\Worker; // WebServer $web = new WebServer("http://0.0.0.0:80"); $web->count = 4; $web->addRoot('www.your_domain.com', '/your/path/Web'); $web->addRoot('www.another_domain.com', '/another/path/Web'); Worker::runAll();
TCP服务器
require_once __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; // #### 创建socket并监听1234端口 #### $tcp_worker = new Worker("tcp://0.0.0.0:1234"); $tcp_worker->count = 4; //在新连接到来时发出 $tcp_worker->onConnect = function($connection) { echo "New Connection\n"; }; // 接收数据时发出 $tcp_worker->onMessage = function($connection, $data) { // 发送数据给客户端 $connection->send("hello $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', 'verify_peer' => false, ) ); // 创建一个带有ssl的Websocket服务器。 $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) { // 发送hello $data $connection->send('hello ' . $data); }; Worker::runAll();
自定义协议
Protocols/MyTextProtocol.php
namespace Protocols; /** * 用户定义的协议 *格式文本+“\ n” */ class MyTextProtocol { public static function input($recv_buffer) { // 找到“\n”第一个出现的位置 $pos = strpos($recv_buffer, "\n"); // 不是一个完整的package。返回0,因为package的长度无法计算 if($pos === false) { return 0; } // 返回package的长度 return $pos+1; } public static function decode($recv_buffer) { return trim($recv_buffer); } public static function encode($data) { return $data."\n"; } }
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) { // 发送数据给客户端 $connection->send("hello world \n"); }; $text_worker->onClose = function($connection) { echo "Connection closed\n"; }; // 运行所有workers Worker::runAll();
计时器
require_once __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Lib\Timer; $task = new Worker(); $task->onWorkerStart = function($task) { // 2.5秒 $time_interval = 2.5; $timer_id = Timer::add($time_interval, function() { echo "Timer run\n"; } ); }; //运行 Worker::runAll();
AsyncTcpConnection(tcp / ws / text / frame等...)
require_once __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; use Workerman\Connection\AsyncTcpConnection; $worker = new Worker(); $worker->onWorkerStart = function() { //客户端Websocket协议。 $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();
ReactPHP的异步Mysql
composer require react/mysql
<?php require_once __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; $worker = new Worker('tcp://0.0.0.0:6161'); $worker->onWorkerStart = function() { global $mysql; $loop = Worker::getEventLoop(); $mysql = new React\MySQL\Connection($loop, array( 'host' => '127.0.0.1', 'dbname' => 'dbname', 'user' => 'user', 'passwd' => 'passwd', )); $mysql->on('error', function($e){ echo $e; }); $mysql->connect(function ($e) { if($e) { echo $e; } else { echo "connect success\n"; } }); }; $worker->onMessage = function($connection, $data) { global $mysql; $mysql->query('show databases' /*trim($data)*/, function ($command, $mysql) use ($connection) { if ($command->hasError()) { $error = $command->getError(); } else { $results = $command->resultRows; $fields = $command->resultFields; $connection->send(json_encode($results)); } }); }; Worker::runAll();
ReactPHP的Async Redis
composer require clue/redis-react
<?php require_once __DIR__ . '/vendor/autoload.php'; use Clue\React\Redis\Factory; use Clue\React\Redis\Client; use Workerman\Worker; $worker = new Worker('tcp://0.0.0.0:6161'); $worker->onWorkerStart = function() { global $factory; $loop = Worker::getEventLoop(); $factory = new Factory($loop); }; $worker->onMessage = function($connection, $data) { global $factory; $factory->createClient('localhost:6379')->then(function (Client $client) use ($connection) { $client->set('greeting', 'Hello world'); $client->append('greeting', '!'); $client->get('greeting')->then(function ($greeting) use ($connection){ // Hello world! echo $greeting . PHP_EOL; $connection->send($greeting); }); $client->incr('invocation')->then(function ($n) use ($connection){ echo 'This is invocation #' . $n . PHP_EOL; $connection->send($n); }); }); }; Worker::runAll();
Aysnc dns的ReactPHP
composer require react/dns
require_once __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; $worker = new Worker('tcp://0.0.0.0:6161'); $worker->onWorkerStart = function() { global $dns; // Get event-loop. $loop = Worker::getEventLoop(); $factory = new React\Dns\Resolver\Factory(); $dns = $factory->create('8.8.8.8', $loop); }; $worker->onMessage = function($connection, $host) { global $dns; $host = trim($host); $dns->resolve($host)->then(function($ip) use($host, $connection) { $connection->send("$host: $ip"); },function($e) use($host, $connection){ $connection->send("$host: {$e->getMessage()}"); }); }; Worker::runAll();
ReactPHP的Http客户端
composer require react/http-client
<?php require_once __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; $worker = new Worker('tcp://0.0.0.0:6161'); $worker->onMessage = function($connection, $host) { $loop = Worker::getEventLoop(); $client = new \React\HttpClient\Client($loop); $request = $client->request('GET', trim($host)); $request->on('error', function(Exception $e) use ($connection) { $connection->send($e); }); $request->on('response', function ($response) use ($connection) { $response->on('data', function ($data) use ($connection) { $connection->send($data); }); }); $request->end(); }; Worker::runAll();
ReactPHP的ZMQ
composer require react/zmq
<?php require_once __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; $worker = new Worker('text://0.0.0.0:6161'); $worker->onWorkerStart = function() { global $pull; $loop = Worker::getEventLoop(); $context = new React\ZMQ\Context($loop); $pull = $context->getSocket(ZMQ::SOCKET_PULL); $pull->bind('tcp://127.0.0.1:5555'); $pull->on('error', function ($e) { var_dump($e->getMessage()); }); $pull->on('message', function ($msg) { echo "Received: $msg\n"; }); }; Worker::runAll();
react的STOMP
composer require react/stomp
<?php require_once __DIR__ . '/vendor/autoload.php'; use Workerman\Worker; $worker = new Worker('text://0.0.0.0:6161'); $worker->onWorkerStart = function() { global $client; $loop = Worker::getEventLoop(); $factory = new React\Stomp\Factory($loop); $client = $factory->createClient(array('vhost' => '/', 'login' => 'guest', 'passcode' => 'guest')); $client ->connect() ->then(function ($client) use ($loop) { $client->subscribe('/topic/foo', function ($frame) { echo "Message received: {$frame->body}\n"; }); }); }; Worker::runAll();
可用命令
php start.php start php start.php start -d
php start.php status [object Object]
php start.php connections php start.php stop php start.php restart php start.php reload
基准
CPU: Intel(R) Core(TM) i3-3220 CPU @ 3.30GHz and 4 processors totally Memory: 8G OS: Ubuntu 14.04 LTS Software: ab PHP: 5.5.9
代码
<?php use Workerman\Worker; $worker = new Worker('tcp://0.0.0.0:1234'); $worker->count=3; $worker->onMessage = function($connection, $data) { $connection->send("HTTP/1.1 200 OK\r\nConnection: keep-alive\r\nServer: workerman\r\nContent-Length: 5\r\n\r\nhello"); }; Worker::runAll();
结果
ab -n1000000 -c100 -k http://127.0.0.1:1234/ This is ApacheBench, Version 2.3 <$Revision: 1528965 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 127.0.0.1 (be patient) Completed 100000 requests Completed 200000 requests Completed 300000 requests Completed 400000 requests Completed 500000 requests Completed 600000 requests Completed 700000 requests Completed 800000 requests Completed 900000 requests Completed 1000000 requests Finished 1000000 requests Server Software: workerman/3.1.4 Server Hostname: 127.0.0.1 Server Port: 1234 Document Path: / Document Length: 5 bytes Concurrency Level: 100 Time taken for tests: 7.240 seconds Complete requests: 1000000 Failed requests: 0 Keep-Alive requests: 1000000 Total transferred: 73000000 bytes HTML transferred: 5000000 bytes Requests per second: 138124.14 [#/sec] (mean) Time per request: 0.724 [ms] (mean) Time per request: 0.007 [ms] (mean, across all concurrent requests) Transfer rate: 9846.74 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.0 0 5 Processing: 0 1 0.2 1 9 Waiting: 0 1 0.2 1 9 Total: 0 1 0.2 1 9 Percentage of the requests served within a certain time (ms) 50% 1 66% 1 75% 1 80% 1 90% 1 95% 1 98% 1 99% 1 100% 9 (longest request)
本篇文章就是关于workerman的相关介绍,希望对需要的朋友有所帮助!
以上是workerman的基本用法(示例详解)的详细内容。更多信息请关注PHP中文网其他相关文章!

绝对会话超时从会话创建时开始计时,闲置会话超时则从用户无操作时开始计时。绝对会话超时适用于需要严格控制会话生命周期的场景,如金融应用;闲置会话超时适合希望用户长时间保持会话活跃的应用,如社交媒体。

服务器会话失效可以通过以下步骤解决:1.检查服务器配置,确保会话设置正确。2.验证客户端cookies,确认浏览器支持并正确发送。3.检查会话存储服务,如Redis,确保其正常运行。4.审查应用代码,确保会话逻辑正确。通过这些步骤,可以有效诊断和修复会话问题,提升用户体验。

session_start()iscucialinphpformanagingusersessions.1)ItInitiateSanewsessionifnoneexists,2)resumesanexistingsessions,and3)setsasesessionCookieforContinuityActinuityAccontinuityAcconActInityAcconActInityAcconAccRequests,EnablingApplicationsApplicationsLikeUseAppericationLikeUseAthenticationalticationaltication and PersersonalizedContentent。

设置httponly标志对会话cookie至关重要,因为它能有效防止XSS攻击,保护用户会话信息。具体来说,1)httponly标志阻止JavaScript访问cookie,2)在PHP和Flask中可以通过setcookie和make_response设置该标志,3)尽管不能防范所有攻击,但应作为整体安全策略的一部分。

phpsessions solvathepromblymaintainingStateAcrossMultipleHttpRequestsbyStoringDataTaNthEserVerAndAssociatingItwithaIniquesestionId.1)他们储存了AtoredAtaserver side,通常是Infilesordatabases,InseasessessionIdStoreDistordStoredStoredStoredStoredStoredStoredStoreDoreToreTeReTrestaa.2)

tostartaphpsession,usesesses_start()attheScript'Sbeginning.1)placeitbeforeanyOutputtosetThesessionCookie.2)useSessionsforuserDatalikeloginstatusorshoppingcarts.3)regenerateSessiveIdStopreventFentfixationAttacks.s.4)考虑使用AttActAcks.s.s.4)

会话再生是指在用户进行敏感操作时生成新会话ID并使旧ID失效,以防会话固定攻击。实现步骤包括:1.检测敏感操作,2.生成新会话ID,3.销毁旧会话ID,4.更新用户端会话信息。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

SublimeText3汉化版
中文版,非常好用

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

Atom编辑器mac版下载
最流行的的开源编辑器