Задать вопрос
  • 1С: Можно ли обновить базу на другом компьютере?

    @GSV4 Автор вопроса
    kalapanga, Мы бы с радостью, но апгрейд стоит 43 200 рупий. Дороговато, однако.
  • PHP: Как вывести русский текст в консоли Windows 7?

    @GSV4 Автор вопроса
    Если кому интересно, то вот модуль "GSOutput.php", позволяющий корректно выводить текст независимо от того, где был запущен скрипт - в браузере или консоли. Также позволяет дублировать весь вывод в лог-файл.

    /*
      GSOutput.php
      Организация вывода текста (браузер, консоль, лог-файл)
      Версия 1.1.0.0 от 04.11.2022
    */
    
    // Класс COutput
    // ====================================================================================================
    
    class COutput
    /*
      Полностью статический класс, предназначенный для хранения параметров текущего устройства вывода
      (окна браузера и консоли - в зависимости от того, где был запущен PHP-скрипт, использующий этот класс).
    */
    {
      static public string $sEncoding;
      static public bool   $bIsConsole;
      static public bool   $bIsPrecise;
      static public string $sEOL;
    
      static private bool $bInitialized = false;
    
      static public function Begin($_bPrecise = true)
      /*
        Инициализирует класс.
    
        ПАРАМЕТРЫ
          $_bPrecise
            Нужно ли заключать текст, выводимый в браузере, в теги <pre> и </pre>.
      */
      {
        global $argc, $argv;
    
        if (self::$bInitialized) return false;
    
        self::$sEncoding = '';
        self::$bIsPrecise = $_bPrecise;
    
        if (isset($argc)) {
          if ($argc) parse_str(implode('&', array_slice($argv, 1)), $_GET);
          self::$bIsConsole = true;
          self::$sEOL = PHP_EOL;
    
          if (PHP_OS === 'WINNT' && php_uname('r') === '6.1') {
            // В Windows 7 для корректного вывода русского текста консоль должна быть в кодировке ANSI,
            // а все выводимые строки - в кодировке OEM.
    
            exec('chcp 1251');
            self::$sEncoding = 'cp866';
          }
        }
        else {
          self::$bIsConsole = false;
          if ($_bPrecise) echo '<pre>';
          self::$sEOL = '<br>';
        }
    
        self::$bInitialized = true;
        return true;
      } // static public function Begin(...)
    
      static public function End()
      /*
        Финализирует класс.
      */
      {
        if (!self::$bInitialized) return false;
    
        if (self::$bIsPrecise) echo '</pre>';
        return true;
      }
    } // class COutput
    
    // Класс CConsole
    // ====================================================================================================
    
    const iCON__OPTION__USE_LOG = 1;  // Дублировать вывод в лог-файл.
    
    const iCON__TS_MODE__SCREEN = 1;  // Отображать временной штамп на экране (в браузере и консоли).
    const iCON__TS_MODE__LOG    = 2;  // Отображать временной штамп в лог-файле.
    
    class CConsole
    /*
      Выводит текст в следующие устройства вывода:
        - окно браузера (если PHP-скрипт был запущен в браузере);
        - консоль вывода (если PHP-скрипт был запущен из командной строки);
        - лог-файл (если пользователь включил режим дублирования в файл).
    
      ПРИМЕР ИСПОЛЬЗОВАНИЯ
        $oCon = new CConsole();
        $oCon->UseLog(1, 'Logs' . DIRECTORY_SEPARATOR . date('Y-m-d H-i-s') . '.txt');
        $oCon->ShowTimeStamp(2);
    
        $oCon->PutLn('Приветствую Вас, ', $sUserName, '!');
        $oCon->PutLn();
    */
    {
      private int $iOptions = 0;
      private int $iIndent = 0;
      private int $iTSMode = 0;
      private string $sTSFormat = '';
      private $rLog = null;
    
      public function __destruct()
      {
        if ($this->rLog) fclose($this->rLog);
      }
    
      public function UseLog($_bUse, string $_sPathName = '', $_bCreateDir = false)
      /*
        Включает/выключает дублирование вывода в лог-файл.
    
        ПАРАМЕТРЫ
          $_bCreateDir
            Создать каталог, указанный в имени $_sPathName, если его не существует.
      */
      {
        if ($this->rLog) fclose($this->rLog);
    
        if ($_bUse) {
          $sDirName = dirname($_sPathName);
          if (!is_dir($sDirName) && $_bCreateDir) mkdir($sDirName, 0777, true);
    
          $this->rLog = fopen($_sPathName, 'a');
          $this->iOptions |= iCON__OPTION__USE_LOG;
        }
        else {
          $this->rLog = null;
          $this->iOptions &= ~iCON__OPTION__USE_LOG;
        }
      }
    
      public function ShowTimeStamp(int $_iMode, string $_sFormat = '[d.m.Y H:i:s] ')
      /*
        Включает/выключает отображение временного штампа перед каждым выводимым сообщением.
    
        ПАРАМЕТРЫ
          $_iMode
            Произвольное сочетание битовых флагов iCON__TS_MODE__*.
          $_sFormat
            Формат временного штампа, соответствующий правилам PHP-функции date.
      */
      {
        $this->iTSMode   = $_iMode;
        $this->sTSFormat = $_sFormat;
      }
    
      public function SetIndent(int $_iIndent, int $_iMode = 0)
      /*
        Устанавливает текущую величину отступа.
        (1 отступ = 2 пробелам.)
    
        ПАРАМЕТРЫ
          $_iMode
            -1 - уменьшает отступ на $_iIndent;
             0 - устанавливает отступ = $_iIndent;
             1 - увеличивает отступ на $_iIndent.
      */
      {
        switch ($_iMode) {
          case 0:
            $this->iIndent = $_iIndent;
            break;
    
          case 1:
            $this->iIndent += $_iIndent;
            break;
    
          case -1:
            $this->iIndent -= $_iIndent;
        }
    
        if ($this->iIndent < 0) $this->iIndent = 0;
        return $this->iIndent;
      }
    
      public function Put()
      /*
        Выводит данные в устройства вывода (окно браузера, консоль, лог-файл).
        Разделитель строк после данных не записывает.
    
        ПАРАМЕТРЫ
          Функция работает с любым количеством параметров.
      */
      {
        $iTotalArgs = func_num_args();
    
        for ($i = 0; $i < $iTotalArgs; $i++) {
          $xArg = func_get_arg($i);
    
          if ($this->iTSMode & iCON__TS_MODE__SCREEN)
            echo date($this->sTSFormat);
    
          if ($this->iIndent) {
            $sIndent = str_repeat('  ', $this->iIndent);
            echo $sIndent;
          }
    
          if (COutput::$sEncoding)
            echo mb_convert_encoding($xArg, COutput::$sEncoding);
          else
            echo $xArg;
    
          if ($this->iOptions & iCON__OPTION__USE_LOG) {
            if ($this->iTSMode & iCON__TS_MODE__LOG)
              fwrite($this->rLog, date($this->sTSFormat));
    
            if ($this->iIndent) fwrite($this->rLog, $sIndent);
            fwrite($this->rLog, $xArg);
          }
        }
      } // public function Put()
    
      public function PutLn()
      /*
        Выводит данные в устройства вывода (окно браузера, консоль, лог-файл).
        После данных записывает разделитель строк (COutput::$sEOL).
    
        ПАРАМЕТРЫ
          Функция работает с любым количеством параметров.
      */
      {
        $iTotalArgs = func_num_args();
    
        for ($i = 0; $i < $iTotalArgs; $i++) {
          $xArg = func_get_arg($i);
    
          if ($this->iTSMode & iCON__TS_MODE__SCREEN)
            echo date($this->sTSFormat);
    
          if ($this->iIndent) {
            $sIndent = str_repeat('  ', $this->iIndent);
            echo $sIndent;
          }
    
          if (COutput::$sEncoding)
            echo mb_convert_encoding($xArg, COutput::$sEncoding);
          else
            echo $xArg;
    
          if ($this->iOptions & iCON__OPTION__USE_LOG) {
            if ($this->iTSMode & iCON__TS_MODE__LOG)
              fwrite($this->rLog, date($this->sTSFormat));
    
            if ($this->iIndent) fwrite($this->rLog, $sIndent);
            fwrite($this->rLog, $xArg);
          }
        }
    
        echo COutput::$sEOL;
    
        if ($this->iOptions & iCON__OPTION__USE_LOG)
          fwrite($this->rLog, PHP_EOL);
      } // public function PutLn()
    } // class CConsole


    Пример использования этого модуля:

    /*
      Тестирование модуля GSOutput.
    */
    
    require_once 'GSOutput.php';
    
    COutput::Begin();
    
    $oCon = new CConsole();
    $oCon->UseLog(1, 'Logs' . DIRECTORY_SEPARATOR . date('Y-m-d H-i-s') . '.txt');
    
    $oCon->Put(php_sapi_name(), '|');
    $oCon->Put('Раз Миссисипи', '|');
    $oCon->Put('Два Миссисипи', '|');
    $oCon->Put('Три Миссисипи');
    
    $oCon->PutLn();
    $oCon->PutLn();
    
    $oCon->ShowTimeStamp(3);
    
    $oCon->PutLn(php_sapi_name());
    $oCon->PutLn('Раз Миссисипи');
    
    $oCon->SetIndent(1, 1);
    $oCon->PutLn('Два Миссисипи');
    
    $oCon->SetIndent(1, 1);
    $oCon->PutLn('Три Миссисипи');
    
    $oCon->SetIndent(0);
    $oCon->PutLn('Расчёт окончен.');
    
    COutput::End();


    В консоли отобразится следующее:

    6364bc13e871f684811920.jpeg

    В браузере будет вот что:

    6364bc328ffee749015782.jpeg

    В лог-файле "Logs\ГГГГ-ММ-ДД чч-мм-сс.txt" будет то же, что и в консоли (браузере).
  • Почему stream_context_create возвращает null?

    @GSV4 Автор вопроса
    Ипатьев, С помощью функции var_export.
    И, кстати, 2-й скрипт, который я вызываю из этого скрипта, тоже ничего не получает.
    В нем вызов
    json_decode(file_get_contents('php://input'))
    возвращает null.