【问题标题】:PHP Cronjobs using javascript/AJAX使用 javascript/AJAX 的 PHP Cronjobs
【发布时间】:2012-12-24 02:36:36
【问题描述】:

我有一个运行数据库备份并在没有任何特定 html 输出的情况下对其进行压缩的 php 脚本。此脚本包括时间检查,以避免在 db 中存储的指定延迟之前执行。 现在的问题是我不能使用服务器 cronjob 任务,因为网络服务器不支持它。

所以我会创建一个 javascript 函数,它应该在每次访问时调用 php 脚本(是的,这对我的目的来说已经足够了),但不会延迟访问页面的用户,因为它需要大约 1 分钟才能结束该过程。 是否可以在不等待响应的情况下运行脚本?当用户会话终止时,php 脚本也可以继续运行吗?

我认为类似于: http://drupal.org/project/poormanscron

提前致谢

编辑: 解决方案 1(仅限 php): 把它放在我的输出之前:

public static function cronjob() {
        ignore_user_abort(true); // optional
        session_write_close();//close session file on server side to avoid blocking other requests
        header("Content-Encoding: none");//send header to avoid the browser side to take content as gzip format
        header("Content-Length: ".ob_get_length());//send length header
        header("Connection: close");//or redirect to some url: header('Location: http://www.google.com'); 
        ob_end_flush();flush();//really send content, can't change the order:1.ob buffer to normal buffer, 2.normal buffer to output
        //fastcgi_finish_request(); // important when using php-fpm!
        // Do processing here 
        sleep(5);
        require_once("./cron_job.php");
        exit();
}
        ob_start(); // will be closed in backup function
        register_shutdown_function('cronjob');

解决方案 2(使用 javascript):

1) 创建一个包含您的 cronjobs 的文件

2) 将此 javascript 代码放入您的 html 中:

<script type="text/javascript">
    // cron job
    $.get('./cron_job.php');
</script>

这些方法不会影响用户请求时间;)

谢谢大家

【问题讨论】:

  • 你为什么不提出请求?使用 jQuery: $.ajax('/backup.php');就是这样,它不会等待响应。添加“ignore_user_abort(true);”脚本中的函数以确保它不会停止。
  • 结合php连接处理和这个简单的js调用:$.get('./backup.php');它会做“假 cronjob”!谢谢

标签: php javascript ajax cron backup


【解决方案1】:

在 PHP 端,您可以使用 Connection HTTP 标头告诉浏览器不要等待更多数据。看 https://www.zulius.com/how-to/close-browser-connection-continue-execution/ 了解更多详情。

【讨论】:

    【解决方案2】:

    您可以让您调用的 PHP 脚本模拟连接的结束。这意味着它可以向用户发送一些任意输出,然后强制用户的连接关闭,但仍保持服务器端运行。

    见以下文章:http://php.net/manual/en/features.connection-handling.php

    cmets中有一些例子。

    【讨论】:

      猜你喜欢
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 2012-10-07
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 2016-06-13
      • 2018-01-30
      相关资源
      最近更新 更多