Php 使用mysqli_查询时出现Longtext max内存错误

Php 使用mysqli_查询时出现Longtext max内存错误,php,mysql,mysqli,out-of-memory,Php,Mysql,Mysqli,Out Of Memory,我工作的公司用于管理其支持票证。我准备制作一个外部网络应用程序,从一家公司获取所有票证并显示历史记录 我正在使用mysqli_查询连接到数据库 $link = mysqli_connect($serverName, $userName, $password, $dbName); $sql = "SELECT ticketid, fullname, creator, contents FROM swticketposts"; $result = mysqli_query($link, $sql)

我工作的公司用于管理其支持票证。我准备制作一个外部网络应用程序,从一家公司获取所有票证并显示历史记录

我正在使用mysqli_查询连接到数据库

$link = mysqli_connect($serverName, $userName, $password, $dbName);
$sql = "SELECT ticketid, fullname, creator, contents FROM swticketposts";
$result = mysqli_query($link, $sql) or die(mysqli::$error);
问题是mySQL中的“contents”表使用了数据类型LONGTEXT。 尝试用php读取这些数据会导致超时或最大内存使用错误

第49行是$result=mysqli\u查询等行

编辑:在原始帖子中发布错误错误消息 致命错误:允许的内存大小134217728字节已用尽(尝试分配8192字节)

试图解决内存问题,我添加了:

ini_set('memory_limit', '-1');
这给了我这个超时错误:

致命错误:第49行的C:\xampp\htdocs\test\php\TicketCall.php中超过了30秒的最大执行时间

问题是,当我们在kayako平台上查看门票时,它会立即读取相同的内容表,因此必须有一种方法可以更快地读取这些长文本。我无法理解

我无法使用的解决方案:

  • 将数据类型更改为更小的数据类型(会破坏我们的kayako系统)

TLDR;有没有一种方法可以从PHOP和MySQL中读取长文本数据类型,而不会破坏内存和获取超时错误。

< P>首先,您可以考虑将查询更改为类似这样的内容:

 SELECT ticketid, fullname, creator, contents FROM swticketposts WHERE customer = 'something'
这将通过过滤掉您的报告不关心的客户的信息,使您的查询返回的数据更少。它可以节省查询的执行时间

第二,您可能希望使用

 SUBSTRING(contents, 1, 1000) AS contents
代替查询中的
内容
。这将返回
内容
列的一部分(前1000个字符);它可能(也可能不)对你想要做的事情足够好

第三,
mysqli\uu
通常使用缓冲查询。这意味着当您运行查询时,整个结果集都会被偷偷地放入程序的内存中。这可能就是为什么你的记忆力会崩溃。读这个

您可以通过以下方式安排逐行处理查询:

 $unbufResult = mysqli_query($link, $sql, MYSQLI_USE_RESULT) or trigger_error($link->error);
 if ($unbufResult ) {
   while ($row = $unbufResult ->fetch_assoc()) {
     /* deal with the data from one row */
   }
 }
 $unbufResult->close();
当您处理完这些未缓冲的结果集时,需要小心使用
close()
,因为它们会使用MySQL服务器上的资源,直到您这样做。这可能会防止你的记忆崩溃。(在这里使用
fetch_assoc()
没有什么特别之处;您可以使用任何方法获取每一行。)

第四,php的内存和时间限制通常针对交互式网站操作进行调整。有时生成报告需要很长时间。放在你的环中,像这样

 set_time_limit (300); /* five minutes */
 $unbufResult = mysqli_query($link, $sql, MYSQLI_USE_RESULT) or trigger_error($link->error);
 if ($unbufResult ) {
   while ($row = $unbufResult ->fetch_assoc()) {
     set_time_limit (30);  /* reset time limit on each row */
     /* deal with the data from one row */
   }
 }
 $unbufResult->close();
 set_time_limit (300); /* set time limit back to five minutes when done reading */

如果你的问题是执行时间,你为什么要谈论内存限制?第一个错误是内存限制,当我设置内存限制时,我得到了执行时间错误。在你的问题中,如果你还没有注意到,这两个错误都是“最长执行时间”。我的错,我在帖子中犯了一个错误,我会尽快编辑我写的另一个错误是致命的错误:允许内存大小为134217728字节(试图分配8192字节)在内存中耗尽,一切正常。我的代码仍然存在一些问题,但与我在这里发布的问题无关,因此非常感谢您的帮助。我还没有用set_time_limit实现代码的最后一部分,但是自从我添加了代码的其他部分后,时间限制就不是问题了。