当前位置: 首页 > news >正文

开发中遇到的gzuncompress,DomDocument等几个小问题以及一次Php上线碰到的502问题及php异常追踪

一、开发中遇到的gzuncompress,DomDocument等几个小问题记在此

        1,昨天在命令行模式行运行一个很复杂的程序,一开始执行php,刚刚连接数据库,都没怎么查几条记录,(publish:October 27, 2017 -Friday) 就报错:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 20480 bytes) in..。

        一开始看到这报错,还真是一头雾水,因为我这个程序正常运行出现内存溢出是完全可能的,因为会进行百万级的数据库查询,并且要生成几百M的数据文件出来,但目前我只是在调试程序,暂时还不应该出现这种报错啊。

        然后再一看不对啊,报错提示允许内存128M,我这才申请多大点内存,怎么报错呢。使用php --ini 查看所使用的ini文件位置,才发现php才刚安装,php.ini文件都还没有,然后将此文件配置好,再次执行,果然正常。看来如果没有php.ini文件,php命令行下执行命令的默认内存申请限制是20480 bytes(即2M).

        2、在使用gzuncompress时碰到报错。Warning: gzuncompress(): insufficient memory这也真是个诱惑的问题,php的压缩内容方法第二个参数是表示压缩等级,从0-9,0表示不压缩,9为最高压缩,而gzuncompress第二个参数也是个整数,一不小心就把这两个方法的第二个参数整到一起去了,以为是以哪个等级压缩,就要以哪个等级解压缩。

        原来gzuncompress的第二个参数根本不是压缩等级,而是解压出来的字符串长度限制。

string gzcompress ( string $data [, int $level = -1 [, int $encoding = ZLIB_ENCODING_DEFLATE ]] )
string gzuncompress ( string $data [, int $length = 0 ] )

        3、今天考虑将一个较大的数据存储至redis, 最后一算这些字符内容整个大小400多M,于是看了一下redis单个key的最大值限制,发现其要求在512M以下,A String value can be at max 512 Megabytes in length.虽然目前我的数据没有超过这个数,但是因为数据还会增长,后期超过的可能性很大,另外即便不会超过,也不能一直打着擦边球运行啊。于是考虑使用压缩。这也就是上面遇到gzuncompress问题的原因了。

        php内容的压缩也考虑过其它的方法,比如之前一直用的msg_pack。但是这次使用msg_pack很意外,不知道为什么,压缩后的文件大小既然和压缩前一样,看了几遍代码觉得非常不可思议,但也没发出代码上的问题。我压缩的是个超长的XML内容,不知道是否与这有关。另外关于gzcompress的压缩率,我这压缩前的数据文件大小在480M,压缩后80来M。压缩率达到了6分之一。在我这个业务里完全满意这个效果。

        4、处理xml的php类DomDocument在操作添加添加元素时,元素名称不能是以数字开头,比如:

$Xmlmake = new DomDocument('1.0', 'utf-8');
$sphinxXml = $Xmlmake->createElement('3g'); #此项会报错

        另外xml元素创建节点值时,xml本身会对一些特殊字符作转义处理,比如<>符号,因为它会打乱xml的结构,所以如果你的值中有html元素,而又不想它转义,可以区分使用如下方法。

$text = $Xmlmake->createCDATASection($value); #如果值里面可能有特殊字符,使用createCDATASection,会自动将值处理成:<![CDATA[数据值]]>
$text = $Xmlmake->createTextNode($value);如果字段值都是一些明确没有特殊字符的值这样即可。

         最后的前一篇文章里有提到类DomDocument在输出xml字符串时,默认是不带有缩进的,可以设置类的属性formatOutput为true.从而使生成的xml文件自动缩进。方便查阅。

二、一次上线碰到的502问题及php异常追踪

    今天在上线时遇到了一些502报错,但并非大量,在上线后的几分钟里报了个几十条,程序中已经使用了register_shutdown_function方法捕获最终的异常并进行报错记录,但这次发生502时,PHP程序根本未记录任何错误。publish:December 26, 2017 -Tuesday 查看web里的nginx报错日志如下:

2017/12/26 17:03:00 [error] 11589#0: *202518654 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 192.168.168.164, server: 04007.cn, request: "GET /search/AF04A6B6C9B45D9624514 HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "fangha.com"

    主要的报错日志:Connection reset by peer) while reading response header from upstream 表示php执行时间较长,并超出php-fpm.conf的request_terminate_timeout设置的秒数。但此处没有更详细的日志了。request_terminate_timeout用于设置当某个php脚本运行最长时间,若超出php-fpm进程管理器强行中止当前程序,并关闭fastcgi和nginx的网络连接,然后nginx中就会出现Connection reset by peer的错误了。

