2017-08-01 10 views
0

ラチェットパッケージを使用してチャットアプリケーションを作成しています。 共有ホスティングで「chat:serve」コマンドを実行するにはどうすればよいですか?私はコンソールラインなしでコマンドを実行する必要があります。Laravel:背景でカスタムアーティザンコマンドを実行する

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

またはこの: 私はこの試みた

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

を、それは動作しません。 Webページはロードを停止しません。 この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リクエストを返すことを望む場合を除きます。だから実際には3つのオプションがあります:

1)あなたの職人のコマンドを実行するための新しいプロセスが生成され、元のプロセスが戻るようにしますか?これを行うには、PHPのプロセス拡張の1つにアクセスする必要があります。ほとんどの共有ホストは、デフォルトでこれを無効にします。また、親プロセスが閉じられたときにプロセスが停止しないようにプロセスを作成する必要があります。

2)sshでログインしてコマンドを実行できます。 SSH接続を終了するときにプロセスが停止しないように、プロセスが生成されることを保証する必要があります。 Nohupはそこで役に立つプロセスです。

3)実行していないバックグラウンドプロセスを起動するcronスクリプトを書くことができます。 sshコマンドと同様に、これはプロセスをトリガするために他のものを使用します。

多くの共有Webホストでは、長時間実行されるユーザープロセスが許可されないため、このプロジェクトでは適切なソリューションではない可能性があります。

関連する問題