您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
workerman常见问题-php的几种回调写法-类方法作为回调
发布时间:2022-01-13 19:41:30编辑:雪饮阅读()
启动脚本:
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
class MyClass{
public function __construct(){}
public function onWorkerStart(Worker $worker){}
public function onConnect(TcpConnection $connection){}
public function onMessage(TcpConnection $connection, $message) {
$connection->send('hello world class Function');
}
public function onClose(TcpConnection $connection){}
public function onWorkerStop(TcpConnection $connection){}
}
$my_object = new MyClass();
$http_worker = new Worker("http://0.0.0.0:2345");
// 匿名函数回调
$http_worker->onMessage = [$my_object,"onMessage"];
Worker::runAll();
启动及访问:
[root@localhost workerman]# /www/server/php/73/bin/php -c /www/server/php/73/etc/php.ini index.php start -d
Workerman[index.php] start in DAEMON mode
----------------------------------------- WORKERMAN -----------------------------------------
Workerman version:4.0.26 PHP version:7.3.31
------------------------------------------ WORKERS ------------------------------------------
proto user worker listen processes status
tcp root none http://0.0.0.0:2345 1 [OK]
---------------------------------------------------------------------------------------------
Input "php index.php stop" to stop. Start success.
[root@localhost workerman]# elinks http://127.0.0.1:2345 --dump
hello world class Function
注意:
以上的代码结构不允许在构造函数里初始化资源(MySQL连接、Redis连接、Memcache连接等),因为$my_object = new MyClass();运行在主进程。以MySQL为例,在主进程初始化的MySQL连接等资源会被子进程继承,每个子进程都可以操作这个数据库连接,但是这些连接在MySQL服务端对应的是同一个连接,会发生不可预期的错误,例如mysql gone away 错误。
以上代码结构如果需要在类的构造函数里初始化资源,可以采用以下写法。
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
require_once __DIR__ . '/vendor/autoload.php';
class MyDbClass{
}
class MyClass{
public function __construct(){
// 假设数据库连接类是MyDbClass
$db = new MyDbClass();
file_put_contents("db_test",time());
}
public function onWorkerStart(Worker $worker){}
public function onConnect(TcpConnection $connection){}
public function onMessage(TcpConnection $connection, $message) {
$connection->send('hello world class Function');
}
public function onClose(TcpConnection $connection){}
public function onWorkerStop(TcpConnection $connection){}
}
$http_worker = new Worker("http://0.0.0.0:2345");
// 在onWorkerStart里初始化类
$http_worker->onWorkerStart = function($worker) {
// 创建一个对象
$my_object = new MyClass();
// 调用类的方法
$worker->onConnect = array($my_object, 'onConnect');
$worker->onMessage = array($my_object, 'onMessage');
$worker->onClose = array($my_object, 'onClose');
$worker->onWorkerStop = array($my_object, 'onWorkerStop');
};
Worker::runAll();
脚本启动并访问验证:
[root@localhost workerman]# /www/server/php/73/bin/php -c /www/server/php/73/etc/php.ini index.php start -d
Workerman[index.php] start in DAEMON mode
----------------------------------------- WORKERMAN -----------------------------------------
Workerman version:4.0.26 PHP version:7.3.31
------------------------------------------ WORKERS ------------------------------------------
proto user worker listen processes status
tcp root none http://0.0.0.0:2345 1 [OK]
---------------------------------------------------------------------------------------------
Input "php index.php stop" to stop. Start success.
[root@localhost workerman]# elinks http://127.0.0.1:2345 --dump
hello world class Function
[root@localhost workerman]# cat db_test
1642043857
上面代码结构中onWorkerStart运行时已经是属于子进程,等于每个子进程各自建立自己的MySQL连接,所以不会有共享连接的问题。
这样还有一个好处就是支持业务代码reload。由于MyClass.php是在子进程载入的,根据reload规则业务更改MyClass.php后直接reload即可生效。
关键字词:workerman,常见问题,php,回调,类,方法
相关文章
- workerman常见问题-php的几种回调写法-普通函数回调
- workerman作爲客戶端系列之socket5即s5代理搭建基於ce
- workerman作爲客戶端系列之http代理搭建
- workerman作爲客戶端-作爲ws或wss客戶端-做為ws客戶端
- workerman創建https服務(普通請求轉https請求,基於寶塔
- workerman創建https服務
- workerman創建wss服務(基於apache基於phpstudy環境)
- workerman創建wss服務-(配置于nginx上作爲nginx的locat
- workerman-常見問題-創建wss服務-直接用Workerman开启
- php7.3對sqlserver2008数据库连接查询