Расписание скриптов без использования CRON

Я знаю, что есть много сообщений об использовании CRON для запуска php файла. Но, в мире совместного хостинга и простоты настройки для пользователя, я не хочу, чтобы с этим было связано.

Я нашел другое решение в Интернете, которое связано с сокетами. Просто хотел, чтобы все это взяли, и скажите, хорошая ли это или плохая идея. Похоже, он работает хорошо.

Мысли?

//Open socket connection to cron.php
$socketcon = fsockopen($_SERVER['HTTP_HOST'],80,$errorno,$errorstr,10);
if($socketcon) {
$socketdata = "GET /cron.php HTTP 1.1\r\nHost: ".$_SERVER['HTTP_HOST']."\r\nConnection: Close\r\n\r\n";
fwrite($socketcon,$socketdata);
//Normally you would get all the data back with fgets and wait until $socketcon reaches feof.
//In this case, we just do this:
fclose($socketcon);
} else {
//something went wrong. Put your error handler here.
}

cron.php:

//This script does all the work.
sleep(200);
//To prove that this works we will create an empty file here, after the sleep is done.
//Make sure that the webserver can write in the directory you're testing this file in.
$handle = fopen('test.txt','w');
fclose($handle);

Нашел script из сообщения в блоге: http://syn.ac/tech/13/creating-php-cronjobs-without-cron-and-php-cli/

Ответ 1

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

Я все равно буду использовать задание cron, даже если это немного боль.

Ответ 2

Задача cron - это задача cron. вы настроили его, и ОС выполнит задание для вас. Я не уверен, как работает PHP script с сайта, но если это требует вмешательства человека, то его на самом деле не называют работой cron. Если вы не хотите использовать cron, вы можете использовать цикл, а затем использовать функции даты PHP для настройки даты и времени. Псевдокод

while (1) {
    $d=date("d");
    if ( $d == "01" ){
        //run every 1st of month
        //code to run here
    }
}

Ответ 3

Это производит другой эффект, чем cron.

Задача cron запускается в определенные моменты времени, которые вы установили заранее.

Ваш метод в основном является своего рода "вилкой" или "асинхронным вызовом" для PHP script. Делать это через HTTP, как вы здесь делаете, это дешевая и простая техника. Я использую его сам. Он отличается от cron тем, что он сразу запускает "фоновый процесс".

Несколько комментариев:

  • Прежде всего, вы должны называть ignore_user_abort() в "background" script. В противном случае во многих средах ваш script будет прерван, когда "вызывающий" script закрывает сокет.

  • Во-вторых, вы можете фактически проверить переменную $_SERVER['HOST'] в "background" script, и таким образом вы можете иметь сценарии, которые не подвергаются интернету (в основном выдают запросы на localhost и проверьте это в фоновом режиме script). Затем вы можете, вероятно, доверять запросам, поступающим с вашей собственной машины, и пропускать все проверки безопасности, сеансы и т.д.

  • В-третьих, кто говорит, что "фон" script должен запускаться с PHP? PHP имеет много недостатков, если вы собираетесь использовать его как "фоновый" процесс. Основной недостаток заключается в том, что он блокирует ввод-вывод. Поэтому, если вы собираетесь отправлять электронные письма, обновлять строки базы данных или что-то еще, вы в основном приостанавливаете свой script каждый раз, когда вы отправляете запрос. Если, например, Node.js, вы можете запускать команды ввода-вывода асинхронно и продолжать работу. Если вы собираетесь использовать PHP, по крайней мере, обязательно отправляйте 10 писем за раз или обновляйте 10 строк за раз или что-то в этом роде.

  • Наконец, вы можете отобразить индикатор выполнения в браузере, если фона script что-то делает. Таким образом, вам понадобится использовать общее хранилище данных (например, вашу базу данных) для записи прогресса для задачи.

Ответ 4

Это функциональное, но странное решение, которое гарантирует, что ваша машина будет подключена в течение всего дня, начиная первый script. Если вы этого хотите, я бы рекомендовал вам использовать оболочку script с помощью wget или curl для этой цели.

Например:

#!/bin/sh

curl -O http://www.myserver.com/cron.php 2>&1 > /var/log/remote.cron.log

Но я думаю, что решение, которое вы хотели бы реализовать, если вам не нужно запускать очень синхронно, - это проверить в конце вашего index.php, чтобы увидеть, когда он запускал script в последний раз, если он был больше, чем два часа назад, затем include('cron.php'). Вы также можете сохранить отметку времени, когда побежал script в переменной окружения, чтобы избежать штрафа за производительность.

Ответ 5

Насколько я понимаю, прочитав этот пост в блоге и глядя на код, на самом деле это не значит, что у вас нет доступа к cron, это способ избежать того, что кто-то ждет ответа сервера на длинный запрос. Если вы абсолютно должны иметь определенный script исполняемый скажем каждые 10 минут или около того, то вам нужно будет использовать cron. Если вы просто хотите, чтобы пользователи не дождались завершения длинного запроса, этот хак может работать. Даже с помощью этого метода я все же думаю, что вы нажмете ограничения по времени, если ваш script занимает больше времени, чем позволяет PHP.

Пересмотр wp-cron.php(упоминается в ссылке в блоге), похоже, что он полностью полагается на пользователей, посещающих сайт, для запуска проверок по заданному типу заданий.

Эти методы не будут очень надежными, если у вас не будет другого пинг-сервера через определенные промежутки времени. Основная цель метода состоит в том, чтобы избежать ожидания пользователя, например, как 15 секунд для сценариев очистки или обслуживания, которые запускаются каждый раз за некоторое время, а не как истинная замена для всех видов использования cron.

Ответ 6

Если я хорошо понимаю, вы бы запустили первый script с удаленной машины, сделав удар по второму script, который будет размещен на вашем узле cron-disabled. Затем, благодаря ошибке или странной функции взаимодействия php/webserver при немедленном закрытии соединения, script не будет тайм-аут?

Первая часть - довольно распространенная практика, есть даже компании, предоставляющие эту услугу (http://www.webcron.org/index.php?lang=english, например, автоматически выталкивает любой script вы хотите в любое время, когда вы его просите, за плату).

Вторая часть мне неизвестна. Это похоже на ошибку в взаимодействии php/webserver, но я могу ошибаться. В любом случае, я бы дважды проверял, является ли это ошибкой или нет (подождите, что вы сейчас делаете правильно?), И если это окажется законным поведением, то идите на это. Если это кажется ошибкой, то не полагайтесь на это, поскольку это может быть исправлено в любое время.

Ответ 7

Мне потребовалось несколько дней, чтобы найти рабочее решение без условий гонки и/или наводнения моего собственного сервера, но, в конце концов, я думаю, что это должно работать:
http://www.programmierer-forum.de/phpcron-cronjobs-ohne-crontab-t348377.htm