Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 内存不足,仅在服务器上运行-但不在本地运行_Php_Arrays_Drupal_Foreach_Out Of Memory - Fatal编程技术网

Php 内存不足,仅在服务器上运行-但不在本地运行

Php 内存不足,仅在服务器上运行-但不在本地运行,php,arrays,drupal,foreach,out-of-memory,Php,Arrays,Drupal,Foreach,Out Of Memory,我有一个定制的drupal模块,我正在开发 我已经做了两天了,我把它缩小到一个模拟SQL左连接的函数 foreach ($merge as $remove => $right) { foreach ($original as $index => $left) { foreach ($on as $from_key => $to_key) { if (!isset($original[$index][$from_key]) || !isset($r

我有一个定制的drupal模块,我正在开发

我已经做了两天了,我把它缩小到一个模拟SQL左连接的函数

foreach ($merge as $remove => $right) {
 foreach ($original as $index => $left) {
   foreach ($on as $from_key => $to_key) {
     if (!isset($original[$index][$from_key])
       || !isset($right[$to_key])
       || $original[$index][$from_key] != $right[$to_key]) {
       continue 2;
     }
   }
   $original[$index] = array_merge($left, $right);
   unset($merge[$remove]);
 }
}
我在这个foreach循环周围放了一些看门狗,我发现,在本地,这个foreach循环只增加了2MB到50Mb,这取决于阵列的大小

一切都很好,直到我将其部署到测试服务器上,在那里我遇到了“内存不足”错误。当我查看日志时,我发现,同一个foreach组使用的内存从100Mb到2Gb不等,这取决于阵列的大小

我甚至尝试手动调用垃圾收集器,但每次只返回2-5MB,这没有多大帮助

我甚至比较了本地机器和测试服务器上的php.ini文件,唯一的区别是在测试服务器上,
memory_limit设置为-1
,但在这两个settings.php文件中,都更改为
ini_set(“memory_limit”,“3072M”)。。。我发现的另一个区别是,在测试服务器上,session.gc_probability=0,而在本地它是1,但在settings.php文件中发生了相同的事情:两个文件都将其更改为1:
ini\u集('session.gc\u概率',1);
ini_集('session.gc_除数',100)

而settings.php文件基本相同

更新: 在@MokeyZeus的请求下,这里是整个函数,其中original是“join”左侧的2D数组,$merge是“join”右侧的2D数组,$on是一个带有过滤器的数组,两个数组在过滤器上连接(SQL on)

函数实现\u数组\u连接(数组$original,数组$merge,数组$on){
如果(!是_数组($on)){
$on=数组($on);
}
$current=(内存获取使用率(TRUE)/1024/1024)。“MiB\n\n”;
$peak=(内存\u获取\u峰值\u使用率(真)/1024/1024)。“MiB\n\n”;
看门狗(‘履行’,
'foreach循环之前-内部实现\u数组\u连接。
当前内存:%Current。
峰值内存:%Peak',
数组(“%current”=>$current,“%peak”=>$peak),
看门狗信息
);
foreach($merge as$remove=>$right){
foreach($index=>$left的原始版本){
foreach($on作为$from\u key=>$to\u key){
如果(!isset($original[$index][$from_key])
||!isset($right[$to_key])
||$original[$index][$from\U key]!=$right[$to\U key]){
继续2;
}
}
$original[$index]=数组合并($left,$right);
取消设置($merge[$remove]);
}
}
$current=(内存获取使用率(TRUE)/1024/1024)。“MiB\n\n”;
$peak=(内存\u获取\u峰值\u使用率(真)/1024/1024)。“MiB\n\n”;
看门狗(‘履行’,
'在foreach循环之后-内部实现\u数组\u连接。
当前内存:%Current。
峰值内存:%Peak',
数组(“%current”=>$current,“%peak”=>$peak),
看门狗信息
);
gc_collect_cycles();
$current=(内存获取使用率(TRUE)/1024/1024)。“MiB\n\n”;
$peak=(内存\u获取\u峰值\u使用率(真)/1024/1024)。“MiB\n\n”;
看门狗(‘履行’,
'GC\u COLLECT-内部实现\u数组\u join。
当前内存:%Current。
峰值内存:%Peak',
数组(“%current”=>$current,“%peak”=>$peak),
看门狗信息
);
退回$original;
}

下面是我调用函数的方式:


$filter\u dss\u osa=阵列(
“订单ID”=>“订单ID”,
'OfferId'=>'OfferId',
“发货数量”=>“订购数量”,
);

$drop\u ship\u offers\u processing=fulfillment\u array\u join($drop\u ship\u shipping\u datasheet,$offer\u sales\u analysis\u by\u shippdate\u datasheet,$filter\u dss\u osa)

所有这些变量值是什么,例如,
$original
与第一个循环不相关。如果它是嵌套的,我希望它是嵌套的。这些数组来自哪里?初始的
$merge
本地与服务器上的比较有多大?另外,为什么PHP函数模拟SQL左连接?你自己写的吗?在
foreach($merge as$remove=>$right){
?尝试
echo memory\u get\u usage();
我在模拟SQL左连接,因为我处理的是php数组。这些php数组是我从数据库获得一些初始数据后经过大量逻辑和处理的结果。客户端的UI输入对创建这些巨大数组的逻辑也有很大的影响,因此我无法将它们保存在SQL表中。@MonkeyZeus,请参阅更新的post that包含我所拥有的整个函数。所有这些变量值是什么?例如,
$original
与第一个循环不相关。我希望它是嵌套的。这些数组从何而来?初始的
$merge
在服务器上有多大?还有,为什么PHP函数模拟SQL左连接?你自己写的吗?在
foreach($merge as$remove=>$right){
?尝试
echo memory\u get\u usage();
我在模拟SQL左连接,因为我处理的是php数组。这些php数组是我从数据库获得一些初始数据后经过大量逻辑和处理的结果。客户端的UI输入对创建这些巨大数组的逻辑也有很大的影响,因此我无法将它们保存在SQL表中。@MonkeyZeus,请参阅更新的post t帽子包含了我的全部功能