做個備忘錄
此機制會產生進程數(shù)量的鏈接
// bootstap/Mqtt.php
<?php
namespace bootstrap;
use Webman\Bootstrap;
class Mqtt implements Bootstrap
{
protected static $mqtt = null;
protected static $connected = false;
public static function start($worker)
{
$mqtt = new \Workerman\Mqtt\Client('mqtt://0.0.0.1:1883', [
'username' => 'xxx',
'password' => 'xxx',
'debug' => true
]);
$mqtt->connect();
$mqtt->onConnect = function ($mqtt) {
self::$connected = true;
if (!empty($mqtt->waitQueue)) {
foreach ($mqtt->waitQueue as $item) {
$mqtt->publish($item[0], $item[1]);
}
$mqtt->waitQueue = [];
}
};
static::$mqtt = $mqtt;
}
public static function publish($t, $m)
{
if (static::$connected === false) {
static::$mqtt->waitQueue[] = [$t, $m];
return;
}
static::$mqtt->publish($t, $m);
}
}
// config/bootstap.php
...
return [
...
bootstrap\Mqtt::class,
];
推送使用方式
use bootstrap\Mqtt;
Mqtt::publish($topic, $content);
// process/MqttClient.php
<?php
namespace process;
class MqttClient
{
protected static $mqtt = null;
protected static $connected = false;
public function onWorkerStart()
{
$mqtt = new \Workerman\Mqtt\Client('mqtt://0.0.0.1:1883', [
'username' => 'xxx',
'password' => 'xxx',
'debug' => true
]);
$mqtt->connect();
$mqtt->onConnect = function ($mqtt) {
self::$connected = true;
};
// \Workerman\Timer::add(2, function () use ($mqtt) {
// $mqtt->publish('workerman', 'hello workerman mqtt');
// });
static::$mqtt = $mqtt;
}
public function onMessage($connection, string $data)
{
if (self::$connected) {
// 通過data中的信息動態(tài)發(fā)布
$arr = json_decode($data, true);
self::$mqtt->publish($arr['topic'], $arr['content']);
}
$connection->close($data);
}
}
// config/process.php
'mqttclient' => [
'handler' => process\MqttClient::class,
'listen' => 'tcp://0.0.0.0:8789',
'count' => 1, // 進程數(shù)
],
推送使用方式
$client = stream_socket_client('tcp://0.0.0.0:8789');
$data = [
'topic' => $topic,
'content' => $content,
];
stream_socket_sendto($client, json_encode($data));
“利用webman啟動時自動運行機制”使用這個方法,執(zhí)行命令行命令出錯了。
/www # php webman list
Fatal error: Uncaught Error: Call to a member function add() on null in /www/vendor/workerman/workerman/Connection/AsyncTcpConnection.php:215
Stack trace:
#0 /www/vendor/workerman/mqtt/src/Client.php(252): Workerman\Connection\AsyncTcpConnection->connect()
#1 /www/app/service/Mqtt.php(19): Workerman\Mqtt\Client->connect()
#2 /www/support/bootstrap.php(93): app\service\Mqtt::start(NULL)
#3 /www/webman(12): require_once('/www/support/bo...')
#4 {main}
thrown in /www/vendor/workerman/workerman/Connection/AsyncTcpConnection.php on line 215
/www # php -v
PHP 8.0.13 (cli) (built: Nov 30 2021 07:57:55) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.13, Copyright (c) Zend Technologies
/www #
有人遇到過嗎?
good good