猫言猫语

严以律己·宽以待人·自强不息·知行合一

使用 php-mqtt/client 进行 MQTT 消息发布与订阅

| 使用 php-mqtt/client 进行 MQTT 消息发布与订阅已关闭评论

composer require php-mqtt/client
<?php
require __DIR__.'/vendor/autoload.php';

use PhpMqtt\Client\MqttClient;

$client = new MqttClient('127.0.0.1', 1883, 'client1');
$client->connect();
$client->publish('topic', 'Hello World!');
$client->disconnect();
<?php
require __DIR__.'/vendor/autoload.php';

use PhpMqtt\Client\MqttClient;

$client = new MqttClient('127.0.0.1', 1883, 'client2');
$client->connect();
$client->subscribe('topic', function($topic, $message) {
    echo $topic, $message, PHP_EOL;
});
$client->loop(true);
$client->disconnect();

Java 作为客户端发布 MQTT 消息

| Java 作为客户端发布 MQTT 消息已关闭评论

首先引入 MQTT 库:

<dependency>
  <groupId>org.eclipse.paho</groupId>
  <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
  <version>1.2.5</version>
</dependency>

然后编写相应 Java 代码,MqttClient 中的第三个 null 参数非常重要,如果没有设置在 Linux 下会因为权限问题出错。

public static void main( String[] args ) throws MqttException {
    MqttClient client = new MqttClient("tcp://localhost:1883", "client1", null);
    client.connect();
    client.publish("topic1", new MqttMessage());
    client.disconnect();
}

Spring Boot 编译为 WAR 包运行

| Spring Boot 编译为 WAR 包运行已关闭评论

重点是修改 pom.xml 中的 packaging 标签,设置其值为 war。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.13</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <name>demo</name>
    <description>demo</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

CentOS 通过 yum 安装 go 语言环境

| CentOS 通过 yum 安装 go 语言环境已关闭评论

rpm --import https://mirror.go-repo.io/centos/RPM-GPG-KEY-GO-REPO
curl -s https://mirror.go-repo.io/centos/go-repo.repo | tee /etc/yum.repos.d/go-repo.repo
yum install golang

使用 Docker 镜像快速运行 Sentinel Dashboard

| 使用 Docker 镜像快速运行 Sentinel Dashboard已关闭评论

我们可以使用 Docker 镜像快速运行 Sentinel Dashboard

docker run -p 8858:8858 bladex/sentinel-dashboard

再使用默认的用户名/密码:sentinel/seltinel 登录,然后你就可以看到很强大的控制台界面了

基于 Docker 快速启动 Nacos

| 基于 Docker 快速启动 Nacos已关闭评论

基于 Docker 快速启动一个使用 Derby 数据库、单机模式的 Nacos 用于测试

docker run -p 8848:8848 --env MODE=standalone nacos/nacos-server

使用浏览器打开启动提示中的 Console 地址:http://10.0.0.8:8848/nacos/index.html,输入默认用户名/密码:nacos/nacos,即可开始测试体验。

解决 PHP SoapClient 产生大量 CLOSE-WAIT TCP 连接

| 解决 PHP SoapClient 产生大量 CLOSE-WAIT TCP 连接已关闭评论

服务器上使用 PHP SoapClient 作为 WebService 客户端调用第三方接口,发现存在大量 CLOSE-WAIT 状态 TCP 连接。

解决办法是设置 keep_alive 参数,使 SoapClient 不保持连接,具体 PHP 代码如下:

<?php
new SoapClient("http://webservice.test/", [
    "keep_alive" => false,
]);

使 PHPUnit 支持 Session

| 使 PHPUnit 支持 Session已关闭评论

当使用PHPUnit测试的PHP代码中包含session_start()时,就会出现以下的错误提示:

PHPUnit 4.8.36 by Sebastian Bergmann and contributors.

E

Time: 110 ms, Memory: 12.00MB

There was 1 error:

1) ExampleTest::testBasicExample
ErrorException: session_start(): Cannot start session when headers already sent

解决办法是打开phpunit.xml文件,设置processIsolation属性为true

PHP WebSocket Server Demo

| PHP WebSocket Server Demo已关闭评论

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, "0.0.0.0", 9501);
socket_listen($socket, 5);
for(;;) {
    $client = socket_accept($socket);
    if (!pcntl_fork()) {
        $buffer = socket_read($client, 2048);
        $headers = explode("\r\n", $buffer);
        foreach($headers as $header) {
            if (strstr($header, "Sec-WebSocket-Key:")) {
                $key = trim(str_replace("Sec-WebSocket-Key:", "", $header));
                $accept = base64_encode(sha1($key . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));
            }
        }
 
        socket_write($client, "HTTP/1.1 101 Switching Protocols\r\n");
        socket_write($client, "Upgrade: websocket\r\n");
        socket_write($client, "Connection: Upgrade\r\n");
        socket_write($client, "Sec-WebSocket-Accept: $accept\r\n");
        socket_write($client, "\r\n");
 
        for ($i = 0;; $i++) {
            $buffer = socket_read($client, 2048);
            echo $buffer;
        }
        socket_close($client);
        exit(0);
    } else {
        socket_close($client);
    }
}
socket_close($socket);