Я устанавливаю cronjob на сервере CentOS 6.4 (final) (с установленным PHP 5.5.9 и Apache httpd 2.4.4):
30 15 * * * wget "http://10.15.1.2/calc.php" -O /dev/null
calc.php Несколько серверов ftps для загрузки нескольких файлов журналов (используя встроенные в PHP функции ftp), вставки записей журнала в файлы журналов в одну временную таблицу, затем подсчет записей журнала с разными датами и, наконец, вставку подсчитанных результатов в другую сводную таблицу. Это очень простая программа.
calc.php начинается в 15:30 и заканчивается в 15:46 (calc.php напишет время для входа). Когда я проверяю журнал, Я считаю, что calc.php снова выполняется в 15:45. (почти когда первый запуск заканчивается). Я дважды проверил свой calc.php. В основной логике я не использую операторы цикла, например while, do-while или for и т. д. Все упомянутые выше задачи записаны в виде функций в одном и том же программном файле. Я много раз запускаю один и тот же URL в браузере, все они работают нормально.
Так в чем же причина повторного выполнения при выполнении задания cron?
Вот основная логическая часть (Заметка: myxxxx () мои собственные простые функции отображения сообщений. USEARRAY_MODE а также TESTINSTMP_MODE не определены во время работы):
myassess("Being-calcuated logfile list=\n".xpr($srclog_fn_list));
if (defined('USEARRAY_MODE')) {
// Insert outer srclog into temp array
if (false === ($srclog_calc_date = insert_srclog_to_array($srclog_get_date, $srclog_dir, $srclog_delta_days, $srclog_fn_list, $logtmp_sfile, $logtmp_dfile, $logtmp_result))) {
myerror("Insert outer srclog to temp array has problem!");
exit;
}
myassess("Actually calculated date = $srclog_calc_date.");
// If testinstemp mode, we stop here without doing statistics
if (defined('TESTINSTMP_MODE')) {
myinfo("Skipping statistics in testinstmp mode.");
exit;
}
// Do statistics and then insert into summary table
$total_cnt_list = do_statistics_from_array($_cnt_g2s_array, $userlist_tempfile, $rule_file, $srclog_calc_date, $logtmp_result);
} else { // use table
// Insert outer srclog 入 temp array
if (false === ($srclog_calc_date = insert_srclog_to_table($srclog_get_date, $srclog_dir, $srclog_delta_days, $srclog_fn_list))) {
myerror("Insert outer srclog to temp table has problem!");
exit;
}
myassess("Actually calculated date = $srclog_calc_date.");
// If testinstemp mode, we stop here without doing statistics
if (defined('TESTINSTMP_MODE')) {
myinfo("Skipping statistics in testinstmp mode.");
exit;
}
// Do statistics and then insert into summary table
$total_cnt_list = do_statistics_from_table($_cnt_g2s_array, $userlist_tempfile, $rule_file, $srclog_calc_date);
}
if (false === $total_cnt_list)
myerror("Calculate/Write outer summary has problem!");
else {
myinfo("Outer srclog actually calculated date = $srclog_calc_date.");
myinfo("Total summary count = ".array_sum($total_cnt_list));
myinfo("Insert-ok summary count = ".$total_cnt_list[0]);
myinfo("!!!Insert-fail summary count = ".$total_cnt_list[1]);
}
@mysql_close($wk_dbconn);
@oci_close($uodb_conn);
myinfo("### Running end at ".date(LOG_DATEFORMAT1).".");
myinfo("### total exectution time:".elapsed_time($_my_start_time, microtime(true)));
myinfo("############ END program ############");
exit;
Задача ещё не решена.
Других решений пока нет …