Php 创建没有Cron作业的计划任务
需要创建计划任务,但无法使用Cron作业(主机提供商发出警告,“在45分钟内多次运行Cron作业违反了他们的规则,可能会导致关闭帐户。” php脚本(将数据从txt插入mysql数据库)应每分钟执行一次,即应调用此链接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
还有其他方法吗?如果您有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,享受它令人敬畏的性能。做重复性工作有多种方法。我可以马上想到的一些方法是:
这里有免费服务
这让你可以设置一个很好的替代方案。我知道这个问题有点老了,但一周前我偶然发现了这个问题,我们发现的最好和安全的选择是使用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');
}
}