Jump to content
Дизайн и модификация IPS Community IPBSkinsBETA
Search In
  • More options...
Find results that contain...
Find results in...
Sign in to follow this  
TemKa_SD

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

Recommended Posts

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

 

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

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

Edited by siv1987

Share this post


Link to post
Share on other sites

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

Edited by TemKa_SD

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...