要在 Ubuntu 上进行端口扫描,你可以使用一些常见的工具,如 Nmap 和 Netcat(nc)。这些工具可以帮助你扫描主机上开放的端口。
使用 Nmap 进行端口扫描:
首先,确保你已经安装了 Nmap。如果没有,请在终端中运行以下命令安装:
sudo apt update
sudo apt install nmap 要在 Ubuntu 上进行端口扫描,你可以使用一些常见的工具,如 Nmap 和 Netcat(nc)。这些工具可以帮助你扫描主机上开放的端口。
使用 Nmap 进行端口扫描:
首先,确保你已经安装了 Nmap。如果没有,请在终端中运行以下命令安装:
sudo apt update
sudo apt install nmap 如何在Linux Shell中读取WebSocket响应
curl 'wss://ws.test.com' -H 'Upgrade: websocket' -H 'Connection: Upgrade' --verbose
* Protocol "wss" not supported or disabled in libcurl
* Closing connection -1
curl: (1) Protocol "wss" not supported or disabled in libcurl
npm install -g wscat
/usr/bin/wscat -> /usr/lib/node_modules/wscat/bin/wscat
npm WARN notsup Unsupported engine for commander@9.5.0: wanted: {"node":"^12.20.0 || >=14"} (current: {"node":"8.17.0","npm":"6.13.4"})
npm WARN notsup Not compatible with your version of node/npm: commander@9.5.0
npm WARN notsup Unsupported engine for ws@8.16.0: wanted: {"node":">=10.0.0"} (current: {"node":"8.17.0","npm":"6.13.4"})
npm WARN notsup Not compatible with your version of node/npm: ws@8.16.0
+ wscat@5.2.0
added 9 packages from 7 contributors in 1.264s指令测试
wscat -c 'wss://ws.test.com'
Connected (press CTRL+C to quit)起码可以测试下 websocket 是否握手成功
[13-Dec-2023 14:48:48 Asia/Shanghai] PHP Warning: simplexml_load_string(): ^ in Library/Supervisor/Client.php on line 777
[13-Dec-2023 14:48:50 Asia/Shanghai] PHP Warning: simplexml_load_string(): Entity: line 6: parser error : Input is not proper UTF-8, indicate encoding !
Bytes: 0xAA 0xE5 0xA4 0x84 in Library/Supervisor/Client.php on line 777
[13-Dec-2023 14:48:50 Asia/Shanghai] PHP Warning: simplexml_load_string(): <value><string> Library/Supervisor/Client.php on line 777
[13-Dec-2023 14:48:50 Asia/Shanghai] PHP Warning: simplexml_load_string(): ^ in Library/Supervisor/Client.php on line 777上面这些抛错 , 简单描述下问题. 调用 Supervisor接口查看状态 , 需要读取 xml 数据, 之前有文章介绍过.
抛错告知存在不是 UTF-8格式的字符,
处理方案 , 强制转换格式即可
$xmlString = mb_convert_encoding($xmlString, 'UTF-8', 'UTF-8'); MySQL是一种广泛使用的关系型数据库管理系统,它支持许多SQL语句来管理数据库和数据。在MySQL中,我们可以将SQL语句分为三类:DDL语句(数据定义语言)、DML语句(数据操作语言)和DCL语句(数据控制语言)。每种语句都有不同的功能和用途。在本文中,我们将详细介绍这三种类型的语句及其用法。
DDL语句(数据定义语言)用于定义数据库、表和其他数据库对象的结构。它们允许我们创建、修改和删除数据库对象。以下是一些常见的DDL语句:
CREATE DATABASE database_name;用于创建一个新的数据库,CREATE TABLE table_name (column1 datatype, column2 datatype);用于创建一个新的表。ALTER TABLE table_name ADD column_name datatype;用于向表中添加一个新列。DROP DATABASE database_name;用于删除一个数据库,DROP TABLE table_name;用于删除一个表。TRUNCATE TABLE table_name;用于清空一个表。ALTER TABLE table_name RENAME TO new_table_name;用于将表重命名为新的表名。DDL语句对数据库的结构进行操作,但不涉及实际的数据操作。
DML语句(数据操作语言)用于对数据库中的数据进行操作。它们允许我们插入、更新、删除和查询数据。以下是一些常见的DML语句:
INSERT INTO table_name (column1, column2) VALUES (value1, value2);用于向表中插入一行数据。UPDATE table_name SET column_name = new_value WHERE condition;用于根据条件更新表中的数据。DELETE FROM table_name WHERE condition;用于根据条件删除表中的数据。SELECT column1, column2 FROM table_name WHERE condition;用于根据条件查询表中的数据。DML语句用于对数据库中的数据进行操作,包括插入、更新、删除和查询。
DCL语句(数据控制语言)用于管理数据库用户的访问权限和安全性。它们允许我们授予或撤销用户的权限,并管理数据库的安全性。以下是一些常见的DCL语句:
GRANT SELECT, INSERT ON table_name TO user_name;用于将SELECT和INSERT权限授予特定用户。REVOKE INSERT ON table_name FROM user_name;用于从特定用户撤销INSERT权限。DCL语句用于管理数据库用户的访问权限和安全性,确保数据的安全性和完整性。
总结起来,DDL语句用于定义数据库和表的结构,DML语句用于对数据库中的数据进行操作,而DCL语句用于管理用户的访问权限和安全性。熟悉和掌握这些语句的用法对于有效管理和操作MySQL数据库至关重要。希望本文能帮助你更好地理解和应用DDL、DML和DCL语句。
swoole 遇到一个定时器 tick 的问题
WARNING Worker_reactor_try_to_exit() (ERRNO 9101): worker exit timeout, forced termination今天突然发下 swoole 报错了,后来找资料才发现原来是定时器的问题,大概是说定时器设置的时间大于进程退出的时间了
官方文档 :
发现形如以下报错:
WARNING swWorker_reactor_try_to_exit (ERRNO 9012): worker exit timeout, forced to terminate
Copy to clipboardErrorCopied表示在约定的时间 (max_wait_time 秒) 内此 Worker 没有退出,Swoole 底层强行终止此进程。
可使用如下代码进行复现:
use Swoole\Timer;
$server = new Swoole\Server('127.0.0.1', 9501);
$server->set(
[
'reload_async' => true,
'max_wait_time' => 4,
]
);
$server->on('workerStart', function (Swoole\Server $server, int $wid) {
if ($wid === 0) {
Timer::tick(5000, function () {
echo 'tick';
});
Timer::after(500, function () use ($server) {
$server->shutdown();
});
}
});
$server->on('receive', function () {
});
$server->start();