<?php

error_reporting
(E_ERROR);

/**************************************************
 *               Н А С Т Р О Й К И                *
 **************************************************/

/* Хеш пользователя. */
$user_hash 'userhash';

/* Сервер базы данных. */
$db_host 'localhost';

/* Имя пользователя базы данных. */
$db_user 'root';

/* Пароль пользователя базы данных. */
$db_pass 'password';

/* Имя базы данных. */
$db_name 'dbname';

/*
 * Текст запроса к базе данных.
 *
 * Важно сохранить алиасы полей, так как они далее будут использоваться
 * в скрипте. Также запрос должен возвращать все поля, но значения этих
 * полей могут быть пустыми.
 *
 * Ниже приведен список необходимых полей и их значения.
 *
 * title            Название компонента.
 * category         Категория.
 * description      Описание компонента.
 * manufacture      Производитель (бренд).
 * prices           JSON строка (напр., [{"n":1,"c":"rur","p":10},{"n":10,"c":"rur","p":50}]);
 *                  "n" - кол-во (number);
 *                  "с" - валюта (currency);
 *                  "p" - цена (price).
 * mfgdate          Год производства (напр., 1997).
 * docs             Ссылка на документацию (напр., "http://mysite.ru/doc.pdf").
 * comp_url         Ссылка на страницу компонента (напр., "http://mysite.ru/comp.html").
 * stock            Если N=-1, то "скрыть склад";
 *                  если N>0, то это кол-во на складе;
 *                  если N=0, то позиция не складская.
 * stock_remote     Количество на удалённом складе;
 * delivery         Если N=-1, то "скрыть кол-во недель для поставки";
 *                  если N>0, то это кол-во недель для поставки;
 *                  если N=0, то позиция не на заказ.
 *
 * Пример файла выгрузки: https://einfo.ru/media/export_example.json
 */

$query_string '
    SELECT
      tbl.title AS title,
      tbl.category AS category,
      tbl.text AS description,
      brand.title AS manufacture,
      tbl.prices AS prices,
      "" AS mfgdate,
      tbl.pdf_remote AS docs,
      "" AS comp_url,
      tbl.stock AS stock,
      tbl.stock_remote AS stock_remote,
      -1 AS delivery
    FROM
      catalog_component AS tbl
      INNER JOIN catalog_brand AS brand ON tbl.brand_id = brand.id
'
;


// ****************************************************************************

/*
 * Проверка загруженности сервера
 */
sleep_overload(1.0);

/*
 * Подключение к базе данных
 */
$connection mysqli_connect($db_host$db_user$db_pass$db_name);

if (!
$connection)
{
    die(
'Ошибка подключения к базе данных: ' mysqli_connect_error());
}

mysqli_query($connection'SET NAMES utf8');


/*
 * Выполнение запроса к базе данных
 */
$query mysqli_query($connection$query_string);

if (!
$query)
{
    die(
'Ошибка запроса к базе данных: ' mysqli_error($connection));
}

$rows_count mysqli_num_rows($query);

/*
 * Формирование заголовка JSON файла
 */
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Cache-Control: private'false);
header('Content-Type: application/json');
header('Content-Disposition: attachment; filename=' $user_hash '.json');

/*
 * Обработка результатов запроса
 */
$_cnt 0;

while (
$row mysqli_fetch_assoc($query))
{
    
$_cnt++;

    if (
$_cnt 1000 == 0)
    {
        
sleep_overload(1.0);
    }

    if (
$_cnt $rows_count)
        echo 
json_encode($row) . PHP_EOL;
    else
        echo 
json_encode($row);
}

function 
sleep_overload($max_load 1.0)
{
    while(
true)
    {
        
$load sys_getloadavg();

        if (
$load[0] >= $max_load)
        {
            
sleep(1);
        }
        else
        {
            break;
        }
    }

    return 
true;
}