У меня нет доступа к заданиям крона, как я нахожусь на общем сервере. Я все еще хотел бы выполнить задачу обновления на своей базе данных в интервалах набора. Как я могу лучше всего достигнуть этого. Очевидно, я мог проверить время, в которое выполняется index.php и если это находится на часе, я мог бы включать свой сценарий обновления. Но затем существует риск сценария, не выполняющегося (никакие пользователи не запрашивают страницу в ту секунду), или много выполнения.
Какие-либо идеи?
Вы уверены, что у вас нет доступа к cron?
crontab -e
Вы просто можете ...
Изменить: Также, пожалуйста, не прикрепляйте скрипт обновления к index.php за счет одного бедного пользователя каждый час ...
Запустите скрипт на сервере, где есть cron, чтобы получить доступ к url, который запускает php-скрипт по часам. Я использую wget в своем crontab для таких вещей.
Вы часть пути туда. Не проверяйте, находится ли время «на часе»; проверьте разницу между текущим временем и временем последнего обновления. Это, конечно, требует, чтобы вы хранили метку времени где-то при запуске обновления.
Самая большая проблема с этим подходом заключается в том, что страница не загружается до завершения обновления. В зависимости от того, сколько времени занимает обновление, это может не быть фактором; но если это так,возможно, вы захотите создать новый поток для обновления (я даже не уверен, возможно ли это в PHP).
Ребята, вы близки. Вместо того, чтобы помещать периодические функции в PHP страницы, которую запрашивает пользователь, сделайте так, чтобы запрос javascript происходил со страницы пользователя. Таким образом, вы можете быть уверены, что загрузка страницы не замедлится, и javascript сработает onLoad(). Сохраняйте значение 'last processed', как было предложено выше, и запускайте функцию cron только один раз за заданный интервал времени.
Вот JS, который нужно использовать, чтобы вызвать что-то удаленно. Конечно, это будет работать только в современных браузерах с включенным JS...
<script>
function DoCron()
{
var xhr;
try { xhr = new ActiveXObject('Msxml2.XMLHTTP'); }
catch (e)
{
try { xhr = new ActiveXObject('Microsoft.XMLHTTP'); }
catch (e2)
{
try { xhr = new XMLHttpRequest(); }
catch (e3) { xhr = false; }
}
}
xhr.onreadystatechange = function()
{
if(xhr.readyState == 4)
{
if(xhr.status == 200)
{
alert("Cron Worked");
}
else
{
return 'ERROR';
}
}
};
xhr.open("POST", "CRON.php", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send('');
}
</script>