Расписание скриптов без использования 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); 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Например:

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

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

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

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

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

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