簡體   English   中英

異步過程似乎不適用於我的prod環境

[英]Asynchronous Process doesn't seem to work on my prod environment

我目前正在開發一個相當復雜的PHP5 / Symfony 2.8項目。 在這個項目中,我有一個命令,可以通過Crontab調用,在控制台中手動調用,或者使用網站上的按鈕,用於調用外部站點上的Web服務,這給我一個xml文件,我管理使用SimpleXML導入我的數據庫。

該命令在我的本地開發環境中就像一個魅力,無論它如何調用。

但由於未知原因(這就是我在這里發布的原因),在我的int或prod環境中,它們位於外部服務器上,從站點上的按鈕調用命令不起作用。

我的按鈕正在觸發此操作:

$process = new Process('php '.$kernelRootDir.'/console my:super:command');
$process->start(); 

由於命令有點沉重,我無法等待命令完成,這就是為什么我使用process-> start而不是run。 我不需要它的日志,所以它很好,它只是啟動命令並讓它運行,而用戶可以在另一頁上。

而且,這在我的本地環境(debian 7 VM)上運行良好,但在遠程服務器上卻不行(不確定它在使用什么)。 但是,如果我通過控制台手動啟動命令或讓crontab調用它,它會完美運行直到結束。 這只是通過我的控制器通過不起作用的進程觸發它。

從昨天開始,這讓我的頭發脫落了,但是我無法弄清楚為什么這個命令甚至沒有從生產環境開始..任何提示?

更新:嘗試使我的命令只轉儲一個小的“它工作”消息,並使用wait()和getOutput()方法在我的控制器中獲取結果。 在我的本地環境中,我立即從控制器使用dump / die組合得到了我的消息。 在遠程服務器上,我的命令觸發ProcessTimedOutException:進程超過60秒超時。

因此,Process無法啟動自定義命令確實存在問題,盡管該命令在控制台上手動調用時仍然有效。

好吧,經過兩天的掙扎,我發現遠程服務器可能對此負責,似乎如果我不等待進程回答,那個進程就會被立即殺死。 我不知道為什么,我不知道怎么樣,但似乎是這樣。

所以我開始尋找一種不使用Process的替代解決方案。 我找到了一些東西。 我可以使用php exec()方法通過這樣做來啟動異步調用:

exec('php '.$kernelRootDir.'/console my:super:command > /dev/null &');
//Apparently, using "&" launch the command asynchronously. 

到目前為止,我的所有測試都在我的生產服務器上運行,所以我會保留它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM