PHP реализует отложенную обработку заказов

PHP

Я действительно не ожидал, что эта очень водянистая статья моя собственная и некоторые милые друзья прочитают ее.Большое спасибо. По сути, эта статья - сцена, которую я случайно придумал, когда мне было нечего делать в последний день новогодних праздников, а потом пытался реализовать.На самом деле способов автоматической отмены заказа на сайте много. Интернет, в том числе друзья в области комментариев.Упомянутые нами запланированные задачи и очереди сообщений, это просто метод, о котором я подумал (я признаю, что это действительно очень водянистый). Спасибо друзьям в области комментариев за их восторженные предложения и учения, я также буду учиться под вашим руководством и в то же время продолжать учиться, еще раз спасибо ~ ღ( ´・ᴗ・` )Би Синь


Вот исходный текст:

Потребности бизнеса

Недавно, когда я занимался бизнесом, мне нужно было реализовать функцию автоматической отмены заказа после того, как клиент оформил заказ без оплаты, я просто начал подтверждать несколько способов:

  • Клиент вовремя запросит отмену
  • Сервер регулярно запрашивает, есть ли заказы, которые нужно отменить, а затем обрабатывает их пакетами.
  • Создайте таймер после размещения заказа, чтобы отложить обработку
  • использовать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Причина, по которой я не убрал этот шаг, - чтобы записать свой опыт реализации, потому что я думаю, что этот лишний способ может встретиться во время разработки. , я чувствую, что очень далеко отсюда, давайте делиться