【问题标题】:PHP script using over 512MB when only processing a few MB array仅处理几 MB 数组时使用超过 512MB 的 PHP 脚本
【发布时间】:2013-06-24 02:41:00
【问题描述】:

我在带有 Apache 的 Ubuntu 上运行 PHP。我有一个简单的脚本,它简单地执行一个查询以从数据库中提取一组纬度、经度对,将它们存储到一个数组中,然后回显 JSON。

该数组大约有 40,000 个元素。数组中的条目如下所示

{"lat":"41.951234015","lng":"-87.5317308"}. 

查询是通过使用链接服务器的 MSSQL DB 到 MySQL DB,如果这完全相关的话。

如果我执行ini_set('memory_limit', '512M'),PHP 会耗尽内存,但如果我执行ini_set('memory_limit', '1024M'),则会成功。

为什么这个脚本会占用这么多内存?一个包含 40,000 个元素的数组,每个元素不超过 20 个字符左右,应该只占用几 MB 的内存。我没有对阵列进行任何处理。

编辑:这是我的代码

mssql_query("SET ANSI_WARNINGS ON");
mssql_query("SET ANSI_NULLS ON");

ini_set('memory_limit', '1024M');
$cbsa='16980';
if(isset($_POST['cbsa'])){
    $cbsa = sanitize($_POST['cbsa']);
}

$zipstrings = get_zipstring($cbsa); //external function that returns two lists of about 500 zipcodes each

$lat_lng = array();
foreach($zipstrings as $zipstring){
  $result = mssql_query("select * from openquery(database, 'SELECT lat, lng from coordinates 
  JOIN with other table....");
  while($row = mssql_fetch_array($result, MSSQL_ASSOC)){
      $lat_lng[] = array("lat"=>$row['lat'], "lng"=>$row['lng']); **CRASHES HERE**
  }
}
echo json_encode(array("coords"=>$lat_lng, "error"=>mssql_get_last_message()));

【问题讨论】:

  • 我们无法使用代码查找您的代码中的内存泄漏
  • @user20232359723568423357842364 你为什么不改变你的用户名哈哈。 Scott W:你能发布你的代码吗?你可能有一个循环卡在某个地方。40k 元素的大小只有 2MB。
  • 你能贴一些代码吗?
  • 我添加了代码,它在while循环中崩溃了
  • 我建议添加一些对mssql_free_statement 或mssql_free_result 的调用——它们会释放查询中使用的内存。您的代码将为每个 zip 运行一个查询,并且在完成整个脚本之前可能不会再次关闭查询。

标签: php mysql sql-server memory memory-limit


【解决方案1】:

该查询返回多少数据?如果它有非常大的列并且其中许多列将成为原因,那么您有一个 opendata 中的 select*。你的代码在我看来没问题

【讨论】:

  • 我只选择了两列(lat、lng)。 select *是因为我要通过MSSQL查询一个MYSQL DB,所以查询基本上是说“select * from (select lat, lng)”
  • 为什么要抽象?为什么不直接?
  • 由于我无法控制的权限和安全问题,我无法直接查询 MySQL 数据库,但必须通过 MSSQL 和“链接服务器”。
  • 在没有内部循环的情况下尝试使用 400 mb 内存。看看有没有问题
猜你喜欢
  • 2022-08-18
  • 2013-06-20
  • 1970-01-01
  • 2016-12-19
  • 2015-10-07
  • 1970-01-01
  • 2020-01-30
  • 2011-11-02
  • 1970-01-01
相关资源
最近更新 更多