【问题标题】:PHP / SQL out of memory: Fatal error: Out of memory (allocated 1310720) (tried to allocate 4294967296 bytes)PHP/SQL 内存不足:致命错误:内存不足(已分配 1310720)(试图分配 4294967296 字节)
【发布时间】:2013-11-25 00:37:08
【问题描述】:

我正在运行以下查询,其中包含两个长文本字段(175 和 525),但出现内存不足的错误。此查询是否已经太长或发生了其他事情?

错误:致命错误:内存不足(已分配 1310720)(试图分配 4294967296 字节)

$query = "SELECT username, url, accountcreated, accountstatus, address, city, birthday, education, relation, gender, profile_story, intsettinga, intsettingb FROM users WHERE username=?";

$stmt = $db->stmt_init();
($stmt->prepare($query))|| fail('An error occurred: MySQL prepare', $db->error);
$stmt->bind_param("s",$username)|| fail('An error occurred: MySQL bind_param', $db->error);
$stmt->execute()|| fail('An error occurred: MySQL execute', $db->error);
$stmt->bind_result($screenname, $url, $created, $status, $address, $city, $bday, $education, $relation, $gender, $profile, $settinga, $ssettingb)|| fail('An error occurred: MySQL bind_result', $db->error);
$stmt->fetch() || fail('Profile not found');
$stmt->close();
$db->close();

【问题讨论】:

  • 表中有多少条记录?
  • 目前只有 3 条记录
  • 我需要 4gb 的内存有点奇怪,或者这不是试图分配 4294967296 字节在此消息中的意思
  • 我找到了答案,bind_result占用了太多内存,$stmt->store_result();解决了,在bind_result之前调用它
  • 有些地方根本不对劲——查询 3 条记录不应该占用那么多内存,store_result 只会让情况变得更糟——因为store_result 会获取所有结果并将它们保存在 PHP 的内存中,从而使用更多的内存。

标签: php sql memory memory-management


【解决方案1】:

错误在bind_result,添加$stmt->store_result();解决了:

$stmt->execute()|| fail('An error occurred: MySQL execute', $db->error);

$stmt->store_result(); 

$stmt->bind_result($screenname, $url, $created, $status, $address, $city, $bday, $education, $relation, $gender, $profile, $settinga, $ssettingb)|| fail('An error occurred: MySQL bind_result', $db->error);
$stmt->fetch() || fail('Profile not found');
$stmt->close();
$db->close();

【讨论】:

    猜你喜欢
    • 2018-12-03
    • 2014-04-04
    • 2011-09-12
    • 1970-01-01
    • 2018-01-14
    • 2017-03-02
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    相关资源
    最近更新 更多