Планирование сценариев без использования CRON - PullRequest
15 голосов
/ 27 января 2010

Я знаю, что есть много сообщений об использовании 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);

Нашел скрипт из поста в блоге: http://syn.ac/tech/13/creating-php-cronjobs-without-cron-and-php-cli/

Ответы [ 7 ]

4 голосов
/ 27 января 2010

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

while (1) {
    $d=date("d");
    if ( $d == "01" ){
        //run every 1st of month
        //code to run here
    }
}
4 голосов
/ 27 января 2010

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

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

2 голосов
/ 21 ноября 2010

Это производит эффект, отличный от cron.

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

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

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

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

  2. Во-вторых, вы можете на самом деле проверить переменную $_SERVER['HOST'] в «фоновом» скрипте, и таким образом вы можете иметь скрипты, которые не доступны в Интернете (в основном выдают запросы на localhost и проверяют что в фоновом скрипте). Затем вы можете, по-видимому, доверять запросам, поступающим с вашего компьютера, и пропускать все проверки безопасности, сеансы и т. Д.

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

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

1 голос
/ 27 января 2010

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

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

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

1 голос
/ 27 января 2010

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

Например:

#!/bin/sh

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

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

0 голосов
/ 12 февраля 2015

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

0 голосов
/ 27 января 2010

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

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

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

...