Php 创建没有Cron作业的计划任务

Php 创建没有Cron作业的计划任务,php,mysql,cron,Php,Mysql,Cron,需要创建计划任务,但无法使用Cron作业(主机提供商发出警告,“在45分钟内多次运行Cron作业违反了他们的规则,可能会导致关闭帐户。” php脚本(将数据从txt插入mysql数据库)应每分钟执行一次,即应调用此链接 还有其他方法吗?如果您有shell访问权限,您可以通过shell执行php脚本 类似这样的循环将是一个无休止的循环,它将睡眠60秒执行、收集垃圾并重复直到时间结束 while(true) { sleep(60); //script here //end

需要创建计划任务,但无法使用Cron作业(主机提供商发出警告,“在45分钟内多次运行Cron作业违反了他们的规则,可能会导致关闭帐户。”

php脚本(将数据从txt插入mysql数据库)应每分钟执行一次,即应调用此链接


还有其他方法吗?

如果您有shell访问权限,您可以通过shell执行php脚本

类似这样的循环将是一个无休止的循环,它将睡眠60秒执行、收集垃圾并重复直到时间结束

while(true) {
    sleep(60);
    //script here


    //end your script
}
或者你可以用ajax或元刷新来做一个“可怜的人的cron”。我以前做过。基本上,你只需在脚本开始时用javascript或html的元刷新进行重定向。从你的浏览器访问这个脚本,然后让它保持打开状态。它将每60秒刷新一次,就像cronjob一样

cronjob的另一个替代方案是bash脚本,如:

#!/bin/bash
while :

do
sleep 60
 wget http://127.0.0.1/path/to/cronjob.php -O Temp --delete-after

done
尽管如此,你可能还是会被主人抓住并被终止

因此,您的最佳解决方案是:

去注册一个月5-10美元的vps,告别共享主机,向运行自己的小服务器问好。


如果你这样做,你甚至可以停止使用蹩脚的php,改用facebook的hhvm,享受它令人敬畏的性能。

做重复性工作有多种方法。我可以马上想到的一些方法是:

  • 使用:
  • 使用像这样的外部站点以设定的时间间隔发送url

  • 使用元刷新。更多。您必须打开页面并保持其运行

  • Javascript/Ajax刷新。类似于上面的示例

  • 设置cron作业。大多数共享主机都提供了一种设置cron作业的方法。请查看主机的cPanel


  • 这里有免费服务


    这让你可以设置一个很好的替代方案。

    我知道这个问题有点老了,但一周前我偶然发现了这个问题,我们发现的最好和安全的选择是使用Web服务

    我们的背景:

    我们在共享主机和私有云中都有自己的系统

    我们需要一个月激活一次脚本(有计划创建更多的时间表,并允许用户创建一些预定的操作)

    我们的系统提供了对许多客户机的访问,因此,当任何人使用该系统时,它通过Ajax调用Web服务,而不关心响应(毕竟所有内容都记录在我们的数据库中,并且必须在没有用户交互的情况下运行)

    我们所做的是:

    1-在任何主屏幕中访问时都会调用ajax调用

    2-Web服务读取数据库上的计划表,并调用任何需要调用的内容

    3-为了避免许多堆叠的Web服务调用,我们在实际执行任何操作之前每隔10分钟检查datetime


    这也是一种分配负载平衡的方法,并且时间表不会影响用户交互的系统。

    选项a

    一种简单的实现方法是创建一个包含php脚本执行时间的文件/数据库条目:

    <?php
    // crons.php
    return [
        'executebackup.php' => 1507979485,
        'sendnewsletter.php' => 1507999485
    ];
    ?>
    
    <?php
    // cronpixel.php
    $crons = @include 'cache/crons.php';
    foreach ($crons as $script => $time) {
        if ($time < time()) {
            // create lock to avoid race conditions
            $lock = 'cache/' . md5($script) . '.lock';
            if (file_exists($lock) || !mkdir($lock)) {
                continue;
            }
            // start your php script
            include($script);
            // now update crons.php
            $crons[ $script ] += 86400; // tomorrow
            file_put_contents('cache/crons.php', '<?php return ' . var_export($crons, true) . '; ?' . '>')
            // finally delete lock
            rmdir($lock);
        }
    }
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    // image data
    $im = imagecreate(1, 1);
    $blk = imagecolorallocate($im, 0, 0, 0);
    imagecolortransparent($im, $blk);
    // image output
    header("Content-type: image/gif");
    imagegif($im);
    // free memory
    imagedestroy($im);
    ?>
    
    每次锁文件丢失时,脚本都会创建它并使用它来达到精确的秒数:

    if (file_exists($cron_filename) || !mkdir($cron_filename)) {
        return;
    }
    // add one minute if necessary
    $date = new DateTime();
    $cron_date = new DateTime();
    $cron_date->setTime($cron_date->format('H'), $cron_date->format('i'), $sec);
    $diff = $date->diff($cron_date);
    if ($diff->invert && $diff->s > 0) {
        $cron_date->setTime($cron_date->format('H'), $cron_date->format('i') + 1, $sec);
    }
    $diff = $date->diff($cron_date);
    // we use sleep() as time_sleep_until() starts one second to early (https://bugs.php.net/bug.php?id=69044)
    sleep($diff->s);
    
    再次唤醒后,它通过以下方式向自身发送请求:


    注意:它每天产生5760个请求(每分钟4个)。虽然不多,但cronjob使用的资源要少得多。如果
    max\u execution\u time
    足够高,您可以将其更改为每分钟仅调用自己一次(1440个请求/天).

    您可以每60分钟使用一个cron作业,并让它执行60分钟,每分钟触发您的请求,或者查看“可怜的人cron”想法,虽然这在低流量页面上不可靠。我知道这已经一年了,如果你仍然处于活动状态,你能回答是否必须加载meta refresh和js/ajax refresh文件才能工作,或者它们工作时根本不需要你(独立地)调用这些文件吗?@nothiness为了运行meta/js/ajax,您需要加载页面。@nothiness我们曾经将其设置为windows服务器中浏览器的主页。您明白了-它是有限的。
    if (file_exists($cron_filename) || !mkdir($cron_filename)) {
        return;
    }
    // add one minute if necessary
    $date = new DateTime();
    $cron_date = new DateTime();
    $cron_date->setTime($cron_date->format('H'), $cron_date->format('i'), $sec);
    $diff = $date->diff($cron_date);
    if ($diff->invert && $diff->s > 0) {
        $cron_date->setTime($cron_date->format('H'), $cron_date->format('i') + 1, $sec);
    }
    $diff = $date->diff($cron_date);
    // we use sleep() as time_sleep_until() starts one second to early (https://bugs.php.net/bug.php?id=69044)
    sleep($diff->s);
    
    // note: filter_input returns the unchanged SERVER var (http://php.net/manual/de/function.filter-input.php#99124)
    // note: filter_var is unsecure (http://www.d-mueller.de/blog/why-url-validation-with-filter_var-might-not-be-a-good-idea/)
    $url = 'http' . isSecure() . '://' . filter_input(INPUT_SERVER, 'HTTP_HOST', FILTER_SANITIZE_URL) . htmlspecialchars($request_uri, ENT_QUOTES, 'UTF-8');
    $context = stream_context_create(array(
        'http' => array(
            'timeout' => 1.0
        )
    ));
    // note: return "failed to open stream: HTTP request failed!" because timeout < time_sleep_until
    if ($fp = @fopen($url, 'r', false, $context)) {
        fclose($fp);
    }
    rmdir($cron_filename);
    
    if (isset($_GET['cron_second'])) {
        if ($cron_second === 0 && !(date('i') % 15)) {
            mycron('every 15 minutes');
        }
        if ($cron_second === 0 && !(date('i') % 60)) {
            mycron('every hour');
        }
    }