搜尋
首頁後端開發php教程關於PHP實現訂單的延遲處理詳解

關於PHP實現訂單的延遲處理詳解

Jan 01, 2018 am 10:40 AM
php處理延時

本文主要為大家介紹了關於利用PHP如何實現訂單的延時處理的相關資料,文中透過範例程式碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。

業務需求

訂單是我們在日常開發中經常會遇到的一個功能,最近在做業務的時候需要實現客戶下單之後訂單超時未支付自動取消的功能,剛開始確認了幾種方法:

  • 客戶端到時間請求取消

  • #服務端定時查詢有沒有需要取消的訂單,然後批量處理

  • 下單後創建定時器,延時處理

  • 使用redis或memcache存儲,設定過期時間,自動刪除

綜合考慮上述方法,第一種最先排除,因為如果客戶把APP後台禁止或網路連線禁止,那麼就無法發給服務端請求,訂單就會一直是未處理狀態;第二種方法使用的比較多,不過存在準確度的問題,還有需要確認定時任務的周期,暫時列為後補方法;第四種方法存在的問題就是訂單如果刪除就是物理刪除,無法統計未處理資料(當然可以存redis時候順便存在mysql這樣的資料庫做長久存儲然後用方法二定時處理)。

最終準備使用方法三。

再確認使用方法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 = &#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了,難道就栽倒這裡了嗎,難道就沒有別的方法了嗎?就在我欲哭無淚的時候突然靈光乍現,一個字閃到我的腦海:Python!

對,我們不能單單靠著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文件,但是文件裡的echo內容是不會在終端輸出的,這時候就用到剛才新建的log.txt文件了。執行完Python檔案後,我們去log檔案檢查下,發現內容已經寫入,所以使用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那一步,我没有去掉的原因是把我的实现经历写出来,因为我觉得开发期间可能真的会遇到这种多此一举的方式,总之是要多思考,多看代码,找出能优化的方案,这里感觉自己差得很远,共勉吧

相关推荐:

实例详解vue仿淘宝订单状态的tab切换效果

Java多订单多支付方式分配金额问题的解决

PHP实现以支付宝为例的RSA签名生成订单功能

以上是關於PHP實現訂單的延遲處理詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
簡單地說明PHP會話的概念。簡單地說明PHP會話的概念。Apr 26, 2025 am 12:09 AM

phpsessionstrackuserdataacrossmultiplepagerequestsusingauniqueIdStoredInAcookie.here'showtomanageThemeffectionaly:1)startAsessionWithSessionWwithSession_start()和stordoredAtain $ _session.2)

您如何循環中存儲在PHP會話中的所有值?您如何循環中存儲在PHP會話中的所有值?Apr 26, 2025 am 12:06 AM

在PHP中,遍歷會話數據可以通過以下步驟實現:1.使用session_start()啟動會話。 2.通過foreach循環遍歷$_SESSION數組中的所有鍵值對。 3.處理複雜數據結構時,使用is_array()或is_object()函數,並用print_r()輸出詳細信息。 4.優化遍歷時,可採用分頁處理,避免一次性處理大量數據。這將幫助你在實際項目中更有效地管理和使用PHP會話數據。

說明如何使用會話進行用戶身份驗證。說明如何使用會話進行用戶身份驗證。Apr 26, 2025 am 12:04 AM

會話通過服務器端的狀態管理機制實現用戶認證。 1)會話創建並生成唯一ID,2)ID通過cookies傳遞,3)服務器存儲並通過ID訪問會話數據,4)實現用戶認證和狀態管理,提升應用安全性和用戶體驗。

舉一個如何在PHP會話中存儲用戶名的示例。舉一個如何在PHP會話中存儲用戶名的示例。Apr 26, 2025 am 12:03 AM

Tostoreauser'snameinaPHPsession,startthesessionwithsession_start(),thenassignthenameto$_SESSION['username'].1)Usesession_start()toinitializethesession.2)Assigntheuser'snameto$_SESSION['username'].Thisallowsyoutoaccessthenameacrossmultiplepages,enhanc

哪些常見問題會導致PHP會話失敗?哪些常見問題會導致PHP會話失敗?Apr 25, 2025 am 12:16 AM

PHPSession失效的原因包括配置錯誤、Cookie問題和Session過期。 1.配置錯誤:檢查並設置正確的session.save_path。 2.Cookie問題:確保Cookie設置正確。 3.Session過期:調整session.gc_maxlifetime值以延長會話時間。

您如何在PHP中調試與會話相關的問題?您如何在PHP中調試與會話相關的問題?Apr 25, 2025 am 12:12 AM

在PHP中調試會話問題的方法包括:1.檢查會話是否正確啟動;2.驗證會話ID的傳遞;3.檢查會話數據的存儲和讀取;4.查看服務器配置。通過輸出會話ID和數據、查看會話文件內容等方法,可以有效診斷和解決會話相關的問題。

如果session_start()被多次調用會發生什麼?如果session_start()被多次調用會發生什麼?Apr 25, 2025 am 12:06 AM

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

您如何在PHP中配置會話壽命?您如何在PHP中配置會話壽命?Apr 25, 2025 am 12:05 AM

在PHP中配置會話生命週期可以通過設置session.gc_maxlifetime和session.cookie_lifetime來實現。 1)session.gc_maxlifetime控制服務器端會話數據的存活時間,2)session.cookie_lifetime控制客戶端cookie的生命週期,設置為0時cookie在瀏覽器關閉時過期。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器