Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6

PHP (Обработка заказов в реалтайме)

28.04.2018, 01:05. Показов 1128. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую коллеги!
Нужен совет на тему мониторинга заказов (ордеров) в реалтайме.

1. Есть китайский конструктор (коммерческая CMS) она делится на три версии, у нас самая базовая (в районе 3,5K $/год).
Цену указал что бы понять масштабы бедствия, а ful версия в районе 10 000 $ можно было бы плюнуть и купить дешевле, российский аналог, но в CMS-ку интегрирован WeChat (важное условие).

Так вот эта базовая версия не позволяет идентифицировать, откуда был продан товар , подразумевается торговля из приложения WeChat.

Но вопрос не про саму CMS и WeChat.

Задача следующая в этой CMS формируются заказы, заказы имеют естественно статусы (ожидает оплаты, оплачен ожидает доставки и т.д)

Планируется СМС уведомление поставщика, именно поставщика о том что китаец купил товар через WeChat.


На сколько правильно каждые 5 - 10 сек опрашивать API магазина на предмет новых заказов?
И правильно ли вообще такое делать так часто?
Дело в том что все заказы будут зеркалиться в отдельную MySQL базу данных, даля дальнейшей обработки.


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


Зачем дополнительная база данных?
В дополнительно базе данных будет дополнительная информация, номера поставщиков и т.д. и т.п. )))
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.04.2018, 01:05
Ответы с готовыми решениями:

Страница с формами редактирования заказов + постраничный вывод = пустышки, если кол. заказов < заказов на стр.
Добрый день. Есть у меня страничка обновления заказов с вот таким кодом &lt;? /* Соединяемся с базой данных */ /* Таблица...

Внешняя Обработка Печати Заказов на перемещение
Создал форму обработки , есть код для обработки но без синтаксических ошибок . Но 1с упрямо отказывается заполнять табличную часть ...

Внешняя обработка. Загрузка данных для создания заказов из CSV в 1С 8.3
Здравствуйте. Я новичок в 1С. Нужно создать обработку, которая будет формировать заказы клиента из файла CSV. На просторах интернета...

7
 Аватар для atanov
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
28.04.2018, 06:15
popryduhin, а как новый заказ попадёт в бд, точнее какой скрипт, по какому условию туды заказ направит?
0
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
28.04.2018, 13:28  [ТС]
atanov

synchronization_orders.php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php 
 
    include("../api/0.2/wxrrd-api.php");
    include("../api/classes/mysql.class.php"); // Класс для работы с базой данных
    include("../api/0.2/errors.api.php");
 
 
 
 
 
    $db = new SafeMySQL(); 
 
    $table = 'Orders';
    $r = CallAPI('weiba.wxrrd.trade.lists','&type=tosend&limit=100');
 
    echo json_encode($r, 1);
 
    if (is_array($r)) {
        $errors = array(apis_error($r));
 
        foreach($errors as $errors_item){
            $error_code = $errors_item['ErrorCode'];
            $error_msg  = $errors_item['ErrorMsg'];
        }
        $db->query("INSERT INTO `Deamon_log` (`error_code`, `error_msg`) VALUES (?i, ?s);",$error_code, $error_msg );
    } else
    {
        $db->query("INSERT INTO `Deamon_log` (`response`) VALUES ('Китайский сервер не ответил!');");
    }
 
 
 
    sleep(2);
    if (is_array($r))
    foreach($r as $items){
        if(is_array($items)){
            foreach($items as $item){
                $order_sn        = $item['order_sn'];
                $orders_details  = CallAPI('weiba.wxrrd.trade.details',"&order_sn=$order_sn");
 
                foreach($orders_details as $od_items){
                    if(is_array($od_items)){
                    $id              = $item['id'];         // Идентификатор записи
                    $nickname        = $od_items['nickname'];           //  Имя покупателя
                    $order_type      = $od_items['order_type'];         // Тип ордера
                    $amount          = $od_items['goods_amount'];       // Сумма
                    $payment_name    = $od_items['payment_name'];       // Наименование платежной системмы 
                    $status_msg      = $od_items['status_msg'];
                    $status          = $od_items['status'];
                    $created_at      = $od_items['created_at'];
                    $updated_at      = $od_items['updated_at'];
 
                    $comma = ',';
                    $products_sn = '';
                    $goods_name = '';
                    $counter = 0;
                    foreach($od_items['order_goods'] as $goods_item){
                        if (is_array($goods_item)) {
                            $counter++;
                            if (count($od_items['order_goods']) == $counter) {
                                $comma = '';
                            }
                            $products_sn = $products_sn . $goods_item['product_sn'] . $comma;
                            $goods_name = $goods_name . $goods_item['goods_name'] . $comma;
                        }
                    }
                    $data_to_send = '';
                    $data_to_send = 'Оплата выполнена!' . PHP_EOL;
                    $data_to_send = $data_to_send . 'Продукт: ' . $goods_name . PHP_EOL;
                    $data_to_send = $data_to_send . 'Сумма: ' . $amount;
 
                    $data = $db->query("INSERT IGNORE INTO ?n (`id`, `nickname`, `order_sn`, `order_type`, `amount`, `payment_name`, `status_msg`, `status`, `created_at`, `updated_at`, `goodslist`, `data_to_send`) VALUES (
                    ?i, 
                    ?s, 
                    ?s, 
                    ?i, 
                    ?s, 
                    ?s, 
                    ?s, 
                    ?i,
                    ?s, 
                    ?s,
                    ?s,
                    ?s
                    );",
                    $table,             // Таблица
 
                    // ЗНАЧЕНИЯ ПОЛЕЙ
                    $id,                // Идентификатор записи в текуще базе
                    $nickname,          // Ник пользователя создавший транзакцию
                    $order_sn,          // Номер заказа
                    $order_type,        // Тип заказа
                    $amount,            // Сумма
                    $payment_name,      // Наименование платежной системмы
                    $status_msg,        // Статус сообщение
                    $status,            // Статус транзакции
                    $created_at,        // Время создания заказа
                    $updated_at,        // Время последненго изменения статуса заказа
                    $products_sn,
                    $data_to_send       // Данные уведомления!
                                       );//SELECT * FROM ?n WHERE mod=?s LIMIT ?i
                    }
                }
                sleep(3);
            }
        }
    }
 
 
 
 
 
?>
Добавлено через 3 минуты
И собственно простейший демон для анализа, уже зеркальной базы

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<?php
 
 
 
include("../api/classes/mysql.class.php"); // Класс для работы с базой данных
include('smsc_api.php');
 
$stop = false;
/**
 * pcntl_fork() - данная функция разветвляет текущий процесс
 */
 
