Php 使用mysqli_查询时出现Longtext max内存错误
我工作的公司用于管理其支持票证。我准备制作一个外部网络应用程序,从一家公司获取所有票证并显示历史记录 我正在使用mysqli_查询连接到数据库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)
$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实现代码的最后一部分,但是自从我添加了代码的其他部分后,时间限制就不是问题了。