Опубликовано: 11 мая 20196 г Здравствуйте. Я реализовал функционал просмотра лога, хочу добавить к просмотру определенного лога второй файл из другой папки, это тоже лог, но он создается чуть позже и соответственно другое название. bot25_11_05_2019_20:22:51.log - основной лог.bot25_11_05_2019_20:22:52.log - вторичный лог. public function viewFile() { if ( \IPS\NO_WRITES ) { \IPS\Output::i()->error( 'no_writes', '1C324/4', 403, '' ); } $file = static::logDir() . \IPS\Request::i()->file; $file_gcb = static::logDirGCB() . \IPS\Request::i()->file; if ( !is_file( $file ) ) { \IPS\Output::i()->error( 'node_error', '2C324/5', 404, '' ); } \IPS\Output::i()->sidebar['actions']['delete'] = array( 'icon' => 'times-circle', 'link' => \IPS\Http\Url::internal( 'app=wc3&module=bots&controller=logs&do=delete' )->setQueryString( 'file', \IPS\Request::i()->file ), 'title' => 'delete', 'data' => array( 'confirm' => '' ) ); $log = file($file); $log = \array_slice( $log, -400, 400, TRUE ); $gcb_log = file($file_gcb); $gcb_log = \array_slice( $file_gcb, -400, 400, TRUE ); \IPS\Output::i()->title = basename( $file ); \IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( "app=wc3&module=bots&controller=logs" ), \IPS\Member::loggedIn()->language()->addToStack('menu__wc3_bots_logs') ); \IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'logs' )->view( implode("", $log), implode("", $gcb_log) ); } Второстепенный лог, в котором нужно реализовать что-то вроде функции поиска по названию файла основного лога. $file_gcb = static::logDir() . \IPS\Request::i()->file; Так вот оно грузит, если названия одинаковые: http://prntscr.com/nnbw7b Изменено 11 мая 20196 г пользователем TemKa_SD
Опубликовано: 11 мая 20196 г Что-то я плохо понимаю суть запроса. У вас есть два файла в разных катологах, и вы хотите открыть второй по имени первого, но имена немного отличаются? Нельзя тогда оба файла назвать одинаково? Или убрать время из имени файла? Можно конечно просканировать второй каталог например функцией glob (в ней есть поиск по маске), но имхо попахивает костылем. Если эти файлы создаются из одного процесса php, можно использовать унифицированное время из константы которое определяется при запуске скрипта и будет константное на весь процесс выполнения.
Опубликовано: 11 мая 20196 г Автор Вы всё правильно поняли. Так, я не всю информацию предоставил, это два разных процесса. public function startBot($bot_id) { $bot = static::load( $bot_id ); $path = static::BOT_PATH; $bot_pid = $bot->bot_pid; $log = $path . 'logs/' . 'bot' . $bot_id . '_' . date('d') . '_' . date( 'm' ) . '_' . date( 'Y' ) . '_' . date( 'H' ) . ':' . date( 'i' ) . ':' . date( 's' ) . '.log'; $bot_sid = $bot->bot_id; $port = static::botSettings($bot_sid)->botConfig['bot_hostport']; if( $bot_pid ) { \IPS\Output::i()->error( \IPS\Member::loggedIn()->language()->addToStack('wc3_bot_run_error_1', FALSE, array( 'sprintf' => array($bot_pid))), $bot_pid, 500, '' ); } else if ( !static::checkPort( $port ) ) { $bot->bot_pid = 0; $bot->save(); \IPS\Output::i()->error( \IPS\Member::loggedIn()->language()->addToStack('wc3_bot_run_error_2', FALSE, array( 'sprintf' => array($port))), $port, 500, '' ); } else { $bot_pidNew = \exec("cd {$path}{$bot_id}; nohup ./{$bot_id}++ > {$log} 2>&1 & echo $!"); $bot->bot_pid = $bot_pidNew; $bot->save(); } } public function startGarena($bot_id) { $bot = static::load( $bot_id ); $path = static::BOT_PATH; $gcb_pid = $bot->gcb_pid; $log = $path . 'gcb_logs/' . 'bot' . $bot_id . '_' . date('d') . '_' . date( 'm' ) . '_' . date( 'Y' ) . '_' . date( 'H' ) . ':' . date( 'i' ) . ':' . date( 's' ) . '.log'; if( $gcb_pid ) { \IPS\Output::i()->error( \IPS\Member::loggedIn()->language()->addToStack('wc3_bot_gcb_run_error_1', FALSE, array( 'sprintf' => array($gcb_pid))), $gcb_pid, 500, '' ); } else { $gcb_pidNew = \exec("cd {$path}{$bot_id}/gcb/; nohup java -jar gcb.jar > {$log} 2>&1 & echo $!"); $bot->gcb_pid = $gcb_pidNew; $bot->save(); } } Они запускаются одновременно, иногда даже секунды запуска совпадают, иногда нет. Можно конечно от секунд отказаться, но это еще больший костыль.
Опубликовано: 12 мая 20196 г Если запускаются одновременно, может стоить запустить в одном процессе php? Под процессом php имеется ввиду генерация страницы при текущим запросе, а не вызов функции exec. Чтото мне подсказывает что отрабатывают эти функции в одном запросе. Определите в constants.php константу define( IPS_UNIX_TIME, time() ) и используйте ее значение при генерации даты date( "d_m_Y_H:i:s", IPS_UNIX_TIME )Можете в своем приложение определить какую-то переменную класса которое будет содержать одно время для разных функций.
Опубликовано: 12 мая 20196 г Автор Ну да, в одном запросе, но задержка в любом случае будет мне кажется, это два разных приложения, одно на JAVA, второе на C++. По поводу времени не понял, что значит одно время для разных функций? Время - оно общее, каждую секунду всё больше.
Опубликовано: 12 мая 20196 г Я вам показал пример выше. Вы определяете одну константу или переменную с текущем временем перед выполнением этих функции а потом используете ее там где нужно унифицированное время. Функция date принимает второй не обязательный аргумент с времен timestamp, смотрите документацию.
Опубликовано: 12 мая 20196 г Автор Так а если моим модулем будут пользоваться другие люди, им тоже это делать?
Опубликовано: 12 мая 20196 г Вы можете задать не константе а переменной вашего приложения где храните настройки. Включите воображение, задача тривиальная.
Опубликовано: 12 мая 20196 г Автор Я просто не понимаю как оно должно работать, ладно, спасибо, попробую.
Опубликовано: 12 мая 20196 г Не понимаю что тут непонятного $time = time(); .... file_put_contents( $folder1."/bot_".date( "d_m_Y_H:i:s", $time ), $log1 ); ..... file_put_contents( $folder2."/bot_".date( "d_m_Y_H:i:s", $time ), $log2 ); Для форматирования даты функция будет использовать время из переменной $time, которая будет одинаковым и для первой и для второй функции.
Опубликовано: 12 мая 20196 г Автор Что ему надо? http://prntscr.com/nnm6ld нельзя функцию использовать тут? Сделать просто функцией, котороя будет возвращать time()? Изменено 12 мая 20196 г пользователем TemKa_SD
Опубликовано: 12 мая 20196 г Определение констант классаThey are defined by using one of the keywords public, protected, or private, followed by a normal variable declaration. This declaration may include an initialization, but this initialization must be a constant value--that is, it must be able to be evaluated at compile time and must not depend on run-time information in order to be evaluated. Можно функцию, только надо помнить что она должна возвращать статическое один раз определенное значение. function getTime(){ static $time; if(!$time){ $time = time(); } return $time; }
Опубликовано: 12 мая 20196 г Автор НУ первый запуск успешен, время одинаковое, спасибо большое, будем тестить. Но я всё равно не понимаю, почему оно должно запускаться в одно время, между выполнением функций есть задержка в миллисекундах, и время МОЖЕТ БЫТЬ разное, а МОЖЕТ БЫТЬ и одинаковое. --------------- Ну да, как я и предполагал: на секунду выше. Изменено 12 мая 20196 г пользователем siv1987
Опубликовано: 12 мая 20196 г Автор Есть идея, при запуске первой функции записать время в БД, при запуске второй функции указать это время во втором логе, думаю идеальное решение. Да и само время можно выводить где-нибудь, будет написано сколько времени назад был запущен бот. Что скажите? Изменено 12 мая 20196 г пользователем TemKa_SD
Опубликовано: 12 мая 20196 г Но я всё равно не понимаю, почему оно должно запускаться в одно время, между выполнением функций есть задержка в миллисекундах, и время МОЖЕТ БЫТЬ разное, а МОЖЕТ БЫТЬ и одинаковое.Это потому что вы не читате документацию. Я уже сто раз объяснил почему - если указать второй аргумент, функция будет использовать это время, если не указано - текущее время. Вы задаете свое время во втором аргументе. Что здесь не понятного? Уже на пальцах объясняю куда уже проще. Откройте мануал и изучите свойство функции. И вообще, возьмите как привычку читать описания функций в мануале на php.net
Опубликовано: 12 мая 20196 г Автор Я понимаю как оно работает, оно берет время из функции, но дело в том, что, функция передает текущее время, если бы мои функции запуска обращались одновременно - другое дело, но здесь сначала идет выполнение одной, затем второй. public function botCommand() { \IPS\Output::i()->output = new \IPS\Helpers\MultipleRedirect( \IPS\Http\Url::internal('app=wc3&module=bots&controller=bots&do=botCommand')->setQueryString( array( 'bot' => \IPS\Request::i()->bot_id, 'command' => \IPS\Request::i()->command ) ), function( $data ) { if ( !\is_array( $data ) ) { $commands = explode(",", \IPS\Request::i()->command); $count = \count($commands); return array( array( 'count' => $count, 'done' => 0, 'bot' => \IPS\Request::i()->bot, 'commands' => $commands ), \IPS\Member::loggedIn()->language()->addToStack('wc3_bot_commands_start') ); } else { if ( $data['count'] != $data['done'] ) { $command = $data['commands'][$data['done']]; switch( $command ) { case 'startBot': static::startBot($data['bot']); break; case 'startGarena': static::startGarena($data['bot']); break; case 'stopBot': static::stopBot($data['bot']); break; case 'stopGarena': static::stopGarena($data['bot']); break; case 'reloadBot': static::stopBot($data['bot']); sleep(1); static::startBot($data['bot']); break; case 'reloadGarena': static::stopGarena($data['bot']); sleep(1); static::startGarena($data['bot']); break; case 'compileBot': static::compileBot(); break; } $data['done']++; } else { return NULL; } return array( $data, \IPS\Member::loggedIn()->language()->addToStack( $command ), 100 / $data['count'] * $data['done'] ); } }, function() { \IPS\Output::i()->redirect( \IPS\Http\Url::internal( 'app=wc3&module=bots&controller=bots' ) ); } ); } case 'startBot': static::startBot($data['bot']); break; case 'startGarena': static::startGarena($data['bot']); break; Я прочитал об этом час назад: http://prntscr.com/nnn19k Просто в силу своих слабых знаний, я пока не понимаю как оно должно работать, время не фиксированное.
Здравствуйте. Я реализовал функционал просмотра лога, хочу добавить к просмотру определенного лога второй файл из другой папки, это тоже лог, но он создается чуть позже и соответственно другое название.
bot25_11_05_2019_20:22:51.log - основной лог.
bot25_11_05_2019_20:22:52.log - вторичный лог.
public function viewFile() { if ( \IPS\NO_WRITES ) { \IPS\Output::i()->error( 'no_writes', '1C324/4', 403, '' ); } $file = static::logDir() . \IPS\Request::i()->file; $file_gcb = static::logDirGCB() . \IPS\Request::i()->file; if ( !is_file( $file ) ) { \IPS\Output::i()->error( 'node_error', '2C324/5', 404, '' ); } \IPS\Output::i()->sidebar['actions']['delete'] = array( 'icon' => 'times-circle', 'link' => \IPS\Http\Url::internal( 'app=wc3&module=bots&controller=logs&do=delete' )->setQueryString( 'file', \IPS\Request::i()->file ), 'title' => 'delete', 'data' => array( 'confirm' => '' ) ); $log = file($file); $log = \array_slice( $log, -400, 400, TRUE ); $gcb_log = file($file_gcb); $gcb_log = \array_slice( $file_gcb, -400, 400, TRUE ); \IPS\Output::i()->title = basename( $file ); \IPS\Output::i()->breadcrumb[] = array( \IPS\Http\Url::internal( "app=wc3&module=bots&controller=logs" ), \IPS\Member::loggedIn()->language()->addToStack('menu__wc3_bots_logs') ); \IPS\Output::i()->output = \IPS\Theme::i()->getTemplate( 'logs' )->view( implode("", $log), implode("", $gcb_log) ); }Второстепенный лог, в котором нужно реализовать что-то вроде функции поиска по названию файла основного лога.
Так вот оно грузит, если названия одинаковые: http://prntscr.com/nnbw7b
Изменено пользователем TemKa_SD