$pid = pcntl_fork();
 
if ($pid == -1) {
    
    
    /**
     * Не получилось сделать форк процесса, о чем сообщим в консоль
     */
    die('Не удалось породить дочерний процесс');
} else if ($pid) {
    /**
     * В эту ветку зайдет только родительский процесс, который мы убиваем и сообщаем об этом в консоль
     */
    // Запрет повторного запуска скрипта в данной директории
    
    die('Уничтожаю родительский процесс' . PHP_EOL);
} else {
    
    /**
 * Установим дочерний процесс основным, это необходимо для создания процессов
 */
$lockfile = fopen("lock", 'w');
    if (flock($lockfile, LOCK_EX | LOCK_NB ) !== true){
        die('Процесс уже работает...');
    }   
posix_setsid();
    /**
     * Бесконечный цикл
     */
    
 
    
    $db = new SafeMySQL(); 
 
    $db->query( "INSERT INTO `Deamon_pids` (`pid`, `time_stamp`) VALUES ('$pid', '');" );
 
    while(!$stop) {
        /*
         * Тело демона
         */
        
        $data = $db->getAll( "SELECT * FROM `Orders` WHERE `status` = 30 LIMIT 100" );
        
        // Проверяем массив и количество, дабы зря не бегать по коду
        if (is_array($data)) {
            if (count($data) == 0) {
                sleep(3);
                continue;
            }
        }
        
        foreach($data as $item) {
            $goods_id       = $item['goodslist'];
            $data_to_send   = $item['data_to_send'];
            $key            = $item['key'];
            
            $suppliers = $db->getAll( "SELECT * FROM `Suppliers` WHERE `suppliers_id` IN (SELECT `s_id` FROM `Goods` WHERE `goods_id` = $goods_id);" );
            
            if (is_array($suppliers)){
                foreach($suppliers as $s_item) {
                    /*Здесь происходит отправка смс уведомлений*/  
                    $sms_result = send_sms($s_item['phone'], $data_to_send ); 
                    $suppliers = $db->query( "UPDATE `Orders` SET `status`='31' WHERE  `key`= $key " );
                }
            }
            
        }
        
        sleep(3);
    }
}
 
 
 
