【发布时间】:2015-02-27 19:33:42
【问题描述】:
我在共享服务器上使用 PHP 通过 API 访问外部站点,该 API 返回包含 2 级数据的 JSON(级别 1:执行者和级别 2:执行者内部的类别数组)。我想在不使用 json_decode 函数的情况下将其转换为多维关联数组(它为此使用了太多内存!!!)
JSON 数据示例:
[
{
"performerId": 99999,
"name": " Any performer name",
"category": {
"categoryId": 99,
"name": "Some category name",
"eventType": "Category Event"
},
"eventType": "Performer Event",
"url": "http://www.novalidsite.com/something/performerspage.html",
"priority": 0
},
{
"performerId": 88888,
"name": " Second performer name",
"category": {
"categoryId": 88,
"name": "Second Category name",
"eventType": "Category Event 2"
},
"eventType": "Performer Event 2",
"url": "http://www.novalidsite.com/somethingelse/performerspage2.html",
"priority": 7
}
]
我尝试使用 substr 并去掉“[”和“]”。
然后执行调用:
preg_match_all('/\{([^}]+)\}/', $input, $matches);
这给了我每一行的字符串,但在类别数据的尾随“}”之后截断。
如何使用 preg_split、preg_match_all 等方法将整行数据作为数组返回。代替整个 JSON 字符串上的 json_decode 等繁重的调用?
一旦我正确识别了每一行的数组,我就可以在该字符串上执行 json_decode 而不会使共享服务器上的内存负担过重。
对于那些想要更多关于 json_decode 使用导致错误的详细信息:
$aryPerformersfile[ ] = file_get_contents('https://subdomain.domain.com/dir/getresults?id=1234');
$aryPerformers = $aryPerformersfile[0];
unset($aryPerformersfile);
$mytmpvar = json_decode($aryPerformers);
print_r($mytmpvar);
exit;
【问题讨论】:
-
因此,与其使用 json_decode,不如说您无疑是在调用一种效率较低的解决方法。是的。那会游泳的。 @AbraCadaver 查看phantomJS
-
内存占用过多怎么办?你能告诉我们它是如何使用太多的,你对太多的定义是什么?我的猜测不是该功能使用太多,而是您没有使用
unset()正确收集垃圾,或者您需要增加应用程序中的内存分配 -
我真的很感兴趣你是如何计算出
json_decode使用too much memory的?你的json sring有多大? json_decode 在你的情况下需要多少?您使用什么工具来扩展内存使用量? -
感谢无证嘲讽。非常感谢!在当前在共享主机上运行 Wordpress(PHP 和 MySQL)的网站上。我进行 API 调用,将 JSON 内容返回到变量中。当我在变量上调用 json_decode 时,我收到以下错误:PHP 致命错误:第 3 行 /home/mysite/public_html/subdir/myfile.php 中允许的内存大小为 134217728 字节已用尽(尝试分配 10 个字节)。
标签: php arrays json preg-match-all preg-split