>  기사  >  백엔드 개발  >  PHP가 주문 지연 처리를 구현하는 방법에 대한 자세한 설명

PHP가 주문 지연 처리를 구현하는 방법에 대한 자세한 설명

韦小宝
韦小宝원래의
2017-12-30 16:12:221360검색

이 글에서는 주로 PHP를 사용하여 주문 지연 처리를 구현하는 방법에 대한 관련 정보를 PHP샘플 코드를 통해 자세히 소개합니다. 이 글은 누구나 PHP를 공부할 수 있는 확실한 참고 자료입니다. 혹은 일의 가치, 필요한 친구들은 편집자를 따라가서 함께 배워보세요.

비즈니스 요구 사항

주문은 일상적인 개발에서 자주 접하는 기능입니다. 최근 비즈니스를 하다 보면 고객이 주문을 하고 주문 시간이 초과된 후 자동 취소 기능을 구현해야 합니다. 아직 결제가 시작되지 않았습니다. 여러 가지 방법이 있습니다.

  • 고객이 해당 시점에 취소를 요청합니다

  • 서버에서 정기적으로 취소해야 할 주문이 있는지 확인한 후 처리합니다. 일괄

  • 주문 후 타이머를 만들어 처리를 지연

  • redis나 memcache 저장소를 활용하고, 만료 시간을 설정하고, 자동으로 삭제합니다.

위의 방법을 고려하여 첫 번째는 제거합니다. 첫째, 고객이 앱 백그라운드 또는 네트워크 연결을 비활성화하면 주문이 항상 처리되지 않은 상태로 유지되기 때문에 두 번째 방법이 더 일반적으로 사용되지만 정확성 문제가 있습니다. 그리고 예약된 작업의 기간을 확인해야 하므로 일시적으로 백업 방법으로 나열됩니다. 네 번째 방법의 문제점은 삭제가 물리적 삭제인 경우 처리되지 않은 데이터를 계산할 수 없다는 것입니다. Redis를 저장할 때 장기 저장을 위해 mysql과 같은 데이터베이스에 저장하고 일반 처리에는 방법 2를 사용합니다.

드디어 세 번째 방법을 사용할 준비가 되었습니다.

방법 3의 사용 확인 시 PHP가 사용하는 개발 언어로 인해 Swoole 또는 Workerman을 사용하여 타이머 기능을 구현해야 합니다. Swoole은 C로 개발된 확장 프레임워크이기 때문에 성능면에서는 확실히 더 좋기 때문에 Swoole을 선택했습니다.

준비

  • Swoole을 사용하려면 먼저 Swoole 확장 프로그램을 서버에 설치해야 합니다. 설치 방법은 다른 확장 프로그램 설치와 유사합니다.

  • 설치 후. , 확장 기능이 정상적으로 설치되었는지 확인하고, phpinfo 또는 PHP-m을 확인하여 Swoole이 나타나면 설치가 성공한 것입니다. 공식 Swoole 문서에는 타이머 관련 문서인 swoole_test가 있습니다. php 코드는 다음과 같습니다:

  • <?php
    swoole_timer_after(3000, function () {
     append_log(time());
     echo "after 3000ms.\n";
    });
    function append_log($str) {
     $dir = &#39;log.txt&#39;;
     $fh = fopen($dir, "a");
     fwrite($fh, $str."\n");
     fclose($fh);
    }

  • 그런 다음 웹 페이지에서 이 PHP 파일에 액세스하면 결과는 다음과 같습니다.

그런 다음 Linux 터미널에서 PHP를 실행합니다: /usr/local/ php7/bin/php /home/app/swoole_test.php 결과는 다음과 같습니다.

마음이 아프네요. . .

타이머는 cli 모드에서만 사용할 수 있다고 해서 이 아이디어는 아마 GG가 될 것 같은데요. 다른 방법은 없을까요? 눈물도 없이 울려고 할 때 갑자기 어떤 생각이 떠올랐고, 한 단어가 떠올랐습니다. 파이썬!

그렇습니다. PHP에만 의존할 수는 없습니다. Python과 같은 마법의 언어도 있습니다. Python의 os 모듈에 있는 os.system 메서드가 명령줄을 실행할 수 있으므로 cli 모드에서 구현할 수 있다는 것을 알고 있습니다. 지금 swoole_test.php 파일을 실행하셨나요?

신이 나서 테스트가 가능하다고 생각했습니다

Linux에는 Python이 포함되어 있지만 버전마다 Python 버전이 다른 경우도 있습니다. Python2.6이 너무 낮아서 더 높은 버전을 설치해야 합니다. 버전에서는 Python3을 선택합니다. 시스템과 함께 제공되는 Python2를 덮어쓰지 않도록 주의하세요. 다음은 대략적인 설치 단계입니다:

wget http://python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz


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 파일만 실행하며, 파일에 포함된 에코 내용은 터미널에 출력되지 않습니다. 이때 새로 생성된 log.txt 파일이 사용됩니다. Python 파일을 실행한 후 로그 파일을 확인해보니 해당 내용이 작성되어 있어 Python을 사용하여 PHP의 cli 모드를 구현할 수 있게 되었습니다. ┗|`O′|┛ 와~~


到这里就会有同学疑惑了,你这使用Python实现了PHP的cli模式,但是怎么通过web远程访问呢?这个时候就用到PHP的exec方法了,我们知道PHP的exec方法和Python的os.system方法一样是可以执行命令行命令的,所以我们可以新建一个test.php文件,内容如下:

<?php
$program="/usr/bin/python3 /home/app/nongyephp/test.py"; #注意使用绝对路径
echo "begin<br>";
(exec ($program));
echo "end<br>";
die;

然后我们通过网页访问test.php文件。结果如下:


然后去log文件检查,发现也写入日志了,所以这个方法是可行的!

做到这里心里美滋滋的,不过老觉得好像哪里不对,终于终于意识到一个很傻逼的问题:既然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文件。

结尾

测试通过后发现这种方法是可以创建定时器并且通过web远程使用的,不过有个问题,如果用和我上述一样用网页模拟会发现网页刷新是要等test.php执行完才会结束,也就是说如果我们把延时器的时间设成30分钟会要等待30分钟才会有反馈信息,这种方式肯定行不通的,所以需要使用异步访问,比如使用web的ajax技术和其他异步技术,这里不再赘述

尾巴

以上只是我想到解决问题的想法和实施步骤,到了真正开发可能不会选择这种方式,因为没有经过性能测试,而且对于进程控制和线程控制并没有多深入的了解,所以以后做订单自动取消还是会选择方法2的吧。
上述方法其实完全可以省掉Python那一步,我没有去掉的原因是把我的实现经历写出来,因为我觉得开发期间可能真的会遇到这种多此一举的方式,总之是要多思考,多看代码,找出能优化的方案,这里感觉自己差得很远,共勉吧

以上就是本篇文章的所有内容,希望对大家有所帮助!

相关推荐:

消息队列 - 有没有好的php延时队列

php函数的引用 php延时函数 php排序函

PHP关键字标红处理类

위 내용은 PHP가 주문 지연 처리를 구현하는 방법에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.