文章851
标签121
分类10

Swoole 日志 部分代码

/**
 * @desc work进程内日志 仅限work 进程内使用
 * @author lbf
 * @param $msg
 * @param string $name
 *------------------------------------------------------
 */
public static function Wlog($msg, $name = Log::MATCH)
{
    if (!Main::WRITE_DEBUG_LOG && $name == Log::DEBUG) return;

    $name = $name == Log::DEBUG ? Log::MATCH : $name;
    $name = $name == Log::SQL ? Log::MATCH : $name;

    $str = '';
    if (is_array($msg)) {
        foreach ($msg as $key => $val) {
            if (is_array($val))
                $val = json_encode($val);
            $str .= " {$key} {$val}";
        }
    } else {
        $str = $msg;
    }

    $worker_id = APP::getWorkerId();
    if ($worker_id < 0) {
        $worker_id = 'task';
    }
    $date = date('Y/m/d H:i:s');
    $no = date('Ymd');
    $log_dir = LOG_PATH . DS . self::getLogName();
    if (!is_dir($log_dir)) {
        @mkdir($log_dir, 0755, true);
    }
    $file_name = LOG_PATH . DS . self::getLogName() . DS . $name . '-' . $worker_id . '-' . $no . '.log';
    $data = "[" . $date . "]";
    $data .= " _" . APP::getUniqueLogId() . "_";
    $data .= " @ " . $str . "\n";

    file_put_contents($file_name, $data, FILE_APPEND);
}

PHP 和 Nginx 实现实时输出的方法

在 Web 开发中,实时输出(或称为流式输出)允许服务器逐步发送数据到客户端,而不是一次性发送所有内容。这对于长时间运行的 PHP 脚本(例如处理文件上传、实时数据生成等)非常有用。本文将介绍如何使用 PHP 和 Nginx 实现实时输出。

为什么使用实时输出?

  • 提升用户体验: 用户可以在处理时间较长的请求时看到进度。
  • 减少服务器负载: 逐步输出可以减少内存使用,特别是在处理大数据集时。
  • 保持连接: 对于长时间运行的脚本,可以保持与客户端的连接,避免超时。

实现方法

下面是实现 PHP 和 Nginx 实时输出的步骤。

1. 配置 Nginx

首先,确保 Nginx 配置文件支持 HTTP/1.1,以便处理持久连接。你可以在 Nginx 的配置文件中添加以下设置:

http {
    ...
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    ...
}

2. 创建 PHP 脚本

在 PHP 脚本中,我们将使用 ob_flush()flush() 函数实现逐步输出。以下是一个简单的示例:

<?php
// 设置响应头
header("Content-Type: text/plain");
header("Cache-Control: no-cache");
header("Connection: keep-alive");

// 模拟长时间运行的任务
for ($i = 0; $i <= 100; $i += 10) {
    // 输出进度
    echo "Progress: $i%\n";

    // 刷新输出缓冲区
    ob_flush(); // 将输出发送到浏览器
    flush();    // 刷新系统输出缓冲区

    // 模拟处理时间
    sleep(1);   // 每次循环等待 1 秒
}

3. 设置 PHP 输出缓冲

为了确保输出能够实时发送到客户端,我们需要禁用 PHP 的输出缓冲。可以在 PHP 脚本的开头添加以下代码:

if (ob_get_level()) ob_end_flush(); // 清除现有输出缓冲
ob_implicit_flush(); // 启用隐式输出缓冲

这样可以确保 PHP 不会将输出缓存,而是立即发送到客户端。

4. 使用 AJAX 轮询(可选)

如果你希望在客户端实时显示进度,可以使用 AJAX 进行轮询。例如,使用 jQuery 来定期请求进度:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>实时输出示例</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <pre id="output"></pre>
    <script>
        setInterval(function() {
            $.get("your-php-script.php", function(data) {
                $("#output").append(data + "\n");
            });
        }, 1000); // 每秒请求一次
    </script>
</body>
</html>

5. 测试和优化

  • 测试: 启动 Nginx 并访问 PHP 脚本,观察输出。
  • 优化: 根据实际需求调整 Nginx 和 PHP 的配置,以达到最佳性能。

注意事项

  • 浏览器支持: 不同浏览器对实时输出的支持程度不同,某些浏览器可能会缓存输出。
  • 超时设置: 根据脚本执行时间,适当调整 Nginx 和 PHP 的超时设置,以避免连接中断。
  • 网络延迟: 网络延迟可能影响实时输出的效果。

