之后继续由ajax调用的php脚本执行

时间:2013-03-05 12:47:42

标签: php jquery ajax

我有一个名为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 它在使用WAMP的localhost中工作正常 但在我的主人不工作它可能会停止10-14秒后 在localhost和服务器中,ignore_user_abort(true)已关闭 问题是:打开此功能可以解决问题吗?以及为什么在localhost中即使关闭此功能也能正常工作

我的执行需要大约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.txt 所以当然有一个选项可以在10秒后关闭脚本

3 个答案:

答案 0 :(得分:1)

在Windows上,PHP会将输出缓冲到一定量的字节(我上次测试时,我相信它是2048)。只要PHP不尝试刷新该缓冲区,它就不会检测到已关闭的连接,因此它不会中止脚本。在Linux上,缓冲区的工作方式不同,最重要的是不要忽略flush()

至于为什么ignore_user_abort(true)来电“无法正常工作”(这种句子不是一个好的错误报告,也不会导致你得到一个好的答案)我可以不太可能知道。

  • 但您可以尝试使用register_shutdown_function

  • 您还可以尝试使用.htaccess文件增加最长执行时间。语法很简单

    php_flag max_execution_time 120
    
  • Web服务器本身也可能有执行时间限制,可能会中止您的脚本,例如,请参阅TimeOut

答案 1 :(得分:0)

您想使用ignore_user_abort功能。

定义:

  

设置客户端断开连接是否应中止脚本执行

警告:请注意,杀死无限循环的唯一方法是根据您的设置终止Web服务器/ PHP。

答案 2 :(得分:0)

在致电ignore_user_abort之前,您需要致电set_time_limitsleep