이 글에서는 주로 PHP를 사용하여 주문 지연 처리를 구현하는 방법에 대한 관련 정보를 샘플 코드를 통해 자세히 소개합니다. 이 글은 공부나 업무에 필요한 모든 사람에게 유용한 참고 학습 가치를 제공합니다. 아래에서 함께 배워봅시다.
비즈니스 요구 사항
주문은 일상적인 개발에서 자주 접하는 기능입니다. 최근 비즈니스를 하다 보면 주문 시간이 초과되어 결제가 이루어지지 않은 후 고객이 주문을 하면 자동 취소 기능을 구현해야 합니다. 몇 가지 방법을 방금 확인했습니다.
고객이 해당 시점에 취소를 요청합니다
서버에서 정기적으로 취소해야 할 주문이 있는지 확인하여 일괄 처리합니다
주문 후 타이머 및 처리 지연
redis 또는 Memcache 저장소 사용, 만료 시간 설정, 자동 삭제
위 방법을 고려하면 첫 번째 항목이 먼저 제거됩니다. 고객이 APP 배경을 비활성화하거나 네트워크에 연결되면 요청을 서버로 보낼 수 없고 주문이 그대로 유지됩니다. 처리되지 않은 상태입니다. 두 번째 방법이 더 자주 사용되지만 정확성 문제가 있고 예약된 작업 기간을 확인해야 합니다. 그래서 일시적으로 백업 방법으로 나열되는데, 네 번째 방법의 문제점은 주문이 삭제되면 물리적으로 삭제되고, 처리되지 않은 데이터는 셀 수 없다는 점이다(물론 mysql과 같은 데이터베이스에 오랫동안 저장할 수는 있다). -redis를 저장할 때 임시 저장하고 일반 처리에는 방법 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 파일에 액세스하면 결과는 다음과 같습니다.
그런 다음 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 모드를 구현했는데, 웹을 통해 원격으로 어떻게 접속하나요? 이때 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!