当前位置: 首页 > 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

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

AI智能化赋能电商经济,守护消费净土,基于轻量级YOLOv8n开发构建公共生活景下的超大规模500余种商品商标logo智能化检测识别分析系统

在数字经济浪潮的推动下&#xff0c;全力发展新质生产力已成为当今社会发展的主旋律。各行各业正经历着前所未有的变革&#xff0c;其中&#xff0c;电商行业作为互联网经济的重要组成部分&#xff0c;更是以惊人的速度重塑着商业格局与消费模式。AI智能化技术的深度融合&#…...

C语言菜鸟入门·数据结构·链表超详细解析

目录 1. 单链表 1.1 什么是单链表 1.1.1 不带头节点的单链表 1.1.2 带头结点的单链表 1.2 单链表的插入 1.2.1 按位序插入 &#xff08;1&#xff09;带头结点 &#xff08;2&#xff09;不带头结点 1.2.2 指定结点的后插操作 1.2.3 指定结点的前插操作 1.3 …...

C# Unity 面向对象补全计划 七大原则 之 依赖倒置原则 (DIP)难度:☆☆ 总结:多抽象,多接口,少耦合

本文仅作学习笔记与交流&#xff0c;不作任何商业用途&#xff0c;作者能力有限&#xff0c;如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识&#xff0c;看不懂没关系 请看专栏&#xff1a;http://t.csdnimg.cn/mIitr&#xff0c;查漏补缺 1.依赖倒置原则 (DIP) 这…...

大模型面试问题

综合基础 1、讲讲制作一个LLM的流程以及各阶段的作用 2、发现模型性能不好&#xff0c;如何从各个阶段去排查问题 查看各阶段中是否有对应训练数据&#xff0c;然后再向下排查。预训练 1、Transfomer模型介绍一下 2、讲讲 Q、K、V 3、Transfomer模型中Encoder输出给Decoder的…...

keeplive配置详解与haproxy配置详解

一、keepalive相关知识 1.1 keepalive介绍 keepalive即LVS集群当中的高可用架构&#xff0c;只是针对调度器的高可用。是高可用的HA架构。 keepalive就是基于VRRP协议来实现LVS高可用的方案。 1、组播地址 224.0.0.18&#xff0c;根据组播地址进行通信&#xff0c;主备之间发…...

vivado里的LUT、LUTRAM、FF、BRAM、DSP、IO、BUFG、MMCM资源介绍

vivado里的LUT、LUTRAM、FF、BRAM、DSP、IO、BUFG、MMCM资源介绍 提示&#xff1a;以下是本篇文章正文内容&#xff0c;写文章实属不易&#xff0c;希望能帮助到各位&#xff0c;转载请附上链接。 vivado实现电路用到的资源类型 LUT&#xff08;Look-Up Table&#xff09;&am…...

window关闭端口占用

文章目录 一、打开命令行&#xff0c;输入命令&#xff0c;得到进程号二、找到其端口并杀死该端口总结 一、打开命令行&#xff0c;输入命令&#xff0c;得到进程号 winr打开命令行&#xff0c;输入命令 netstat -ano | findstr 端口号得到端口号 二、找到其端口并杀死该端…...

Java:类和对象

类和对象 类&#xff08;Class&#xff09;类的定义 对象&#xff08;Object&#xff09;对象的创建 构造方法&#xff08;Constructor&#xff09;构造方法的定义 继承&#xff08;Inheritance&#xff09;继承的示例 总结示例一设想一个场景&#xff1a;创建一个虚拟动物园一…...

Pandas数据分析案例之用户购买记录分析

文章目录 数据分析之用户购买记录分析第一部分&#xff1a;数据类型处理数据加载观察数据查看数据的数据类型数据中是否存储在缺失值将order_dt转换成时间类型查看数据的统计描述计算所有用户购买商品的平均数量计算所有用户购买商品的平均花费 在源数据中添加一列表示月份:ast…...

串口调试可能遇见的常见问题和排查方法

串口UART作为嵌入式应用和通讯领域中最常用的接口之一&#xff0c;接口协议虽然简单&#xff0c;但在实际应 用中不同设备之间的通讯也会存在各种小问题&#xff0c;下面对使用中各种常见的问题做下总结和梳 理&#xff0c;可作为调试参考。 01串口通信常见问题 串口通信乱码…...