第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會有你想問的

如何在后臺執(zhí)行長任務(wù)?

如何在后臺執(zhí)行長任務(wù)?

PHP
嚕嚕噠 2022-09-12 10:10:36
我有一個(gè)使用Symfony 5制作的應(yīng)用程序,我有一個(gè)腳本,可以將服務(wù)器上的視頻上傳到登錄的用戶頻道。這基本上是我的控制器的代碼:    /**     * Upload a video to YouTube.     *     * @Route("/upload_youtube/{id}", name="api_admin_video_upload_youtube", methods={"POST"}, requirements={"id" = "\d+"})     */    public function upload_youtube(int $id, Request $request, VideoRepository $repository, \Google_Client $googleClient): JsonResponse    {        $video = $repository->find($id);        if (!$video) {            return $this->json([], Response::HTTP_NOT_FOUND);        }        $data = json_decode(            $request->getContent(),            true        );        $googleClient->setRedirectUri($_SERVER['CLIENT_URL'] . '/admin/videos/youtube');        $googleClient->fetchAccessTokenWithAuthCode($data['code']);        $videoPath = $this->getParameter('videos_directory') . '/' . $video->getFilename();        $service = new \Google_Service_YouTube($googleClient);        $ytVideo = new \Google_Service_YouTube_Video();        $ytVideoSnippet = new \Google_Service_YouTube_VideoSnippet();        $ytVideoSnippet->setTitle($video->getTitle());        $ytVideo->setSnippet($ytVideoSnippet);        $ytVideoStatus = new \Google_Service_YouTube_VideoStatus();        $ytVideoStatus->setPrivacyStatus('private');        $ytVideo->setStatus($ytVideoStatus);        $chunkSizeBytes = 1 * 1024 * 1024;        $googleClient->setDefer(true);        $insertRequest = $service->videos->insert(            'snippet,status',            $ytVideo        );       這基本上是有效的,但問題是視頻可能非常大(10G +),所以它需要很長時(shí)間,基本上Nginx在結(jié)束之前終止,并在上傳完成之前返回“504網(wǎng)關(guān)超時(shí)”。無論如何,我不希望用戶在上傳頁面時(shí)必須等待頁面加載。因此,我正在尋找一種方法,而不僅僅是立即運(yùn)行該腳本,而是在某種后臺線程中或以異步方式執(zhí)行該腳本。控制器向用戶返回a,我可以告訴他正在上傳,稍后再回來檢查進(jìn)度。200如何做到這一點(diǎn)?
查看完整描述

1 回答

?
慕俠2389804

TA貢獻(xiàn)1719條經(jīng)驗(yàn) 獲得超6個(gè)贊

有很多方法可以做到這一點(diǎn),但你基本上想要的是解耦動(dòng)作觸發(fā)器及其執(zhí)行。

只是:

  • 從控制器中刪除所有繁重的工作。您的控制器最多只應(yīng)檢查客戶端提供的視頻 ID 是否存在于 .VideoRepository

  • 存在?很好,那么您需要將此“工作訂單”存儲在某個(gè)地方。

    有許多解決方案,具體取決于您已經(jīng)安裝的內(nèi)容,您感覺更舒適的技術(shù)等。

    為了簡單起見,假設(shè)您有一張帶有 、 和 的表,也許還有 。因此,您的控制器唯一要做的就是在此表中創(chuàng)建一個(gè)新記錄(也許檢查作業(yè)是否尚未“排隊(duì)”,這種詳細(xì)信息取決于您的實(shí)現(xiàn))。PendingUploadsvideoIdstatuscreatedAtuserId

  • 然后返回(或 ,在這種情況下可能更合適200202)

然后,您需要編寫一個(gè)單獨(dú)的進(jìn)程。

很可能是您定期執(zhí)行的控制臺命令(使用最簡單的方法)cron

在每次執(zhí)行時(shí),該進(jìn)程(將具有所有邏輯,并且可能還有一個(gè))將檢查哪些作業(yè)正在等待上傳,按順序處理它們,并設(shè)置為您表示要完成的任何內(nèi)容。例如,您可能必須(掛起)、(處理)和(已處理),并在腳本的每個(gè)步驟上相應(yīng)地設(shè)置狀態(tài)。Google_ClientPendingUploadsRepositorystatusstatus012

具體實(shí)現(xiàn)此目的的詳細(xì)信息取決于您。這個(gè)問題過于寬泛和固執(zhí)己見。選擇一些你已經(jīng)理解的東西,讓你移動(dòng)得更快。如果要將作業(yè)存儲在 Rabbit、Redis、數(shù)據(jù)庫或平面文件中,則不是特別重要。如果以 或 開頭的“使用者”。cronsupervisor

Symfony有一個(gè)現(xiàn)成的組件,可以讓你異步解耦這種消息傳遞(Symfony信使),這很不錯(cuò)。調(diào)查它是否是你的一杯茶,盡管如果你不打算在你的應(yīng)用程序中將其用于其他任何事情,我會讓它變得簡單。


查看完整回答
反對 回復(fù) 2022-09-12
  • 1 回答
  • 0 關(guān)注
  • 94 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號