?>
Планирую переделать его, под более сложный и максимально устойчивый (Этот демон бредовый)

Добавлено через 3 минуты
На сколько вообще правильно выполнять частые запрос по API на сервер?
0
 Аватар для atanov
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
28.04.2018, 14:18
popryduhin, дык может быть если запрос на добавление нового ордера вернёт true, то скрипт, который вносит новый заказ и будет отправлять уведомление, простейшее это email, а так можно поэкспериментировать с различными вариантами listen.
0
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
28.04.2018, 15:20  [ТС]
Цитата Сообщение от atanov Посмотреть сообщение
дык может быть если запрос на добавление нового ордера вернёт true, то скрипт, который вносит новый заказ и будет отправлять уведомление, простейшее это email, а так можно поэкспериментировать с различными вариантами listen.
Дело в том, что изменять статус заказа в самом конструкторе пока не нужно, а только послать уведомление о совершении покупки.

Исходя из этого напрямую без зеркальной базы не получится.

Хотя есть вариант, каждую новую транзакцию (её уникальный номер) записывать в базу и проверять, если она существует то не отправлять уведомление.
0
 Аватар для atanov
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
28.04.2018, 15:42
Ну вот, это одно из решений
0
30 / 26 / 8
Регистрация: 17.09.2015
Сообщений: 498
Записей в блоге: 6
28.04.2018, 19:01  [ТС]
Но это все понятно мне, собственно сам вопрос заключается в криминале частых запросов к API.

Если API позволяют каждые 5-10 сек. проверять заказы, есть ли криминал в частых запросах API.

Я был на конференции в этой компании и один очень скептически настроенный программист выступил против такого опроса, ссылаясь на то что так некто не делает, но при этом не привел не каких аргументов
На фоне этих высказываний я и засомневался в правильности этого метода.
0
 Аватар для atanov
640 / 481 / 172
Регистрация: 26.05.2016
Сообщений: 2,674
28.04.2018, 20:21
popryduhin, Вы же сами прекрасно понимаете, что чем больше запросов, тем больше нагрузка на сеть/передающие устройства/обработка и т.д. Пессимист интуитивно Вам так и ответил, а причину не сформулировал, т.к. как бы нет причин - современные сети выдерживают потоки намного превышающие те, которые были лет пять назад. Однако очень многие api занимаются опросами всего и вся, их разработчикам в общем-то все равно, нагрузится система. Так что решайте сами, но вариант с отправкой подтверждения при условии действия с результатом true, даже интуитивно, выглядит привлекательнее
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.04.2018, 20:21
Помогаю со студенческими работами здесь

стол заказов на php+mysql
Задача такая: нужно сделать такую штуку не знаю как назвать... В общем нужно сделать место жизни для менеджеров каждый менеджер...

php сброс данных формы заказов
Добрый день. Возникла проблема с формой заказа: при неправильно заполненном хоть одном поле, все что раньше заказчик заполняет -...

Нужна база данных в access на тему "обработка заказов web- студии"
Ребят помощь нужна ваша, нужна база данных в access на тему &quot;обработка заказов web- студии&quot;. Может у кого что есть? Безумно благодарен...

выбор в реалтайме (checkbox)
появилась потребность в том, чтобы можно было выбирать несколько значений, и они обрабатывались в настроящем времени, к примеру есть 5 тем...

выбор в реалтайме (checkbox)
появилась потребность в том, чтобы можно было выбирать несколько значений, и они обрабатывались в настроящем времени, к примеру есть 5 тем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru