【问题标题】:How to call destructor after response in php?php响应后如何调用析构函数?
【发布时间】:2013-11-07 16:12:55
【问题描述】:

我有一个聊天机器人,它将一些数据保存到用户发送的数据库中。在向用户发送响应后,我想将其保存到 db(一个缓慢的网络调用)。

我可以在 Python Tornado 中做到这一点,但我无法在 PHP Apache 中做到这一点。

用户将输入作为请求发送 -> 我们对其进行处理 -> 我们将输出作为响应发送给用户 -> 然后我们希望存储数据

  class A
  {
      function __construct()
        {
          echo "Hello World";
        }
      function __destruct()
        {
          sleep(15); //I want this to happen after response is being send
        }
      function calc()
        {
          echo "Progress World";
        }
  }

【问题讨论】:

  • 你现在有什么问题?类有一个神奇的方法__destruct()
  • 响应发送后是否调用了 __destruct()?
  • 发送后是否处理某些内容仅取决于您之后是否终止脚本。无论如何:为此使用输出缓冲。那么当存储数据失败时你仍然可以做出反应。
  • @arkascha 代码在 index.php 中,所以我认为它是由 apache 在响应后由 apache 终止的请求 n 调用的。不是吗?
  • 为什么http服务器会因为你发送了一些数据而突然自发地杀死你的php脚本?不!脚本将继续运行,只有两个例外:1. 您明确停止执行(例如通过在代码中使用 return 语句)或 2. 当您指定响应长度时,发送响应和 client 断开连接。在这种情况下,您仍然可以使用 phps ignore_client_abort() 函数运行您的脚本。但如前所述:在我看来,输出缓冲在这里是有意义的。生成响应并仅在所有操作完成后发送。

标签: php apache optimization exit


【解决方案1】:

__destruct 在对象删除、对象超出范围或正常脚本结束时调用。如果脚本没有正常终止而是被杀死,则可能根本不会调用析构函数。

如果您只想在特定点执行清理任务并确保它们得到处理,请使用 PHP 5.5 引入的finally clause

来自 PHP 站点的 __destruct 示例:

<?php
class my_class {
  public $error_reporting = false;

  function __construct($error_reporting = false) {
    $this->error_reporting = $error_reporting;
  }

  function __destruct() {
    if($this->error_reporting === true) $this->show_report();
    unset($this->error_reporting);
  }
?>

请参阅PHP Documentation on destructors。我希望这会有所帮助。

【讨论】:

  • 响应后会调用 __destruct 吗? apache 不会在发送响应后立即终止 index.php 代码吗?
  • @dragosrsupercool apache 如何知道何时发送所有响应?除非脚本终止,否则没有人可以判断是否发送了整个响应
  • __destruct 在响应发送之前被调用。完成的活动是否会影响响应时间。
猜你喜欢
  • 1970-01-01
  • 2021-07-19
  • 2014-05-17
  • 2021-07-28
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
相关资源
最近更新 更多