[PHP] Запуск скрипта 1 раз в день без CRON

D
На сайте с 14.01.2007
Offline
153
#41

а как вам такое?

добавляем вначале к index.php

(код есс-но не работоспособный, просто набросок)

$lastUdate = "date";

if ($lastUpdate != date() )

{

$string = file_get_contents("index.php");

$string = str_replace('$lastUdate = "date";', '$lastUdate = "'+date()+'";', $string);

$file_put_contents("index.php", $string);

}

[Удален]
#42

Dinozavr, например мне: ненавижу такое гавно. код должен быть прорачным, и логика очевидна. я же не пхп интерпретатор, чтобы распознать что там за код. это вы сейчас помните, что за кусок, а послезавтра сядете голову поломать :)

D
На сайте с 14.01.2007
Offline
153
#43

ничего не мешает хорошо задокументировать ;)

из преимуществ: вместо Н обращений к файл системе имеем только 1 в сутки

T.R.O.N
На сайте с 18.05.2004
Offline
314
#44
Dinozavr:
а как вам такое?

правильное и красивое решение, но в нем нет защиты от двойного срабатывания при малой задержке в обращениях... Нужно грамотно блокировать файл

От воздержания пока никто не умер. Хотя никто и не родился! Prototype.js был написан теми, кто не знает JavaScript, для тех, кто не знает JavaScript (Richard Cornford)
T
На сайте с 28.06.2007
Offline
82
#45

Dinozavr, спасибо, я не силён в PHP, да и мудрить особо не хочется.

T.R.O.N:
я не занимаюсь пыхом, но чем читать файл, на мой взгляд, быстрее проверить дату его создания (у перла это функция stat(FILE) )... А файл, пусть будет пустой...

Спасибо, даже не задумывался о таком исполнении :)

<?php

$fdata=date ("ymd",filemtime("data.txt"));
$data = date("ymd");
if ($data!=$fdata)
{
include ("cron.php");
file_put_contents("data.txt", $data);
}
?>
ewg777
На сайте с 04.06.2007
Offline
225
#46

Trol, им уже не до Вас.

Для таких вещей есть крон.

vvvvv
На сайте с 04.01.2010
Offline
17
#47
Trol:
Т.е. чтобы скрипт исполнялся один раз в день через include например. По приходу первого посетителя или робота поисковой системы...

Еще один вариант решения. Скрипт будет запускаться при захода первого посетителя после заданного времени суток. Можно задать несколько контрольных отметок.


$times = array('06:00', '15:00', '21:00');
$lastModified = getTimePeriod(true, $times);

if ( file_exists($filename) && filemtime($filename) > $lastModified ) {
// если файл существует и время его модификации не устарело
......................
} else {
// файл отсутствует или данные устарели
file_put_contents($filename, $var);
......................
}


function getTimePeriod($lastModified, $expires=array()){
$now = time();
if ( is_array($expires) ) {
$timestamps = array();
foreach ($expires as $k => $time) {
if ( ! is_numeric($time) ) {
$time = strtotime($time);
if ( false === $time || -1 === $time ) continue;
if ( preg_match('/^\s*\d+(?:\s*:\s*\d+){1,2}\s*$/', $expires[$k]) ) {
$timestamps[] = $time - 24*60*60;
$timestamps[] = $time + 24*60*60;
}
}
$timestamps[] = $time;
}
if ( $lastModified ) arsort($timestamps);
else asort($timestamps);
foreach ($timestamps as $time) {
if ( $lastModified && $now >= $time || ! $lastModified && $now <= $time ) {
$now = $time;
break;
}
}
}
return $lastModified ? $now : $now - time();
}
ewg777
На сайте с 04.06.2007
Offline
225
#48
vvvvv:
Еще один вариант решения. Скрипт будет запускаться при захода первого посетителя после заданного времени суток. Можно задать несколько контрольных отметок.

$times = array('06:00', '15:00', '21:00');
$lastModified = getTimePeriod(true, $times);

if ( file_exists($filename) && filemtime($filename) > $lastModified ) {
// если файл существует и время его модификации не устарело
......................
} else {
// файл отсутствует или данные устарели
file_put_contents($filename, $var);
......................
}


function getTimePeriod($lastModified, $expires=array()){
$now = time();
if ( is_array($expires) ) {
$timestamps = array();
foreach ($expires as $k => $time) {
if ( ! is_numeric($time) ) {
$time = strtotime($time);
if ( false === $time || -1 === $time ) continue;
if ( preg_match('/^\s*\d+(?:\s*:\s*\d+){1,2}\s*$/', $expires[$k]) ) {
$timestamps[] = $time - 24*60*60;
$timestamps[] = $time + 24*60*60;
}
}
$timestamps[] = $time;
}
if ( $lastModified ) arsort($timestamps);
else asort($timestamps);
foreach ($timestamps as $time) {
if ( $lastModified && $now >= $time || ! $lastModified && $now <= $time ) {
$now = $time;
break;
}
}
}
return $lastModified ? $now : $now - time();
}

Парочку баз забыли заюзать, ну и без goto почему?

vvvvv
На сайте с 04.01.2010
Offline
17
#49
ewg777:
Парочку баз забыли заюзать, ну и без goto почему?

Сарказм понятен, но неуместен.

T.R.O.N
На сайте с 18.05.2004
Offline
314
#50
vvvvv:

$times = array('06:00', '15:00', '21:00');

........

if preg_match('/^\s*\d+(?:\s*:\s*\d+){1,2}\s*$/',$expires[$k])){
])){
$timestamps[]=$time-24*60*60;
$timestamps[]=$time+24*60*60;
}
}

Чудесный пример говнокода... Сначала создать ненужные константы в неудобном виде, а потом их-же постоянно преобразовывать...

Скажите, вы не родственник PHPExpert. Он тоже все время хочет заюзать весь возможный рессурс

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий