自动附加mysql_close&的风险是什么? session_write_close到所有PHP脚本?

时间:2014-06-19 16:31:14

标签: php

使用php auto_append_file自动添加的风险是什么:

  

session_write_close();
  mysql_close();

到所有文件?

在处理客户的应用程序时,我发现会话和数据库连接由于某种原因而悬空。作为快速解决方案,我们通过auto_append_file添加了上面的代码。

这立即解决了Apache线程处于“发送回复”状态并大大减少服务器负载的问题。

当客户缺乏足够的资源或时间来查找有问题的代码并修复它时,我们正在考虑更频繁地使用这种技术。

修改

问题不在于最佳做法。我完全理解这个应该不是必需的,但我可以通过添加此代码重复显示挂起的Apache进程的减少。问题是这些功能导致的风险或负面影响。

2 个答案:

答案 0 :(得分:0)

正如评论中所提到的,驱动程序应该关闭连接,并且在脚本执行结束时会写入和关闭会话。

另外,你应该使用mysqli或PDO,而不是mysql! (MySQL extension is deprecated as of PHP 5.5.0

无论如何,当你想要做那种事情(在脚本末尾执行某些事情)时,更好的想法是注册一个关闭函数来执行它(DRY):

http://www.php.net//manual/en/function.register-shutdown-function.php

(更好的方法是跟踪你正在使用的资源,并在你知道你的程序不再需要它们的时候释放它们。它更有效率,并且不会留下任何资源。怀疑他们发生了什么。)

答案 1 :(得分:0)

来自session_write_close()的{​​{1}}:

  

会话数据通常在脚本终止后存储,无需调用session_write_close(),但由于会话数据被锁定以防止并发写入,因此任何时候只有一个脚本可以在会话上运行。

the documentation来自mysql_close()

  

通常不需要使用mysql_close(),因为非持久性开放链接会在脚本执行结束时自动关闭。另见the documentation

还值得注意的是mysql_close(),没有使用链接标识符......

  

如果未指定链接标识符,则假定mysql_connect()打开最后一个链接。如果未找到或建立连接,则会生成E_WARNING级别错误。


牢记以上所有内容:

  1. 调用上述函数不应该,因为它们会在脚本终止时自动处理。
  2. 在脚本中调用mysql_close()只会a)关闭最近打开的链接或b)抛出警告,因为没有打开任何链接。
  3. 如果您需要脚本在他们完成资源后立即放弃资源,那么使用auto_append_file因为第1点而无法帮助您。您需要自己修改脚本。
  4. 挂起的数据库连接是挂起或长时间运行的脚本的标志。如果脚本终止,那么数据库链接也应该有。 (再次,第1点)