文章851
标签121
分类10

valgrind 程序减少内存泄漏或者错误访问

使用 Valgrind 减少内存泄漏或错误访问

Valgrind 是一个强大的工具,用于检测 C/C++ 程序中的内存泄漏、错误访问和其他内存相关的问题。本文将介绍如何使用 Valgrind 工具来减少内存泄漏或错误访问,并提供一些相关的实用技巧和注意事项。

1. 安装 Valgrind

首先,我们需要安装 Valgrind 工具。在大多数 Linux 发行版中,可以使用包管理器来安装 Valgrind。例如,在 Ubuntu 上,可以使用以下命令进行安装:

sudo apt-get install valgrind

2. 使用 Valgrind 运行程序

使用 Valgrind 运行程序非常简单。只需在程序执行的命令前加上 valgrind 即可。例如:

valgrind ./your_program

Valgrind 将会分析程序的执行过程,并在执行完毕后生成报告,其中包含了检测到的内存泄漏和错误访问的详细信息。

3. 分析 Valgrind 报告

Valgrind 生成的报告包含了详细的信息,帮助我们定位内存泄漏和错误访问。主要的报告类型包括:

  • Memory Leak(内存泄漏):报告中会列出泄漏的内存块的详细信息,包括泄漏的起始地址、大小和分配位置。
  • Invalid Read/Write(错误访问):报告中会列出发生错误访问的地址和访问的大小,以及错误的原因和调用栈信息。

4. 优化程序代码

根据 Valgrind 的报告,我们可以定位到程序中存在的内存泄漏或错误访问的位置。然后,我们需要优化程序代码,修复这些问题。例如,释放未使用的内存、修复指针越界访问等。

文献引用

在使用 Valgrind 工具减少内存泄漏或错误访问时,以下资源可能会提供帮助:

  1. Valgrind 官方网站:Valgrind Home Page
  2. Valgrind 用户手册:Valgrind User Manual

这些资源提供了关于 Valgrind 工具的详细信息、使用方法和最佳实践,有助于更好地理解和利用 Valgrind 来优化程序代码。

通过合理利用 Valgrind 工具来检测和修复程序中的内存泄漏或错误访问,我们可以提高程序的稳定性和性能,确保程序在执行过程中不会因为内存问题而出现异常或崩溃。


通过本文的介绍和指导,读者可以了解如何使用 Valgrind 工具来检测和修复程序中的内存泄漏或错误访问问题,提高程序的质量和可靠性。

PHP中的gzcompress、gzdeflate、gzencode 压缩解压函数

PHP中的gzcompress、gzdeflate、gzencode 压缩解压函数

在PHP中,gzcompressgzdeflategzencode是用于压缩和解压缩数据的函数。本文将介绍这些函数的用法、区别以及一些实际应用场景。

1. gzcompress

gzcompress函数用于对数据进行zlib压缩。它采用DEFLATE算法,并添加zlib头和尾来生成压缩数据。示例代码如下:

$compressed = gzcompress('Hello, world!', 9);

gzcompress函数接受两个参数:要压缩的数据和压缩级别(1-9,9为最高级别)。返回压缩后的数据。

2. gzdeflate

gzdeflate函数也用于对数据进行DEFLATE压缩,但不添加zlib头和尾。示例代码如下:

$deflated = gzdeflate('Hello, world!', 9);

gzdeflate函数接受两个参数:要压缩的数据和压缩级别(1-9,9为最高级别)。返回压缩后的数据。

3. gzencode

gzencode函数用于对数据进行gzip压缩,它添加gzip头和尾,并使用DEFLATE算法压缩数据。示例代码如下:

$encoded = gzencode('Hello, world!', 9);

gzencode函数接受两个参数:要压缩的数据和压缩级别(1-9,9为最高级别)。返回压缩后的数据。

4. 区别和选择

