Я действительно не ожидал, что эта очень водянистая статья моя собственная и некоторые милые друзья прочитают ее.Большое спасибо. По сути, эта статья - сцена, которую я случайно придумал, когда мне было нечего делать в последний день новогодних праздников, а потом пытался реализовать.На самом деле способов автоматической отмены заказа на сайте много. Интернет, в том числе друзья в области комментариев.Упомянутые нами запланированные задачи и очереди сообщений, это просто метод, о котором я подумал (я признаю, что это действительно очень водянистый). Спасибо друзьям в области комментариев за их восторженные предложения и учения, я также буду учиться под вашим руководством и в то же время продолжать учиться, еще раз спасибо ~ ღ( ´・ᴗ・` )Би Синь
Вот исходный текст:
Потребности бизнеса
Недавно, когда я занимался бизнесом, мне нужно было реализовать функцию автоматической отмены заказа после того, как клиент оформил заказ без оплаты, я просто начал подтверждать несколько способов:
- Клиент вовремя запросит отмену
- Сервер регулярно запрашивает, есть ли заказы, которые нужно отменить, а затем обрабатывает их пакетами.
- Создайте таймер после размещения заказа, чтобы отложить обработку
- использовать
redis
илиmemcache
Хранение, установка срока действия, автоматическое удаление
Учитывая вышеперечисленные способы, первым исключается первый способ, так как если клиент отключит фон APP или сетевое подключение, то запрос не может быть отправлен на сервер, а заказ всегда будет в необработанном состоянии, используется второй способ чаще, но есть проблема с точностью, и есть необходимость подтверждения периода запланированного задания, которое временно указано как резервный метод, проблема с четвертым способом заключается в том, что при удалении заказа, он физически удаляется, а необработанные данные не могут быть сосчитаны (конечно, они могут храниться в редис-тайм. Кстати, есть такая база данных, как mysql для долговременного хранения, а затем использовать метод 2 для обычной обработки).
Наконец готов использовать третий метод.
При повторном подтверждении использования метода 3 из-за языка разработки, используемого в PHP, функцию таймера необходимо реализовать с помощьюSwoole
илиworkerman
. так какSwoole
даC
Разработанный фреймворк расширения однозначно лучше с точки зрения производительности, поэтому я выбрал его.Swoole
.
Предварительная подготовка
- Чтобы использовать Swoole, сначала необходимо установить его на сервер.
Swoole
Расширение, способ установки аналогичен установке других расширений, вы можете обратиться кстатья здесь - После установки проверьте, нормально ли установлено расширение, проверьте
phpinfo
илиPHP-m
, если естьSwoole
, установка прошла успешно -
Swoole
В официальном документе есть таймерСвязанная документация
начать тестирование
мы создаемswoole_test.php
файл иlog.txt
файл (для тестирования),swoole_test.php
код показывает, как показано ниже:
<?php
swoole_timer_after(3000, function () {
append_log(time());
echo "after 3000ms.\n";
});
function append_log($str) {
$dir = 'log.txt';
$fh = fopen($dir, "a");
fwrite($fh, $str."\n");
fclose($fh);
}
Затем откройте этот файл PHP на веб-странице, и результат будет следующим:
Затем запустите PHP в терминале Linux:/usr/local/php7/bin/php /home/app/swoole_test.php
, результат следующий:
Сердце на время. . .
Оказывается, таймер может быть толькоcli
В моде то эта идея боится ГГ, это здесь внизу, по другому никак? Только я собирался заплакать без слез, как вдруг явилось прозрение, и в моей голове мелькнуло слово:Python
!
Да, мы не можем просто полагаться наPHP
рукаPython
Что насчет этого волшебного языка, мы знаемPython
изos
в модулеos.system
Метод может выполняться из командной строки, тогда его можно реализовать вcli
запустить в режиме только сейчасswoole_test.php
файл.
Через некоторое время волнения я чувствую, что испытание выполнимо
мы знаемLinux
принести свои собственныеPython
, но разные версииPython
Различные версии, некоторые поставляются сPython2.6
, версия слишком низкая, поэтому вам нужно установить более высокую версию, здесь я выбираюPython3
, будьте осторожны, чтобы не перезаписать собственныйPython2
. Вот примерные шаги установки:
- wget Python.org/FTP/Python/…
- tar xf Python-3.6.0.tar.xz
- cd Python-3.6.0
- ./configure --prefix=/usr/local/python3
- make && make install
- ln -s /usr/local/python3/bin/python3 /usr/bin/python3
Затем введите в терминале:Python3
, если появится
Установка прошла успешно.
установленPython3
После этого создаем новыйtest.py
файл со следующим содержимым:
#!usr/bin/env python3`
#-*- coding:utf-8 -*-
import os
ret = os.system("/usr/local/php7/bin/php /home/app/swoole_test.php") #请使用自己系统的绝对路径
print(ret)
Затем выполняем в терминале:/usr/bin/python3 /home/app/test.py
, примечание: здесь только реализацияPHP
файл, ноecho
Контент не будет выводиться в терминал, а будет использоваться только что созданный.log.txt
файл. законченныйPython
После файла идем в лог-файл для проверки и обнаруживаем, что содержимое было записано, поэтому используемPython
достижимоPHP
изcli
шаблон. ┗|`O′|┛
ой~~
В этот момент некоторые студенты будут сбиты с толку, вы используетеPython
ДостигнутоPHP
изcli
режим, но как получить к нему доступ удаленно через Интернет? На этот раз используйте PHPexec
метод, мы знаем PHPexec
методы и Pythonos.system
Тот же метод может выполнять команды командной строки, поэтому мы можем создать новыйtest.php
файл со следующим содержимым:
<?php
$program="/usr/bin/python3 /home/app/nongyephp/test.py"; #注意使用绝对路径
echo "begin<br>";
(exec ($program));
echo "end<br>";
die;
Затем мы получаем доступ через Интернетtest.php
документ. Результат выглядит следующим образом:
Затем перейдите к файлу журнала, чтобы проверить и обнаружить, что журнал также пишется, поэтому этот метод осуществим!
Я очень рад быть здесь, но я всегда чувствую, что что-то не так, и, наконец, я наконец осознаю очень глупый вопрос:теперь, когдаPHP
У вас могут быть функции командной строки напрямую, зачем вам это нужно?Python
затем используяPython
функция?Разве не нужно снимать штаны и пердеть?
Поругав себя за то, что я дурак N раз, я молча модифицировал егоtest.php
содержание документа:
<?php
echo "begin<br>";
$program="/usr/local/php7/bin/php /home/app/nongyephp/swoole_test.php"; #注意使用绝对路径
(exec ($program));
echo "end<br>";
die;
в прямом доступеtest.php
документы, результаты обратной связи и помощьPython
то же самое, чтобы избежатьPython
На этом шаге напрямую используйтеPHP
изexec
функция для выполненияPHP
документ.
конец
После прохождения теста было обнаружено, что этот метод может создать таймер и использовать его удаленно через Интернет, но есть проблема.Если вы используете симуляцию веб-страницы, как я сделал выше, вы обнаружите, что обновление веб-страницы ждать.test.php
Это закончится после выполнения, то есть, если мы установим время задержки на 30 минут, нам придется ждать 30 минут для получения информации об обратной связи.Этот метод точно не будет работать, поэтому нам нужно использовать асинхронный доступ, например, с помощью сетьajax
технология и другие асинхронные технологии, которые здесь повторяться не будут
Хвостик
- Вышеупомянутое только мои идеи и этапы реализации для решения проблемы, я не могу выбрать этот метод в реальной разработке, потому что он не тестировался на производительность, и у меня нет глубокого понимания управления процессами и управления потоками. , так что в дальнейшем все же лучше отменить заказ автоматически.Я выберу способ 2.
- На самом деле вышеописанный способ может полностью спасти
Python
Причина, по которой я не убрал этот шаг, - чтобы записать свой опыт реализации, потому что я думаю, что этот лишний способ может встретиться во время разработки. , я чувствую, что очень далеко отсюда, давайте делиться