使用ignore_user_abort和set_time_limit(0)

时间:2012-01-08 19:12:32

标签: php ajax

我在page1.php中有一个表单,它都重定向到page3.php并且还在page2.php中触发了ajax帖子(没有成功函数),page2.php可能需要运行一个小时,但是用户没有不需要结果。我确实需要用户查看page2.php,但他可能会离开。

我需要在page2.php中使用这两个函数吗?或者只是其中之一?还是没有?我想确保page2.php中的脚本运行到最后。

page1.php中

    <form id="form" action="page2.php" method="post">
            <!--form input elements with names-->
    </form>
    <script>
            $('#form').submit(function() {
                $.post('page3.php', {
                    var1: $('input[name="name1"]').val(),
                    var2: $('input[name="name2"]').val(),
                });                                 
            });
    </script>

使page2.php

    <?php
            ignore_user_abort(true);  // Allow user to navigate away
            set_time_limit(0);        // Allow script to run indefinitely
            // a lot of code which will run for a while - between 3 minutes and an hour
    ?>

Page3.php

    <html>
            <!--some code here including links to go to page4.php-->
    </html>

我问的部分是因为我认为不需要任何这些功能,但被告知要使用它们,但当我尝试使用它们时,尽管有die();并且脚本停止,它仍然看起来处理某些东西而我害怕因为这个“无限期”它会在服务器上过多。 因为我不想添加不必要的负载。

1 个答案:

答案 0 :(得分:0)

是的,你需要这两个功能才能达到目前的标准,我的建议是将其移出http协议。根据您的脚本实际完成的内容,如果它不需要客户端的进一步交互,最好在命令行中使用它。

使用理论是创建一个以所需间隔调用的cron脚本,然后它将访问page2.php将填充的队列。

如果有可用的队列,cron脚本将处理当前在page2.php上完成的信息。由于您的脚本运行了很长一段时间,我建议使用cron的锁定机制,请参阅php.net/flock以获取简单的文件系统锁定。如果文件锁定已经运行,请检查该文件。

这是一个简单的示例,您可以将其置于独立脚本中以通过cron进行处理:

$fp = fopen(DATA_PATH . '/locks/isLocked', 'w+');

        if (!flock($fp, LOCK_EX | LOCK_NB)) { //locks the file
            $logger->info('Already Running');
            exit(0);
        }

        fwrite($fp, time()); //write our new time so we can inspect when it ran last if needed

        try {
            if (hasQueue()) { //checks to see if any jobs are waiting in mysql
               run(); //process normally completed by page2.php
            }
        } catch (Exception $e) {
            //something went wrong here could setup a log / email yourself etc..
        }

        flock($fp, LOCK_UN); //unlock the file