这三个函数的主要区别在于压缩数据时是否添加zlib头和尾,以及压缩数据的格式(gzip或zlib)。在选择使用哪个函数时,需要考虑压缩和解压缩的环境以及对数据格式的要求。

  • 如果需要与其他DEFLATE实现(如Java的java.util.zip.Deflater)兼容,则使用gzdeflate函数。
  • 如果需要生成gzip格式的压缩数据,则使用gzencode函数。
  • 如果只需简单的zlib压缩数据,则使用gzcompress函数。

文献引用

以下是一些关于PHP压缩函数的官方文档和参考资料:

  1. PHP官方文档:gzcompress
  2. PHP官方文档:gzdeflate
  3. PHP官方文档:gzencode

这些资源提供了关于PHP压缩函数的详细说明和使用示例,有助于更好地理解和使用这些函数。

通过合理利用这些压缩函数,我们可以在PHP应用中实现高效的数据压缩和解压缩,提高应用的性能和效率。


通过本文的介绍,读者可以了解到PHP中的gzcompressgzdeflategzencode压缩解压函数的用法和区别,以及如何根据需要选择合适的函数来实现数据压缩和解压缩。

`Websocket` 数据解压缩踩坑

今天业务上需要对接下 其他站点 的 websocket 服务.

坑不少 之前 B平台 对接遇到个 ping&pong 包的问题 Webscocket pong 包 php 踩坑实例

今天对接 O平台 发现官方的demo 没有我大PHP. 太过分了~

新来的同学通过golang demo 找到 golangcompress/flate包 这篇文章找到下面内容:

维基百科给出的解释是:DEFLATE是同时使用了LZ77算法哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。它最初是由菲尔·卡茨(Phil Katz)为他的PKZIP软件第二版所定义的,后来被RFC 1951标准化。

通过 百度 搜索 PHP DEFLATE 数据压缩算法 内容如下:

LZ77: 是一种基于字典的无损数据压缩算法(还有 LZ78, LZW 等)

deflate: 也是一种数据压缩算法,实际上就是先用 LZ77 压缩,然后用霍夫曼编码压缩

gzip: 是一种文件结构,也可以算一种压缩格式,通过 defalte 算法压缩数据,然后加上文件头和adler32校验

zlib: 是一个提供了 deflate, zlib, gzip 压缩方法的函数库;也是一种压缩格式(用 deflate 压缩数据,然后加上 zlib 头和 CRC 校验)

代码示例 我处理了一下 :

<?php

$string = "11aa@#@23123szadler32adler32adler32f..adler32adler32";
$level = 9;

echo "字符串长度:", strlen($string), PHP_EOL;

$zlib = gzcompress($string, $level);
echo "gzcompress 压缩后长度:", strlen($zlib), PHP_EOL;

/*
    78da 3334 4c4c 7450 7630 3236 3432 2eae
    4a4c c949 2d32 3642 a5d2 f4f4 5005 00a7
    2c10 93
*/

$src_zlib = substr($zlib, 2, -4);
echo "zlib还原: " . gzinflate($src_zlib);

内容实际上很多. 3中压缩方式 我就只是挑了对我有用的一种 gzinflate. O平台 的 ws 解压 通过 gzinflate 函数解压即可.

PHP中存在一组看起来很像的压缩解压函数:

压缩函数:gzcompress gzdeflate gzencode

解压函数:gzuncompress gzinflate gzdecode

!!! 追加一个坑 线上 swoole v4.2.11

    websocket_mask
    由于RFC规定, v4.4.0后此配置默认开启, 但会导致性能损耗, 如服务器端无强制要求可以设置false关闭
    
    WebSocket客户端启用或关闭掩码。默认为关闭。启用后会对WebSocket客户端发送的数据使用掩码进行数据转换。
    
    $http->set(['websocket_mask' => true]);

PHP gzcompress 使用中的 坑

今天业务上需要对接 webscocket 接口 服务端推流是经过压缩的数据, 百度顺道发现一篇文章

gzcompress的坑 坑踩得比较实在 收藏一下 防止自己也踩坑

【一、效果】

800k的数据压缩成100k多。效果还是不错。

【二、为什么要压缩】

