我正在使用自定义drupal模块。
我已经为此工作了2天了,我把它缩小到这个模拟SQL LEFT JOIN的函数。
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,具体取决于阵列的大小。
一切都很棒,直到我将它部署到测试服务器上,在那里我得到了内存和#34;错误。当我查看日志时,我发现,同样的foreach组正在使用从100Mb到2Gb或内存的任何地方,具体取决于阵列的大小......
我甚至试图手动调用垃圾收集器,但每次只给我2-5 Mb,这没有多大帮助......
我甚至比较了本地机器和测试服务器上的php.ini文件,唯一的区别是测试服务器上的memory_limit is set to -1
但是然后在两个settings.php文件中,即更改到ini_set('memory_limit', '3072M');
...我发现另一个区别是在测试服务器上session.gc_probability = 0
而本地它是1,但是在settings.php文件中发生同样的事情:两个文件都将其更改为1 :
ini_set('session.gc_probability', 1);
ini_set('session.gc_divisor', 100);
和settings.php文件几乎相同
更新: 在@ MokeyZeus'请求,这里是整个函数,其中original是" join"左边的2D数组,$ merge是" join"右边的2D数组。和$ on是一个数组,其中包含2个数组连接的过滤器(SQL ON)
function fulfillment_array_join(array $original, array $merge, array $on) {
if (!is_array($on)) {
$on = array($on);
}
$current = (memory_get_usage(TRUE)/1024/1024)." MiB\n\n";
$peak = (memory_get_peak_usage(TRUE)/1024/1024)." MiB\n\n";
watchdog('fulfillment',
'BEFORE foreach loop - inside fulfillment_array_join.
Current memory: %current.
Peak memory: %peak.',
array('%current' => $current, '%peak' => $peak),
WATCHDOG_INFO
);
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]);
}
}
$current = (memory_get_usage(TRUE)/1024/1024)." MiB\n\n";
$peak = (memory_get_peak_usage(TRUE)/1024/1024)." MiB\n\n";
watchdog('fulfillment',
'AFTER foreach loop - inside fulfillment_array_join.
Current memory: %current.
Peak memory: %peak.',
array('%current' => $current, '%peak' => $peak),
WATCHDOG_INFO
);
gc_collect_cycles();
$current = (memory_get_usage(TRUE)/1024/1024)." MiB\n\n";
$peak = (memory_get_peak_usage(TRUE)/1024/1024)." MiB\n\n";
watchdog('fulfillment',
'GC_COLLECT - inside fulfillment_array_join.
Current memory: %current.
Peak memory: %peak.',
array('%current' => $current, '%peak' => $peak),
WATCHDOG_INFO
);
return $original;
}
这是我调用函数的方式:
$filter_dss_osa = array(
'OrderId' => 'Order ID',
'OfferId' => 'Offer ID',
'ShipQty' => 'Ordered Quantity',
);
$drop_ship_offers_processing = fulfillment_array_join($drop_ship_shipment_datasheet, $offer_sales_analysis_by_shipdate_datasheet, $filter_dss_osa);