2017-08-01 163 views
0

我正在使用棘輪包創建聊天應用程序。 如何在Shared Hosting上運行命令「chat:serve」?我需要運行沒有控制檯線的命令。 我嘗試這樣做:Laravel:在後臺運行自定義工匠命令

Artisan::call('chat:serve'); 

或本:

$serve = new WSChatServer(); 
$serve->fire(); 

,但它不工作。網頁永不停止加載。 我需要在後臺運行這個Artisan命令,它應該一直運行。我該怎麼做?沒有VPS託管可以做到這一點嗎?

<?php namespace App\Console\Commands; 

use Illuminate\Console\Command; 
use Symfony\Component\Console\Input\InputOption; 
use Symfony\Component\Console\Input\InputArgument; 

use Ratchet\Server\IoServer; 
use Ratchet\Http\HttpServer; 
use Ratchet\WebSocket\WsServer; 
use App\Chat; 

class WSChatServer extends Command { 

    /** 
    * The console command name. 
    * 
    * @var string 
    */ 
    protected $name = 'chat:serve'; 

    /** 
    * The console command description. 
    * 
    * @var string 
    */ 
    protected $description = 'Start chat server.'; 

    /** 
    * Create a new command instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
      parent::__construct(); 
    } 

    /** 
    * Execute the console command. 
    * 
    * @return mixed 
    */ 
    public function fire() 
    { 
      $port = intval($this->option('port')); 
      $this->info("Starting chat web socket server on port " . $port); 

      $server = IoServer::factory(
       new HttpServer(
        new WsServer(
         new Chat() 
        ) 
       ), 
       $port 
     ); 

     $server->run(); 
    } 

    /** 
    * Get the console command arguments. 
    * 
    * @return array 
    */ 
    protected function getArguments() 
    { 
     return [ 
     ]; 
    } 

    /** 
    * Get the console command options. 
    * 
    * @return array 
    */ 
    protected function getOptions() 
    { 
     return [ 
      ['port', 'p', InputOption::VALUE_OPTIONAL, 'Port where to launch the server.', 9090], 
     ]; 
    } 

} 

回答

0

你的問題暗示了你要去哪裏有最困難的:「是否有可能做到這一點沒有VPS主機」

解決此問題的某些選項可能會被共享主機阻止。從根本上來說,每個從你的web服務器調用一個php應用程序將啓動一個php進程。當它完成時,過程返回。除非您希望此過程未完成,但您希望Web請求返回。所以你真的有三個選擇:

1)讓PHP產生一個新的進程來運行你的工匠命令,然後有原來的一個返回。爲此,您需要訪問php中的其中一個進程擴展。大多數共享主機默認情況下禁用此功能您還需要確保該流程的創建方式不會在父流程關閉時停止。

2)您可以通過ssh登錄並運行命令。和以前一樣,您需要確保該過程已生成,以便在退出SSH連接時不會停止。 Nohup在那裏是一個有用的過程。

3)您可以編寫一個cron腳本來啓動後臺進程(如果沒有運行的話)。與ssh命令類似,這使用其他內容來觸發該過程。

我會注意到許多共享的webhosts不允許長時間運行的用戶進程,因此可能不是這個項目的正確解決方案。