数据库存不下啊 数据库有个 max_allowed_packet限制数据大小。没有改mysql配置的权限,也不想劳烦其他人干脆自己动手。

【三、使用】

失败的尝试千千万万,只说成功的路

<?php
//入库
$src_data1  = file_get_contents('bb.txt');
//先json,再压缩。如果顺序相反,json的结果是空。
$desc_data1 = json_encode($src_data1,JSON_UNESCAPED_UNICODE);
$desc_data2 = gzcompress($desc_data1);
//上面两步如果简写成 gzcompress(json_encode(数组));得到的会是一顿乱码。
//所以gzcompress()的参数只能是一个变量
$desc_data3 = base64_encode($desc_data2);//为了入库需要base64

file_put_contents('aa.txt', $desc_data3);//入库。这里存储文件代替
 
//出库
$src_data11  = file_get_contents('aa.txt');
$desc_data11 = base64_decode($src_data11);
$desc_data12 = gzuncompress($desc_data11);//解压缩
$desc_data13 = json_decode($desc_data12,true);

file_put_contents('cc.txt',$desc_data13);
 
//对比一下aa.txt与cc.txt的内容。应该是相同的

【四、坑】

如果要json_encode的话,要先于gzcompress执行。如果gzcompress先执行,json_encode返回的是空值。
gzcompress(json_encode(数组))这种写法是不对的,得到的结果是一堆乱码。必须分开写,json_encode处理结果赋值给一个变量,然后gzcompress处理这一变量
gzcompress结果直接存入数据库不会成功。可以base64_encode一下。

个人总结:
数据库受 max_allowed_packet 限制, 压缩数据在入库数据, gzcompress(json_encode(数组)) 乱码 base64 加密后才能入库 (直接入库乱码)

让Json更懂中文(JSON_UNESCAPED_UNICODE)

url格式

URL 格式解析

在互联网上,URL(Uniform Resource Locator)是用于定位资源的标识符。它是网页、图片、视频等资源的地址,也是浏览器通过 HTTP 或者其他协议来获取资源的方式。本文将介绍 URL 的基本结构和各个部分的含义。

1. URL 格式

一个典型的 URL 包含以下几个部分:

scheme://host:port/path?query#fragment
  • scheme:指定了访问资源所使用的协议,例如 httphttpsftpfile 等。
  • host:指定了资源所在的主机名或 IP 地址。
  • port:指定了访问资源所使用的端口号,默认情况下,HTTP 协议使用 80 端口,HTTPS 协议使用 443 端口。
  • path:指定了资源在服务器上的路径,用于唯一标识资源。
  • query:指定了查询参数,用于向服务器传递额外的参数,以便于服务器处理请求。
  • fragment:指定了文档中的特定位置或者锚点。

2. URL 示例

下面是一些示例 URL:

  • http://www.example.com/index.html
  • https://www.example.com:8080/api/data?format=json
  • ftp://ftp.example.com/files/document.pdf
  • file:///usr/local/bin/script.sh
  • https://www.example.com/page#section

3. 注意事项

在编写和处理 URL 时,需要注意以下几点:

  • URL 中的各个部分应该使用正确的编码方式,以避免出现乱码或者无法解析的情况。
  • 对于包含敏感信息的 URL,如用户名、密码等,建议使用 HTTPS 协议进行传输,以确保通信安全。
  • 对于含有动态内容的 URL,如查询参数部分,需要特别注意参数的合法性和安全性,以避免出现安全漏洞。

文献引用

以下是一些关于 URL 格式的官方文档和参考资料:

  1. RFC 3986: Uniform Resource Identifier (URI): Generic Syntax
  2. W3C URL Standard

这些资源提供了关于 URL 格式的详细规范和说明,有助于更好地理解和使用 URL。

通过了解 URL 的基本格式和各个部分的含义,我们可以更加准确地定位和访问互联网上的资源,提高网页开发和网络通信的效率和安全性。


通过本文的介绍,读者可以了解到 URL 的基本结构和各个部分的含义,以及在处理和使用 URL 时需要注意的一些注意事项。

">