总结

通过以上步骤,你可以轻松地在 PHP 和 Nginx 中实现实时输出。这种方式不仅提升了用户体验,还能有效管理服务器资源。希望这篇文章能帮助你更好地理解和实现实时输出功能!

参考资料

查看网络命令 查看DNS

在网络管理和故障排除中,DNS(域名系统)是一个至关重要的组成部分。本文将介绍如何使用各种网络命令查看 DNS 记录,帮助你更好地理解和管理网络。

什么是 DNS?

DNS 是将域名转换为 IP 地址的系统,使用户能够使用易于记忆的域名(如 example.com)访问网站,而无需记住复杂的数字 IP 地址(如 192.0.2.1)。DNS 记录存储在 DNS 服务器上,主要包括 A 记录、CNAME 记录、MX 记录等。

常用的 DNS 查询命令

1. nslookup

nslookup 是一个用于查询 DNS 记录的命令行工具。它可以在 Windows、macOS 和 Linux 系统上使用。

使用示例

nslookup example.com

该命令将返回 example.com 的 A 记录及其对应的 IP 地址。

查询特定记录类型

要查询特定类型的 DNS 记录,例如 MX(邮件交换)记录,可以使用以下命令:

nslookup -query=MX example.com

2. dig

dig(Domain Information Groper)是另一个强大的 DNS 查询工具,通常在 Linux 和 macOS 系统上预装。dig 提供了更详细的输出,适合高级用户。

使用示例

dig example.com

该命令将返回 example.com 的 A 记录及其他相关信息。

查询特定记录类型

要查询特定类型的记录,例如 TXT 记录,可以使用:

dig TXT example.com

3. host

host 是一个简单的命令行工具,用于执行 DNS 查询。它通常在 Linux 和 macOS 系统上可用。

使用示例

host example.com

该命令将返回 example.com 的 A 记录。

查询特定记录类型

要查询 MX 记录,可以使用:

host -t MX example.com

4. ping

虽然 ping 主要用于测试网络连通性,但它也可以用来查看域名解析是否正常。执行 ping 命令时,系统会显示域名对应的 IP 地址。

使用示例

ping example.com

该命令将返回 example.com 的 IP 地址及其响应时间。

注意事项

  • DNS 缓存: 许多操作系统和应用程序会缓存 DNS 查询结果,因此在进行 DNS 查询时,可能会看到缓存的结果。如果需要查看最新的 DNS 记录,建议清除 DNS 缓存。
  • 使用 DNS 服务器: 默认情况下,以上命令将使用本地配置的 DNS 服务器。如果需要查询其他 DNS 服务器,可以在命令中指定 DNS 服务器的 IP 地址。

总结

了解如何使用网络命令查看 DNS 记录是网络管理的重要技能。通过 nslookupdighostping 等工具,你可以快速获取域名的 DNS 信息,帮助你更好地管理和排查网络问题。

参考资料

报错 unix:///tmp/supervisor.sock no such file

在使用supervisor进行进程管理时,启动 supervisorctl,启动时候报错

 unix:///tmp/supervisor.sock no such file

然后网上搜了一堆也没解决问题,后来去看supervisor.log,发现supervisord一启动,过了几秒就自动to die了。

后来在stackOverFlow看到了这个问题
尝试去修改了下/etc/supervisord.conf中的

[unix_http_server]
file=/tmp/supervisor.sock   ; (the path to the socket file)
chmod=0700                 ; socket file mode (default 0700)
chown=nobody:nogroup       ; socket file uid:gid owner
username=root              ; (default is no username (open server))
password=root               ; (default is no password (open server))

之后再启动就成功了,不会报错,也不会自动die了

supervisord -c /etc/supervisord.conf

注意:用supervisorctl查看进程状态时会提示输入账号密码

supervisorctl

sockpid统一放到/var/run下面,并且把run设个777

 (adsbygoogle = window.adsbygoogle || []).push({});  

安装 ab 和 htpasswd

yum install httpd-tools

完成后,就可以直接运行ab

# which ab
/usr/bin/ab

# rpm -qf /usr/bin/ab
httpd-tools-2.2.15-47.el6.centos.1.x86_64

# which htpasswd
/usr/bin/htpasswd

压测方法,一定要指定页面名

/usr/bin/ab  -n 3000 -c 3000 https://www.baidu.com/index.php

压测之前先执行下面命令

ulimit -n 65535​
">