【建议】为了更详情地掌握nginx运行异常,建议在nginx的全局配置中将日志级别记入notice。这样可以记录nginx的详细异常信息。如下:

error_log   logs/error.log notice;

查看PHP.ini中配置的php日志:error_log = /opt/data/logs/php/php_errors.log

[26-Dec-2017 19:30:29 PRC] PHP Warning:  Invalid argument supplied for foreach() in /opt/fangha.com/revs/r20171226_1821/app/controller/aController.php on line 1428

发现一条warning日志,但从报错来看这条日志并非致命日志,可以忽略这条日志。

    查看php-fpm的日志:; Default Value: log/php-fpm.log;error_log = log/php-fpm.log 发现在这次上线后出现一些php进程出现重启,看来正是php进行执行时间过长超时,导致php重启,进而最终体现在proxy上记录的502错误。但诡异的是WEB上并没有记录任何错误日志。

[26-Dec-2017 16:54:44] WARNING: [pool www] child 25560 exited with code 1 after 100614.838080 seconds from start
[26-Dec-2017 16:54:44] NOTICE: [pool www] child 5894 started
[26-Dec-2017 16:54:47] WARNING: [pool www] child 25603 exited with code 1 after 100618.063972 seconds from start
[26-Dec-2017 16:54:47] NOTICE: [pool www] child 5895 started

 此时感觉没法查了,能查的日志都查了,只知道这次上线的东西导致了部分请求过慢,但出异常的量却很少。所以:

【建议】开启fpm的slowlog,及时发现性能问题:

request_slowlog_timeout = 2s    #执行时间超过2秒,则进行记录日志
slowlog = var/log/slow.log
request_terminate_timeout = 10s #执行时间不能超过这个值

      幸运的是,上线出异常后,我一直tail -f 错误日志目录里的所有日志文件,期间发现一个日志文件一直在出现提示(被改变),即这个日志文件一直被其它的进程在修改,立即引起了我的注意,因为它很熟悉,我拿着这个文件名在程序里查找,发现我这次调用的日志生成方法是非追加写append,我便开始怀疑和此项有关。

      因为我上线的时候有一个数据缓存文件是不存在的,上线之后才会陆续生成一个缓存文件,文件不存在并不会导致文件异常,但是文件不存在我会记录一个日志,此处不小心用了一个debug(需要覆盖写)的日志写入方法,我想应该是这里的问题导致很多php进程在等待写入最终造成一些php进程执行超时。万幸的是缓存文件很快生成,所以报的错很少,否则一定是一个恶性循环导致更大的问题。

        除了查看日志外,linux也可以使用命令:strace -p 来追踪线程的执行过程,来排查php执行到了哪一步而出现了意外停止。如下为strace -p的执行日志:

