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 记录是网络管理的重要技能。通过 nslookup、dig、host 和 ping 等工具,你可以快速获取域名的 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
sock和pid统一放到/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