仅处理几 MB 数组时使用超过 512MB 的 PHP 脚本

标签 php mysql sql-server memory memory-limit

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

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

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

查询是通过使用链接服务器的 MSSQL 数据库查询 MySQL 数据库,如果相关的话。

如果我执行 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()));

最佳答案

该查询返回多少数据?你有一个 select* from opendata 如果它有非常大的列并且其中许多将是原因。我觉得你的代码没问题

关于仅处理几 MB 数组时使用超过 512MB 的 PHP 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17328873/

相关文章:

php - 如何在php中下载网页

php - MySQLi 作为静态类

Mysql在存储过程中使用LAST_INSERT_ID

mysql - 如何随机排序数据

sql-server - 在 SQL Server 2005 中查询 XML 列

sql - 使用 SSMS 2016 : Object cannot be cast from DBNull to other types 时出错

php - 如何循环遍历两个不同的表?

php - Cloudflare 将子域重定向到目录

mysql - 创建表语句中函数的正则表达式

sql - 使用 Microsoft SQL Server 获取列的 10 个最高升序值