Перейти к публикации
View in the app

A better way to browse. Learn more.

Дизайн и модификация Invision Community

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Опубликовано:

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

 

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

Опубликовано:
  • Автор

Что ему надо? 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;
}

Опубликовано:
  • Автор

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

 

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

 

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

 

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

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

Опубликовано:
  • Автор

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

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

Опубликовано:

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

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

Опубликовано:
  • Автор

Я понимаю как оно работает, оно берет время из функции, но дело в том, что, функция передает текущее время, если бы мои функции запуска обращались одновременно - другое дело, но здесь сначала идет выполнение одной, затем второй.

 

   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

 

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

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

Сейчас на странице 0

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.