我有一个名为call.php的页面,代码如下
<script src="http://localhost/js/jquery.js"></script>
<script>
$(document).ready(function()
{
$.post("exe.php",
{
a: 'a'
},
function(data)
{
alert(data);
});
});
</script>
///close tabs after onload
在exe。php中我有这样的代码
<?php
set_time_limit(60);
ignore_user_abort(true);
sleep(20);
$file = fopen("test.txt","w");
?>
我需要继续PHP执行,即使关闭TAB后立即它在使用WAMP的本地主机上运行良好但在我的主机不工作,它停止后,也许10-14秒在本地主机和服务器中,ignore_user_abort(true)是关闭的问题是:打开这个功能解决问题了吗?为什么在本地主机中,即使这个函数是关闭的
我的执行需要大约30秒的时间,我需要让它工作
编辑
我试过这样做
<?php
ignore_user_abort(true);
function shutdown()
{
sleep(2);
$file = fopen($_SERVER["DOCUMENT_ROOT"].'/logs/2.txt',"w");
sleep(2);
$file = fopen($_SERVER["DOCUMENT_ROOT"].'/logs/4.txt',"w");
sleep(2);
$file = fopen($_SERVER["DOCUMENT_ROOT"].'/logs/6.txt',"w");
sleep(2);
$file = fopen($_SERVER["DOCUMENT_ROOT"].'/logs/8.txt',"w");
sleep(2);
$file = fopen($_SERVER["DOCUMENT_ROOT"].'/logs/10.txt',"w");
sleep(2);
$file = fopen($_SERVER["DOCUMENT_ROOT"].'/logs/12.txt',"w");
sleep(2);
$file = fopen($_SERVER["DOCUMENT_ROOT"].'/logs/14.txt',"w");
sleep(2);
$file = fopen($_SERVER["DOCUMENT_ROOT"].'/logs/16.txt',"w");
sleep(2);
$file = fopen($_SERVER["DOCUMENT_ROOT"].'/logs/18.txt',"w");
sleep(2);
$file = fopen($_SERVER["DOCUMENT_ROOT"].'/logs/20.txt',"w");
}
//register_shutdown_function('shutdown');
shutdown();
?>
打开选项卡并在完全加载后立即关闭这段代码创建了2.txt…10.三种当然有一个选项可以在10秒后关闭脚本
在Windows上,PHP将输出缓冲为一定数量的字节(上次我测试时,我认为是2048)。只要PHP不尝试刷新该缓冲区,它就不会检测到关闭的连接,因此它不会中止脚本。在Linux上,缓冲区的工作方式不同,最重要的是不会忽略flush()
。
至于为什么你的ignore_user_abort(true)
呼叫"不工作"(这种句子不是一个好的错误报告,不太可能导致你得到一个好的答案)我不可能知道。
-
您可以尝试使用
register_shutdown_function
代替 -
您也可以尝试使用
.htaccess
文件增加最大执行时间。语法很简单php_flag max_execution_time 120
-
web服务器本身也可能有一个执行时间限制,可能会中止你的脚本,如超时。
您要使用ignore_user_abort
函数
定义:
设置客户端断开连接是否应该中止脚本执行
警告:要小心,终止无限循环的唯一方法是终止web服务器/PHP,这取决于你的设置。
在呼叫sleep
之前,您需要先呼叫ignore_user_abort
和set_time_limit
。