Перейти к публикации
Дизайн и модификация IPS Community IPBSkinsBETA
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
TemKa_SD

Поиск файла по примерному названию php

Рекомендованные сообщения

05/11/19 20:26 (изменено)

Здравствуйте. Я реализовал функционал просмотра лога, хочу добавить к просмотру определенного лога второй файл из другой папки, это тоже лог, но он создается чуть позже и соответственно другое название.

 

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

Изменено пользователем TemKa_SD

Поделиться сообщением


Ссылка на сообщение

Что-то я плохо понимаю суть запроса. У вас есть два файла в разных катологах, и вы хотите открыть второй по имени первого, но имена немного отличаются? Нельзя тогда оба файла назвать одинаково? Или убрать время из имени файла? Можно конечно просканировать второй каталог например функцией glob (в ней есть поиск по маске), но имхо попахивает костылем. Если эти файлы создаются из одного процесса php, можно использовать унифицированное время из константы которое определяется при запуске скрипта и будет константное на весь процесс выполнения.

Поделиться сообщением


Ссылка на сообщение

Вы всё правильно поняли.

 

Так, я не всю информацию предоставил, это два разных процесса.

 

   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();
	}
   }

 

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

Поделиться сообщением


Ссылка на сообщение

Если запускаются одновременно, может стоить запустить в одном процессе php? Под процессом php имеется ввиду генерация страницы при текущим запросе, а не вызов функции exec. Чтото мне подсказывает что отрабатывают эти функции в одном запросе. Определите в constants.php константу define( IPS_UNIX_TIME, time() ) и используйте ее значение при генерации даты date( "d_m_Y_H:i:s", IPS_UNIX_TIME )

Можете в своем приложение определить какую-то переменную класса которое будет содержать одно время для разных функций.

Поделиться сообщением


Ссылка на сообщение

Ну да, в одном запросе, но задержка в любом случае будет мне кажется, это два разных приложения, одно на JAVA, второе на C++. По поводу времени не понял, что значит одно время для разных функций? Время - оно общее, каждую секунду всё больше.

Поделиться сообщением


Ссылка на сообщение

Я вам показал пример выше. Вы определяете одну константу или переменную с текущем временем перед выполнением этих функции а потом используете ее там где нужно унифицированное время. Функция date принимает второй не обязательный аргумент с времен timestamp, смотрите документацию.

Поделиться сообщением


Ссылка на сообщение

Так а если моим модулем будут пользоваться другие люди, им тоже это делать?

Поделиться сообщением


Ссылка на сообщение

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

Поделиться сообщением


Ссылка на сообщение

Я просто не понимаю как оно должно работать, ладно, спасибо, попробую.

Поделиться сообщением


Ссылка на сообщение

Не понимаю что тут непонятного

 

$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, которая будет одинаковым и для первой и для второй функции.

Поделиться сообщением


Ссылка на сообщение
05/12/19 18:01 (изменено)

Что ему надо? http://prntscr.com/nnm6ld нельзя функцию использовать тут? Сделать просто функцией, котороя будет возвращать time()?

Изменено пользователем TemKa_SD

Поделиться сообщением


Ссылка на сообщение

Определение констант класса

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;
}

Поделиться сообщением


Ссылка на сообщение
05/12/19 18:29 (изменено)

НУ первый запуск успешен, время одинаковое, спасибо большое, будем тестить.

 

Но я всё равно не понимаю, почему оно должно запускаться в одно время, между выполнением функций есть задержка в миллисекундах, и время МОЖЕТ БЫТЬ разное, а МОЖЕТ БЫТЬ и одинаковое.

 

---------------

 

Ну да, как я и предполагал: на секунду выше.

Изменено пользователем siv1987

Поделиться сообщением


Ссылка на сообщение
05/12/19 18:54 (изменено)

Есть идея, при запуске первой функции записать время в БД, при запуске второй функции указать это время во втором логе, думаю идеальное решение. Да и само время можно выводить где-нибудь, будет написано сколько времени назад был запущен бот. Что скажите?

Изменено пользователем TemKa_SD

Поделиться сообщением


Ссылка на сообщение

Но я всё равно не понимаю, почему оно должно запускаться в одно время, между выполнением функций есть задержка в миллисекундах, и время МОЖЕТ БЫТЬ разное, а МОЖЕТ БЫТЬ и одинаковое.

Это потому что вы не читате документацию. Я уже сто раз объяснил почему - если указать второй аргумент, функция будет использовать это время, если не указано - текущее время. Вы задаете свое время во втором аргументе. Что здесь не понятного? Уже на пальцах объясняю куда уже проще. Откройте мануал и изучите свойство функции. И вообще, возьмите как привычку читать описания функций в мануале на php.net

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

×
×
  • Создать...