内存耗尽,仅在服务器上 - 尽管不在本地

时间:2016-07-18 18:31:56

标签: php arrays drupal foreach out-of-memory

我正在使用自定义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);

0 个答案:

没有答案