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


continue php script execution called by ajax after

我有一个名为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_abortset_time_limit