在index.php的开头调用register shutdown函数

时间:2016-03-22 01:15:18

标签: php

我正在尝试在用户关闭浏览器窗口后生成文件。当index.php开始运行时,会调用 register_shutdown_function (' shutdown')并生成文件,就好像它只是shutdown()一样。但是一旦窗口关闭,就不会调用函数shutdown()。 为什么在开始时调用shutdown()?为什么不在关机时调用它?
的index.php

     <?php
      session_start();
      register_shutdown_function('shutdown');
      ignore_user_abort(TRUE);

      function shutdown(){
         $handle = fopen('ABORT.txt', 'a');
         fwrite($handle, "file content");
         fclose($handle);
    }
 ?>

我想知道我是否需要在php.ini中更改。 我将不胜感激任何帮助 UPDATE
我可以使用connection_aborted()来了解用户何时断开连接?如您所见,我是PHP的新手。我需要删除用户创建的一些文件,这些文件一旦断开连接并且他们没有正确注销(例如PowerPout熄灭)。

    <?php
      session_start();
      if(connection_aborted())
         shutdown();
      ignore_user_abort(TRUE);

      function shutdown(){
         $handle = fopen('ABORT.txt', 'a');
         fwrite($handle, "file content");
         fclose($handle);
    }
 ?>

1 个答案:

答案 0 :(得分:1)

您需要订阅卸载事件,或者可能订阅beforeunload事件:https://developer.mozilla.org/en-US/docs/Web/Events/beforeunload

您需要的是在服务器上用PHP编写的AJAX端点,以捕获您需要的信息,并在客户端使用javascript在卸载时发送给它。 Can the unload Event be Used to Reliably fire ajax Request?

您没有断开与PHP。 HTTP是无状态协议,您不保持连接打开。您向PHP询问页面,它会为您提供页面,并且连接已关闭。如果您想要其他页面,请打开另一个连接。每个请求都是独立的。所以,不,你不能使用connection_aborted。这样做的目的是检测在转移中途时连接是否被破坏。

如果您打算在传输中检测到浏览器已关闭,然后继续工作,那么您可以使用ignore_user_abort来阻止脚本被取消,然后执行您自己的清理服务器端。 http://php.net/manual/en/features.connection-handling.php是您需要阅读的地方。