【问题标题】:Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 4294967296 bytes)致命错误:允许的内存大小为 268435456 字节已用尽(尝试分配 4294967296 字节)
【发布时间】:2014-02-07 11:11:24
【问题描述】:

当脚本到达此代码的绑定部分时,我收到以下错误。

错误:

致命错误:允许的内存大小为 268435456 字节已用尽(尝试分配 4294967296 字节)

代码:

$result = $dbc->prepare('SELECT make, line, model, name, year, image, processor_family, processor_speeds, shipped_ram, max_ram, ram_type, video_card, video_memory, screen_type, screen_size, hard_drives, internal_drives, external_drives, audio_card, speakers, microphone, networking, external_ports, internal_ports, description, driver_link, manufacturer_link FROM laptop_archive where name=?');

$result->bind_param('s', $name);

$result->execute();

$result->bind_result($make, $line, $model, $name, $year, $image, $processor_family, $processor_speeds, $shipped_ram, $max_ram, $ram_type, $video_card, $video_memory, $screen_type, $screen_size, $hard_drive, $internal_drives, $external_drives, $audio_card, $speakers, $microphone, $networking, $external_ports, $internal_ports, $description, $driver_link, $manufacturer_link);

它尝试访问的数据库部分有许多要检索的字段,尽管它们都不包含大量数据,大多数数据约为 20 个字符,描述约为 300 个字符。

我搜索了一些答案,虽然没有一个对我有用,但代码运行在具有 512MB RAM 的 VPS 上,并且在 php.ini 中设置的内存限制为 256MB。

要分配的内存量是 4GB,这对于数据库中的内容来说似乎非常多,我在这里错过了什么愚蠢的东西吗?

【问题讨论】:

  • 您是否隔离了这部分代码并仅运行,以确信这些是导致错误的行?您是否尝试在查询末尾添加limit 1,以确保从数据库中只返回一行以进行测试?
  • 256M 对于任何 PHP Web 进程来说都是很多,更别提在这么小的 VPS 上的进程了。总的来说,我认为 64M 更合适,并且(在一段时间内)128M 更适合具有大量插件的 CMS 系统。将memory_get_usage 插入到您的代码中的各个位置,以查看该内存被吞噬的位置。
  • 获取 xhprof 并通过它运行您的代码。它提供了非常有用的分析输出,并且应该能够跟踪所有内存分配,以便您确定问题的原因。注意还有一个gui,我强烈建议您安装它推荐的图形库(这个名字让我忘记了),因为可视化比盯着一堵数字墙更有帮助
  • @JamesValentine 请发布一些详细信息作为答案,然后接受它,以便其他人知道这已经解决(有类似问题的人可能无需阅读所有 cmets 就可以找到答案)
  • @Basic 不幸的是,作为新用户,我现在已经给出了答案(不记得我的旧登录详细信息)我在 8 小时内无法回答这个问题,然后我无法接受我自己的回答24小时!所以我明天会接受它:D

标签: php mysql


【解决方案1】:

正常情况下它不应该占用任何巨大的内存,因为您没有获取数据。

$res = $mysqli->query("SELECT * FROM laptop_archive where name=[REPLACE THIS] limit 1")#
$res->fetch_assoc()

请试试这个:)

【讨论】:

  • 不正确,mysqli(和 PDO 也是)在内部存储所有记录,以使它们默认可用于 fetchAll() 方法。您可以使用MYSQLI_USE_RESULT 常量作为 mysqli_query 函数的最后一个参数来更改此行为。
【解决方案2】:

问题似乎是由于在数据库中使用LONGTEXT 引起的,将类型更改为VARCHAR 后问题消失了。

【讨论】:

    【解决方案3】:

    两天前我遇到了这个错误。从我了解到的情况来看,问题在于您选择的列的大小。在我的情况下,我选择了一个 pdf,我必须将其列为一个长 blob,即 4294967296 字节。无论文件大小如何,服务器都会分配那么多来获取文件。所以我不得不将列更改为中等 blob,它工作正常。所以在你的情况下,它看起来就像是图像。我会将其更改为中等 blob,它应该可以正常工作。否则,您将不得不配置您的服务器以允许更大的抓取分配。

    【讨论】:

      猜你喜欢
      • 2020-04-10
      • 2014-03-07
      • 2014-09-27
      • 2020-07-13
      • 2020-09-06
      • 2019-06-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多