Запланированная задача должна быть создана, но ее невозможно использовать для работы с Cron (есть предупреждение от хостинг-провайдера, что «выполнение задания cron более одного раза в течение 45-минутного периода является нарушением их правил и может привести к отключению Счет."
PHP-скрипт (который вставляет данные из txt в базу данных mysql) должен выполняться каждую минуту, то есть эту ссылку следует называть http://www.myserver.com/ImportCumulusFile.php?type=dayfile&key=letmein&table=Dayfile&file=./data/ Jan10log.txt
Есть ли другой путь?
Существует несколько способов выполнения повторяющихся заданий. Некоторые из способов, о которых я могу думать сразу:
Используйте внешний сайт, подобный этому, чтобы отключить ваш URL с установленными интервалами
Использование метаобновления. Больше здесь . Вам нужно будет открыть страницу и оставить ее в рабочем состоянии.
Обновление Javascript / Ajax. Как и в предыдущем примере.
Настройка задания cron. Большинство общедоступных хостинга предоставляют способ создания рабочих заданий cron. Посмотрите на cPanel вашего хостинга.
если у вас есть доступ к оболочке, вы можете выполнить скрипт php через оболочку
что-то вроде этого будет бесконечным циклом, который сгорит 60 секунд, собирает мусор и повторяется до конца времени.
while(true) { sleep(60); //script here //end your script }
или вы можете сделать «бедный mans cron» с ajax или meta refresh. Я сделал это раньше. в основном, вы просто размещаете перенаправление с мета-обновлением javascript или html в начале вашего скрипта. получить доступ к этому скрипту из вашего браузера и просто оставить его открытым. он будет обновляться каждые 60 секунд, как крона.
еще одной альтернативой cronjob, будет сценарий bash, такой как:
#!/bin/bash while : do sleep 60 wget http://127.0.0.1/path/to/cronjob.php -O Temp --delete-after done
все это сказано, вы, вероятно, поймаете хозяин и все равно закончите.
Итак, ваше лучшее решение:
пойдите и подпишитесь на 5-10 долларов в месяц на vps и попрощайтесь с общедоступным хостингом и приветствуйте свой собственный маленький сервер.
если вы это сделаете, вы даже можете прекратить использовать crappy php и использовать hhvm facebook вместо этого и наслаждаться его потрясающей производительностью.
Я понимаю, что этот вопрос немного устарел, но я наткнулся на него неделю назад с этим вопросом, и лучшим и безопасным вариантом, который мы нашли, было использование веб-службы.
Наш контекст:
У нас есть наша система как на общем хостинге, так и на частных облаках.
Нам нужно, чтобы скрипт активировался один раз в месяц (есть планы создать больше расписаний и разрешить пользователям создавать некоторые предопределенные действия)
Наша система обеспечивает доступ ко многим клиентам, поэтому, когда кто-либо использует систему, она вызывает веб-службу через Ajax и не заботится об ответе (ведь все регистрируется в нашей базе данных и должно выполняться без взаимодействия с пользователем)
Мы сделали так:
1 – вызов ajax называется доступом на любом основном экране.
2 – Веб-служба считывает таблицу расписания в нашей базе данных и вызывает любые вызовы, требующие вызова
3 – Чтобы избежать множества вызовов со стопкой веб-сервисов, мы проверяем дату и время с интервалом в 10 минут, прежде чем выполнять какие-либо действия
Это также способ распределения баланса нагрузки, а графики не влияют на систему с взаимодействием с пользователем.
Вариант A
Простым способом реализовать это было бы создание записи файла / базы данных, содержащей время выполнения вашего php-скрипта:
<?php // crons.php return [ 'executebackup.php' => 1507979485, 'sendnewsletter.php' => 1507999485 ]; ?>
И при каждом запросе, сделанном через ваших посетителей, вы проверяете текущее время, и если в его версии вы включаете свой php-скрипт:
<?php // cronpixel.php $crons = @include 'cache/crons.php'; foreach ($crons as $script => $time) { if ($time < time()) { // create lock to avoid race conditions $lock = 'cache/' . md5($script) . '.lock'; if (file_exists($lock) || !mkdir($lock)) { continue; } // start your php script include($script); // now update crons.php $crons[ $script ] += 86400; // tomorrow file_put_contents('cache/crons.php', '<?php return ' . var_export($crons, true) . '; ?' . '>') // finally delete lock rmdir($lock); } } header("Last-Modified: " . gmdate("D, d MYH:i:s") . " GMT"); // image data $im = imagecreate(1, 1); $blk = imagecolorallocate($im, 0, 0, 0); imagecolortransparent($im, $blk); // image output header("Content-type: image/gif"); imagegif($im); // free memory imagedestroy($im); ?>
Примечание. Это будет вызвано на второй раз, потому что вы не знаете, когда ваш посетитель откроет вашу страницу (возможно, через 2 секунды). Поэтому имеет смысл установить новое время на следующий день, не добавляя 86400 секунд. Вместо этого используйте mktime .
Вариант B
Это небольшой проект, который я реализовал в прошлом, который похож на идею @ r3wt, но охватывает условия гонки и работает в точном времени, например, cronjob будет делать в планировщике без удара max_execution_time
. И он работает большую часть времени без необходимости воскрешать его (как это делается через посетителей в Варианте A).
Объяснение: Сценарий записывает файл блокировки (чтобы избежать условий гонки) на 15, 30, 45 и 60 секунд секунды:
// cron monitoring foreach ($allowed_crons as $cron_second) { $cron_filename = 'cache/' . $cron_second . '_crnsec_lock'; // start missing cron requests if (!file_exists($cron_filename)) { cron_request($cron_second); } // restart interrupted cron requests else if (filemtime($cron_filename) + 90 < time()) { rmdir($cron_filename); cron_request($cron_second); } }
Каждый раз, когда файл блокировки отсутствует, скрипт создает его и использует sleep () для достижения точной секунды:
if (file_exists($cron_filename) || !mkdir($cron_filename)) { return; } // add one minute if necessary $date = new DateTime(); $cron_date = new DateTime(); $cron_date->setTime($cron_date->format('H'), $cron_date->format('i'), $sec); $diff = $date->diff($cron_date); if ($diff->invert && $diff->s > 0) { $cron_date->setTime($cron_date->format('H'), $cron_date->format('i') + 1, $sec); } $diff = $date->diff($cron_date); // we use sleep() as time_sleep_until() starts one second to early (https://bugs.php.net/bug.php?id=69044) sleep($diff->s);
После пробуждения снова он отправляет запрос через fopen () :
// note: filter_input returns the unchanged SERVER var (http://php.net/manual/de/function.filter-input.php#99124) // note: filter_var is unsecure (http://www.d-mueller.de/blog/why-url-validation-with-filter_var-might-not-be-a-good-idea/) $url = 'http' . isSecure() . '://' . filter_input(INPUT_SERVER, 'HTTP_HOST', FILTER_SANITIZE_URL) . htmlspecialchars($request_uri, ENT_QUOTES, 'UTF-8'); $context = stream_context_create(array( 'http' => array( 'timeout' => 1.0 ) )); // note: return "failed to open stream: HTTP request failed!" because timeout < time_sleep_until if ($fp = @fopen($url, 'r', false, $context)) { fclose($fp); } rmdir($cron_filename);
Тем самым он называет себя бесконечно, и вы можете определить разные времена начала:
if (isset($_GET['cron_second'])) { if ($cron_second === 0 && !(date('i') % 15)) { mycron('every 15 minutes'); } if ($cron_second === 0 && !(date('i') % 60)) { mycron('every hour'); } }
Примечание. Он производит 5760 запросов в день (4 в минуту). Не много, но cronjob использует гораздо меньше ресурсов. Если ваш max_execution_time
достаточно высок, вы можете изменить его на вызов себя только один раз в минуту (1440 запросов / день).