我正在尝试在用户关闭浏览器窗口后生成文件。当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);
}
?>
答案 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是您需要阅读的地方。