[www@B4471 ~]$ ps -ef | grep php
root     10984     1  0 19:13 ?        00:00:00 php-fpm: master process (/opt/soft/php7/etc/php-fpm.conf)
www      10985 10984  0 19:13 ?        00:00:00 php-fpm: pool www              
www      10986 10984  0 19:13 ?        00:00:00 php-fpm: pool www
[www@B4471 ~]$ strace -p 10985
......
access("/oasher.php", F_OK) = 0
access("/oprface.php", F_OK) = 0
poll([{fd=7, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
setsockopt(7, SOL_TCP, TCP_NODELAY, [1], 4) = 0
poll([{fd=7, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
sendto(7, "*2\r\n$3\r\nGET\r\n$25\r\npages_android_"..., 45, MSG_DONTWAIT, NULL, 0) = 45
poll([{fd=7, events=POLLIN|POLLPRI|POLLERR|POLLHUP}], 1, 0) = 0 (Timeout)
poll([{fd=7, events=POLLIN|POLLERR|POLLHUP}], 1, 5000000) = 1 ([{fd=7, revents=POLLIN}])
recvfrom(7, "$7408\r\n\235\207\242id\2411\246pageid\2411\245title\246\347\262"..., 8192, MSG_DONTWAIT, NULL, NULL) = 1448
poll([{fd=7, events=POLLIN|POLLERR|POLLHUP}], 1, 5000000) = 1 ([{fd=7, revents=POLLIN}])
recvfrom(7, "\203\255\241c\201\246\346\234\200\346\226\260\241u\201\246\350\257\204\345\210\206\241s\243pay\223\201\246\345"..., 8192, MSG_DONTWAIT, NULL, NULL) = 5969
write(4, "\1\6\0\1\37\370\0\0X-Powered-By: PHP/7.0.10"..., 8192) = 8192
chdir("/o821/www") = 0
times({tms_utime=16, tms_stime=3, tms_cutime=0, tms_cstime=0}) = 3013606966
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0
fcntl(3, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
write(4, "\1\6\0\1\24\10\0\0\\u6b27\\u7f8e\\u795e\\u5267"..., 5152) = 5152
shutdown(4, SHUT_WR)                    = 0
recvfrom(4, "\1\5\0\1\0\0\0\0", 8, 0, NULL, NULL) = 8
recvfrom(4, "", 8, 0, NULL, NULL)       = 0
close(4)                                = 0
setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0
accept(0, 

相关文章:

开发中遇到的gzuncompress,DomDocument等几个小问题以及一次Php上线碰到的502问题及php异常追踪

一、开发中遇到的gzuncompress,DomDocument等几个小问题记在此 1&#xff0c;昨天在命令行模式行运行一个很复杂的程序&#xff0c;一开始执行php&#xff0c;刚刚连接数据库&#xff0c;都没怎么查几条记录&#xff0c;&#xff08;publish:October 27, 2017 -Friday&#xff…...

【Material-UI】Button 组件中的基本按钮详解

文章目录 一、基本按钮变体1. 文本按钮&#xff08;Text Button&#xff09;2. 实心按钮&#xff08;Contained Button&#xff09;3. 轮廓按钮&#xff08;Outlined Button&#xff09; 二、应用场景与注意事项1. 使用场景2. 注意事项 三、总结 Material-UI 的 Button 组件是前…...

人工智能自动驾驶三维车道线检测—PersFormer模型代码详解

文章目录 1. 背景介绍2. 数据加载和预处理3. 模型结构4. Loss计算5. 总结和讨论 1. 背景介绍 梳理了PersFormer 3D Lane这篇论文对应的开源代码。 2. 数据加载和预处理 数据组织方式参考&#xff1a;自动驾驶三维车道线检测系列—OpenLane数据集介绍。 坐标系参考&#xff…...

LangChain +Streamlit+ Llama :将对话式人工智能引入您的本地设备成为可能(上篇)

&#x1f99c;️ LangChain Streamlit&#x1f525; Llama &#x1f999;&#xff1a;将对话式人工智能引入您的本地设备&#x1f92f; 将开源LLMs和LangChain集成以进行免费生成式问答&#xff08;不需要API密钥&#xff09; 在过去的几个月中&#xff0c;大型语言模型(LLMs)得…...

sql注入部分总结和复现

一个端口对应一个服务 联合查询注入 所有的程序中&#xff0c;单双引号必须成对出现 需要从这个引号里面逃出来 在后面查询内容 ?id1 要查库名&#xff0c;表名&#xff0c;列名。但是联合查询要知道有多少列&#xff0c;所以通过order by 去查询 order by # 通过二分法…...

开源企业级后台管理的快速启动引擎:Ballcat

Ballcat&#xff1a;快速搭建&#xff0c;高效管理&#xff0c;Ballcat让企业后台开发更简单。 - 精选真开源&#xff0c;释放新价值。 概览 Ballcat&#xff0c;一个专为企业级后台管理而设计的快速开发框架&#xff0c;以其高效的开发模式和全面的安全特性&#xff0c;为开发…...

FashionAI比赛-服饰属性标签识别比赛赛后总结(来自 Top14 Team)

关联比赛: FashionAI全球挑战赛—服饰属性标签识别 推荐大家看本篇博客之前&#xff0c;看一下数据集制作的方法&#xff0c;如何做一个实用的图像数据集 PS&#xff1a;我是参加完比赛之后才看的&#xff0c;看完之后&#xff0c;万马奔腾.....&#xff0c;因为发现比赛中还…...

C语言 | Leetcode C语言题解之第319题灯泡开关

题目&#xff1a; 题解&#xff1a; int bulbSwitch(int n) {return sqrt(n 0.5); }...

【第十届泰迪杯数据挖掘挑战赛A题害虫识别】-农田害虫检测识别-高精度完整更新

农田害虫检测识别项目-高精度完整版 一、说明&#xff1a; 该版本为基于泰迪杯完整害虫数据重新制作数据集、优化增强数据集、重新进行模型训练&#xff0c;达到高精度、高召回率的最优模型代码。包含论文、最优模型文件以及相关文件、原始数据集、训练数据集XML版、增强扩充…...

【Linux】—— Linux进程状态(R、S、D、T、Z、X)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;Linux跬步积累 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日一题 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0…...

重生之我在NestJS中使用EventStream

有一个需求是需要长连接等待后台的返回&#xff0c;我们使用的EventStream&#xff0c;在NestJS中使用很简单&#xff0c;框架基本上已经封装好了 0. 如果没有创建项目的&#xff0c;可以先创建一个项目&#xff0c;创建项目的直接跳转到下一个步骤去 全局安装 nest: npm inst…...

自动化工具Selenium IDE基本使用——脚本录制

1 简介 Selenium相信大家都知道&#xff0c;在做自动化操作时&#xff0c;要使用浏览器驱动直接控制浏览器操作的时候&#xff0c;大多会结合Selenium框架使用。 但在对网页操作自动化的时候&#xff0c;实际上有一种更轻量的做法&#xff0c;那就是直接使用Selenium IDE&…...

【第十一天】进程调度算法,进程间通信方式,进程同步和互斥

进程调度算法有哪些 进程调度算法是操作系统中用来管理和调度进程&#xff08;任务&#xff0c;作业&#xff09;执行的方法。这些方法决定了在多任务环境下&#xff0c;如何为各个进程分配CPU时间&#xff0c;以实现公平性、高吞吐量、低延迟等目标。 先到先服务调度算法&am…...

Python的lambda函数

Python中的lambda函数是一种小型匿名函数&#xff0c;它允许你在需要函数对象的地方快速定义单行的小函数。lambda函数通常用于编写简洁的代码&#xff0c;尤其是当使用高阶函数&#xff08;如map()、filter()、reduce()等&#xff09;时。它们可以接收任何数量的参数&#xff…...

java9-泛型

1.泛型的简介 1.1 什么是泛型 泛型是一种特殊的数据类型。 它是Java 的一个高级特性。在 Mybatis、Hibernate 这种持久化框架&#xff0c;泛型更是无处不在。 在这之前&#xff0c;不管我们在定义成员变量时&#xff0c;还是方法的形参时&#xff0c;都要规定他们的具体类型…...

zotero安装与使用

文献管理工具&#xff09; Zotero软件官网https://www.zotero.org/download&#xff0c;不修改安装位置&#xff0c;默认安装就行&#xff1b;安装完成官网直接邮箱注册一个账号&#xff0c;软件登陆账号:编辑-首选项-同步 修改论文保存位置&#xff0c;有从其它电脑拷贝过来的…...

Elasticsearch未授权访问漏洞

7.Elasticsearch未授权访问漏洞 Elasticsearch服务普遍存在一个未授权访问的问题&#xff0c;攻击者通常可以请求一个开放9200或9300的服务器进行恶意攻击。 步骤一:使用以下Fofa语法进行Elasticsearch产品搜索 "Elasticsearch" && port"9200" …...

【FPGA】module中CLOCK RESET iCall oDone的含义

一般的module并不只有iData和oData,还有其他的控制信号,如CLOCK RESET iCall oDone 基本的模式为 module cordicSinhCosh (input CLOCK,RESET,input iCall, output oDone,input [31:0]iData, output [31:0]oData, );reg [31:0] x;initial begin x = ...endreg signed [31:…...

OpenGL实现3D游戏编程【连载2】——了解并创建3D空间模型

1、本节实现的内容 上一节我们创建一个简单的窗口&#xff0c;本节我们需要了解一下细节内容&#xff0c;同时为了方便观看&#xff0c;我们需要显示一个世界坐标轴&#xff0c;建立一个直观的三维空间。 2、我们的眼睛设定&#xff08;gluPerspective函数&#xff09; 上一…...

Java-文件操作和IO

文件介绍 文件本身有多重含义,狭义的文件,特指硬盘上的文件(以及保存文件的目录),广义的文件:计算机上的很多硬件设备,软件资源,在操作系统中,都会被视为是"文件" 文件除了有数据内容之外,还有一部分信息,例如文件名,文件类型,文件大小,这些信息可以称作文件的元信…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...