解决网站服务器遇到 Allowed memory exhausted 问题

  • 时间:2021-09-12 15:32 编辑:知速网 来源:知速网 阅读:100
  • 扫一扫,手机访问
摘要:解决网站服务器遇到 Allowed memory exhausted 问题

解决 PHP 网站服务器遇到 Allowed memory exhausted 问题除了常见的调整记忆体上限值方式,其他解决方式:(1) CSV 或 TXT 文字档案类型,避免使用读取档案全部内容的函数、(2) JSON 大档案可以使用 jq 拆解成小档案、(3) 资料库查询使用 LIMIT、OFFSET 语法等方式。

48965725138_1df1e27f8f_o.jpg


问题状况


网站服务器显示记忆体耗尽的错误讯息




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




问题原因


网站应用程式使用过多系统记忆体而造成的错误


解决方案


常见的解决方式有


修改记忆体上 memory_limit 详见 php - 解决 Allowed memory size of 134217728 bytes exhausted 问题 @ Life Is Struggle :: 随意窝 Xuite日志


减少载入的 Library,例如关闭 Laravel 启动时不需要载入的 providers 服务


其他调整 PHP 程式码的方式


状况 1. 处理 CSV, TXT 文字档案类型


如果档案较大,应避免使用一次读取全部档案内容的 PHP file_get_contents、file_put_contents 等函数。读取档案建议改成使用 Generators 或 fgets 逐行读取档案内容,减少记忆体的使用。而写入档案则可使用 fwrite 附加档案 (append) 方式写入。








状况 2. 处理 JSON 档案类型


处理过看起来档案看起来不大的 250 MB 的 JSON 档案,但是内容有六百多万行。原始资料无法透过逐行读取档案方式处理,改成使用 jq 将快三千多笔纪录,拆成三千多个小档案,再做后续处理。




以下是简化过的 JSON 档案内容 (取自 JSON Example),档名 example.json



{"menu": {
    "header": "SVG Viewer",
    "items": [
        {   
            "id": "OpenNew", 
            "label": "Open New"
        },
        null,
        {
            "id": "ZoomIn", 
            "label": "Zoom In"
        }
    ]
}}

步骤 1: 安装 jq - 处理 JSON 档案的命令列工具




前往 jq 网站,根据作业系统版本,安装对应的 jq。支援的作业系统有 Windows, Linux 与 OSX。根据个人经验,Windows 版本 jq 有奇怪问题,个人偏好透过 Cygwin 安装 jq package。




步骤 2: 瞭解 JSON 档案结构




档案小时,可以很快看到需要处理的资料树路径是 menu/items 。档案大时,开启档案可能需要等待一段时间甚至当掉无法打开。可以透过指令看部分档案内容,例如:




看档案前 10 行内容




head -n 行数 档名


head -n 10 example.json


或者是逐页看档案内容




cat 档名 | more


cat example.json | more


再按 q 就可以离开逐页观看模式








步骤 3: 计算记录笔数




jq '结构树 | length' 档名


jq '.menu.items | length' example.json


范例档案的结果是 3 








步骤 4: 预览第一笔记录




第一笔从 0 开始,结构树语法需要标记 [0] 




jq '结构树' 档名


jq '.menu.items[0]' example.json


范例档案的结果是




{


  "id": "OpenNew",


  "label": "Open New"


}






步骤 5: 逐笔拆解纪录,另存档案




根据步骤 2 取得的记录笔数使用程式产生多组指令




jq '结构树' 档名 > 输出档名


jq '.menu.items[0]' example.json > 0.json


jq '.menu.items[1]' example.json > 1.json


jq '.menu.items[2]' example.json > 2.json


后续就很容易解析小档案内容。


  • 全部评论(0)
最新发布的资讯信息
【计算机/互联网|】小红书账号交易要找靠谱的平台。(2021-09-18 10:28)
【计算机/互联网|】小红书账号转让要注意的流程(2021-09-17 10:56)
【技术支持|】认识__get及__set,并看看Laravel如何使用它们(2021-09-12 15:36)
【技术支持|】解决网站服务器遇到 Allowed memory exhausted 问题(2021-09-12 15:32)
【计算机/互联网|】MySQL Community 版本与MySQL企业版有什么不同? 有什么限制?(2021-06-18 09:06)
【技术支持|】如何获取两个日期之间的所有日期?(2021-06-11 08:08)
【技术支持|】Laravel-S (Swoole 加速) 的初步探索整理(2021-06-10 17:15)
【计算机/互联网|】PHP7无法载入LDAP的解决方式(2021-06-10 10:46)
【计算机/互联网|】win10下PHP的安装与设定(2021-06-09 08:41)
【计算机/互联网|】C# MVC View 底下字串(string)的显示方式(2021-06-08 11:05)
联系我们
工作时间:8:00-23:30
客服 QQ:93613971
邮 箱:admin#zhisu.com
法律顾问:聊城瀚诚律师事务所