0

我有一个名为 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 中工作正常,但在我的主机中不起作用,它在 localhost 中可能 10-14 秒后停止,并且服务器 ignore_user_abort(true) 关闭问题是:打开这个功能ON解决问题?以及为什么即使在此功能关闭时它在 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 秒后关闭脚本

4

3 回答 3

1

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

至于为什么你的ignore_user_abort(true)电话“不起作用”(这种句子不是一个好的错误报告,也不太可能导致你得到一个好的答案)我不可能知道。

  • 但是,您可以尝试register_shutdown_function改用。

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

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

于 2013-03-05T13:13:10.240 回答
0

您想使用该ignore_user_abort功能。

定义:

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

警告:请注意这一点,终止无限循环的唯一方法是终止 Web 服务器/PHP,具体取决于您的设置。

于 2013-03-05T12:53:03.327 回答
0

你需要打电话ignore_user_abort和打电话set_time_limit之前sleep

于 2013-03-05T12:55:23.320 回答