PHP 板


LINE

看板 PHP  RSS
※ 引述《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://webptt.com/m.aspx?n=bbs/PHP/M.1580844275.A.F02.html
1F:推 b90022790: 非常謝謝您的回文,讓我學到不少東西跟想法。目前已經 02/05 16:44
2F:→ b90022790: 確認是我真的忘了更改檔案寫入的權限XD,然後加一個&在 02/05 16:44
3F:→ b90022790: 指令的後面讓Linux在背景執行,這已經可以達成目的。 02/05 16:44
4F:→ b90022790: 其他您提到的方法,在未來我會努力將其實現到我的專案 02/05 16:46
5F:→ b90022790: 裡,希望能夠成為像您一樣有經驗、有想法的工程師,謝 02/05 16:46
6F:→ b90022790: 謝您! 02/05 16:46
7F:推 kancu: 我也建議把寄信的部份由另一支程式定期處理,用&來丟背景其 02/06 16:15
8F:→ kancu: 實是一件很恐佈的事情,如果寄信的那支php沒寫好,伺服器上 02/06 16:16
9F:→ kancu: 很有機會不斷的累積被強制丟在背景執行的寄信用程式,然後 02/06 16:17
10F:→ kancu: 等累積到一定程度,主機就當了 02/06 16:18
11F:→ kancu: 另一方面,這種丟背景的方式等於提供了一種資安攻擊的方法 02/06 16:20
12F:→ kancu: 只要不斷的在商店端一直丟完成的訊號,背景執行的程式就會 02/06 16:21
13F:→ kancu: 一直累積(因為你都說接gmail SMTP很慢,所以一定會累積), 02/06 16:22
14F:→ kancu: 然後主機就當掉了 02/06 16:22
15F:推 kancu: 用另一隻程式來跑還有可以簡單平行處理的優點,用OpenMP來 02/06 16:25
16F:→ kancu: 平行處理寄信的問題,即使累積很多要寄的資料也可以很快 02/06 16:26
修錯字... ※ 編輯: GALINE (60.248.122.206 臺灣), 02/07/2020 16:34:38
17F:→ JohnRoyer: 我記得原 PO 有 fork 到機器炸掉的記錄 XD 04/21 11:35
18F:→ JohnRoyer: Github 其實有一些不錯用的套來管理 fork /process 04/21 11:35
19F:→ JohnRoyer: 像是 neovim/neovim 感覺就還不錯用 04/21 11:36
20F:推 JohnRoyer: 抱歉貼錯了,這個才是處理 fork 的: 04/21 11:45
21F:→ JohnRoyer: github kriswallsmith/spork 04/21 11:45







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP