2017-05-01 101 views
0

在我的heroku應用程序中,我有一項任務需要超過30秒才能執行,而且我不能增加執行時間,因爲heroku不會允許這樣做。 我從前端的API中獲取數據,然後使用AJAX將其發送到服務器以將此數據插入數據庫。服務器中的這個過程需要超過30秒才能完成,並且會給我一個超時錯誤。Heroku PHP後臺工作人員

我創建的Procfile如下: worker: cd ~/www/ && ~/php/bin/php worker.php

文件worker.php需要使用AJAX發送的數據,然後將其插入到數據庫中。

我啓用了工人在Heroku的儀表盤

我想實現的是,只有當我點擊一個按鈕,啓動Ajax調用啓動該工人。我不想使用heroku調度程序,因爲這個腳本只能在每個月運行一次,或者每當客戶想要添加新產品時運行。 另外,如果我使用調度程序,我不知道如何將數據從API發送到服務器。

如果這是不可能的,有沒有辦法強制heroku增加執行時間?

謝謝你

+0

...爲什麼你需要它作爲後臺工作,而實際上只執行它,當一個Ajax POST進來......就像虛擬主機怎麼是正常? –

+0

@Nick Li因爲整個應用程序凍結,直到數據庫插入完成。我認爲作爲後臺工作者,這不會發生 – Alfred

+0

我懷疑這是問題所在,即使插入了100k行,也不應該花30秒。它是超過30秒從單一的Ajax來執行,你的腳本的天平很可能證明有一個專用服務器來代替。除了插入數據之外,你還在使用腳本做什麼? –

回答

0

你需要的是優化你的SQL查詢來減少執行時間。

根據您的評論的描述,您嘗試執行的操作是「UPSERT」 - 更新現有的行或插入(如果不存在)。

嘗試谷歌sql upsert,你會發現更多的信息。注意:upsert可能意味着幾種不同的情況,每種情況都需要以不同的方式處理。 read this article which helped me much on sql upsert

其他考慮是,這使得插入更慢,因爲它重新索引爲每個插入如果未捆綁表降不必要的索引。如果您仍在開發中,那麼也適用於不必要的外鍵。

另一方面,在另一篇文章中,它通常說sql可以處理大約40k插入/分鐘,所以如果你插入超過15-20k,大約30s,你可能應該考慮一個私人服務器或者升級的heroku allow更多資源或執行時間可能適合您的需要。