Re: [請益] 背景執行相關問題
※ 引述《b90022790 (PomeloLaLa)》之銘言:
: 各位php板上的各位前輩好!
: 目前在架設一個簡單的訂單系統,有個功能無法順利完成,希望前輩們能給些意見,謝謝
: 環境:php7.4.1、 MySQL、CentOS 6.8
: 功能:當商家按鈕確認訂單後,除了修改MySQL內容外,希望能夠寄mail通知客戶
: 問題:使用PHPMailer接gmail SMTP,然而速率過慢,商家的client端需要等待執行完畢
: 才能看到確認後的結果,希望能先讓商家看到結果,寄信的功能在伺服器背景執行。
: 試過的解決方式:先寫一個send.php專門處理寄信的功能,在商家client的頁面直接顯示
: 確認訂單後的結果畫面,並在商家該php頁面使用system()執行send.php,程式碼如下:
: system("php send.php user"); //user為收信者參數
: 然而這仍然會等待執行完才會回responce。
: 使用「php 背景執行 超時」當關鍵字,採用將結果輸出到.out,改system()程式碼如下:
: system("php send.php user > MAIL.out");
: 然而這樣卻變成連寄信都沒有執行就結束了。
: 希望前輩們能給一些如何處理該功能的意見,以及為何該system()無法正常執行
: 謝謝各位前輩!還請各位指點!!
php send.php user > MAIL.out
只會把 send.php 的輸出(stdout)寫進 MAIL.out,沒有非同步執行的效果
結果會不一樣,也許是 wwwuser 沒有資料夾寫入權限,所以指令直接噴掉
要非同步執行東西,直覺是 pcntl_fork()
$pid = pcntl_fork();
if ($pid === 0) {
// 我是 fork 出來的 process,不會卡住娘親 process 執行
// 在這裡寄信
system("php send.php user");
exit; // 寄完信就 exit,不然會一路執行到網頁內容整個印出來
}
// 我是原本的 process,或是 fork 失敗
// 繼續做網頁該做的事情
缺點是不熟的人容易不小心寫出驚人的 bug
像是不小心 fork 了一萬個 process 然後整台機器被 process 噎死
這算是妖術,土炮或是很小的東西可以這麼幹
如果工作上有人對網頁服務發這樣的 MR 給我 review,我會熱烈地給予關切
推薦做法是,不要在網頁裡面直接處理這件事
把你要寄信的資料先記錄在某個地方,檔案也好 DB 也好。
然後跑一隻其他的程式在後面等著,或是設定 cron job 定時去讀
看到有資料的時候依序寄信然後把資料清空,如果沒有新資料就回去睡覺
更上道的做法,是去研究 message queue / job queue
============
另,如果想用 PHP 寫 cli 指令,有個小地方可以參考
像這樣透過第一行的 hashbang 告訴 shell 要呼叫 php 來執行這隻程式
#!/usr/bin/env php
<?php
echo "I am a command\n";
然後把這隻 php 設定為可執行檔案
$ chmod +x command.php
就可以把這隻 code 當成 shell script 來跑了
$ ./command.php
I am a command
--
無重力,萬歲
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.254.20.150 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1580844275.A.F02.html
推
02/05 16:44,
4年前
, 1F
02/05 16:44, 1F
→
02/05 16:44,
4年前
, 2F
02/05 16:44, 2F
→
02/05 16:44,
4年前
, 3F
02/05 16:44, 3F
→
02/05 16:46,
4年前
, 4F
02/05 16:46, 4F
→
02/05 16:46,
4年前
, 5F
02/05 16:46, 5F
→
02/05 16:46,
4年前
, 6F
02/05 16:46, 6F
推
02/06 16:15,
4年前
, 7F
02/06 16:15, 7F
→
02/06 16:16,
4年前
, 8F
02/06 16:16, 8F
→
02/06 16:17,
4年前
, 9F
02/06 16:17, 9F
→
02/06 16:18,
4年前
, 10F
02/06 16:18, 10F
→
02/06 16:20,
4年前
, 11F
02/06 16:20, 11F
→
02/06 16:21,
4年前
, 12F
02/06 16:21, 12F
→
02/06 16:22,
4年前
, 13F
02/06 16:22, 13F
→
02/06 16:22,
4年前
, 14F
02/06 16:22, 14F
推
02/06 16:25,
4年前
, 15F
02/06 16:25, 15F
→
02/06 16:26,
4年前
, 16F
02/06 16:26, 16F
修錯字...
※ 編輯: GALINE (60.248.122.206 臺灣), 02/07/2020 16:34:38
→
04/21 11:35,
4年前
, 17F
04/21 11:35, 17F
→
04/21 11:35,
4年前
, 18F
04/21 11:35, 18F
→
04/21 11:36,
4年前
, 19F
04/21 11:36, 19F
推
04/21 11:45,
4年前
, 20F
04/21 11:45, 20F
→
04/21 11:45,
4年前
, 21F
04/21 11:45, 21F
討論串 (同標題文章)
PHP 近期熱門文章
PTT數位生活區 即時熱門文章