我有一个PHP服务器应用程序收集推文,因此持续运行。 此应用程序在几天后开始失败。拒绝返回mysql select语句的结果。我发现这是由于php资源id溢出(PHP警告):
-2147483648不是有效的MySQL结果资源
这意味着应用程序正在耗尽可能的ID以分配给资源变量(因为要触发的查询语句数量非常大)。我认为这个问题的答案是在每个mysql select语句下使用 mysql_free_result ,以便最终释放每个资源。 但这并没有解决我的问题。
在某些论坛上,我读到PHP无法重用已发布的资源ID。 这意味着唯一合理的解决方案是重新连接到mysql数据库吗?
关于我的PHP版本的一些信息:
PHP 5.5.10-1 + deb.sury.org~prelension + 1(cli)(建于:2014年3月27日16:18:01) 版权所有(c)1997-2014 PHP小组 Zend Engine v2.5.0,版权所有(c)1998-2014 Zend Technologies 与Zend OPcache v7.0.3,版权所有(c)1999-2014,作者:Zend Technologies
有没有人有过这个问题的经验?另一个解决方案是使用mysqli扩展而不是常规扩展吗?
谢谢!
答案 0 :(得分:1)
错误并不一定意味着"应用程序用尽了可能的ID以分配给资源变量"。 实际上,它可能是由您(如果不正确)使用mysql_free_result()引起的,因为稍后尝试使用已清除的资源执行某些操作会产生类似于您看到的错误。确保你不是暂时的"缓存"或者在会话中保留资源ID并重用它们。
但是,如果您确定您的应用程序耗尽了资源ID,则使用unset()或mysql_free_result()可以释放资源,然后可以再次使用释放的ID,并且PHP可以再次重用这些资源。在64位系统中,您不太可能耗尽资源ID。
优化程序本身不会浪费资源而不是耗尽它们然后重置更好。你不能这么快就耗尽丰富的资源。
调用mysql_free_result()时发生了什么? 顺便说一句,如果你使用mysqli,你应该使用mysqli_result :: free而不是mysql_free_result()。