質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

artisan

artisanは、PHP Laravelフレームワークのコマンドの事です。 Artisanコマンドを使う事で、DBのテーブルやバンドル等を追加することができるコマンドです。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

4557閲覧

Laravel5.1でqueue処理が実行されない。

maedamin

総合スコア13

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

非同期処理

非同期処理とは一部のコードを別々のスレッドで実行させる手法です。アプリケーションのパフォーマンスを向上させる目的でこの手法を用います。

artisan

artisanは、PHP Laravelフレームワークのコマンドの事です。 Artisanコマンドを使う事で、DBのテーブルやバンドル等を追加することができるコマンドです。

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/07/19 05:22

Laravel5.1でqueue処理が実行されない。

(Laravel初心者です。)LaravelのQueue(非同期処理)について質問させてください。

現在Lavel5.1.4を使っており、プッシュメッセージ送信を非同期処理にさせようとしています。
現在プログラムは動いており、.envでのQUEUE_DRIVER=sync状態で動作することは確認しております。

.envをQUEUE_DRIVER=databaseにした際、データベースのテーブルjobsにQUEUEが格納されることまでは確認しています。
ですが、 php artisan queue:work を実行してもQUEUE処理を開始しません。
(上記実行するとコマンドラインに戻ります。⇒これは正常?)

発生している問題・エラーメッセージ

下記に記しましたが、
過去のQUEUEを削除するため
php artisan queue:flushを実行した際にConnection Time outエラーが出ています。

該当のソースコード

プッシュ通信非同期化に先立ち、処理確認用にapp\Jobsに作ったサンプルファイル。

PHP

1<?php 2 3namespace App\Jobs; 4 5use App\Jobs\Job; 6use Illuminate\Queue\SerializesModels; 7use Illuminate\Queue\InteractsWithQueue; 8use Illuminate\Contracts\Bus\SelfHandling; 9use Illuminate\Contracts\Queue\ShouldQueue; 10use Log; 11 12 13class SampleJob extends Job implements SelfHandling, ShouldQueue 14{ 15 use InteractsWithQueue, SerializesModels; 16 17 /** 18 * Create a new job instance. 19 * 20 * @return void 21 */ 22 public function __construct() 23 { 24 // 25 } 26 27 /** 28 * Execute the job. 29 * 30 * @return void 31 */ 32 public function handle() 33 { 34 $queued_at = date('Y-m-d H:i:s'); 35 sleep(5); 36 $dispatched_at = date('Y-m-d H:i:s'); 37 Log::info("処理開始 - {$queued_at} ... 処理終了 - {$dispatched_at}"); 38 } 39}

.envの内容。syncをdatabaseに書き換え。(syncの時は、正しく動作。databaseに書き換えると、正しくDBのjobsテーブルにqueueが記録された。)

PHP

1CACHE_DRIVER=file 2SESSION_DRIVER=file 3#QUEUE_DRIVER=sync 4QUEUE_DRIVER=database

config\queue.phpの内容

PHP

1 */ 2 3 /*'default' => env('QUEUE_DRIVER', 'sync'),*/ 4 'default' => env('QUEUE_DRIVER', 'database'), 5 6 'connections' => [ 7 8 'sync' => [ 9 'driver' => 'sync', 10 ], 11 12 'database' => [ 13 'driver' => 'database', 14 'table' => 'jobs', 15 'queue' => 'default', 16 'expire' => 60, 17 ], 18 19 'beanstalkd' => [ 20 'driver' => 'beanstalkd', 21 'host' => 'localhost', 22 'queue' => 'default', 23 'ttr' => 60, 24 ], 25 26 'sqs' => [ 27 'driver' => 'sqs', 28 'key' => 'your-public-key', 29 'secret' => 'your-secret-key', 30 'queue' => 'your-queue-url', 31 'region' => 'us-east-1', 32 ], 33 34 'iron' => [ 35 'driver' => 'iron', 36 'host' => 'mq-aws-us-east-1.iron.io', 37 'token' => 'your-token', 38 'project' => 'your-project-id', 39 'queue' => 'your-queue-name', 40 'encrypt' => true, 41 ], 42 43 'redis' => [ 44 'driver' => 'redis', 45 'connection' => 'default', 46 'queue' => 'default', 47 'expire' => 60, 48 ], 49 50 ], 51 52 /* 53 |-------------------------------------------------------------------------- 54 | Failed Queue Jobs 55 |-------------------------------------------------------------------------- 56 | 57 | These options configure the behavior of failed queue job logging so you 58 | can control which database and table are used to store the jobs that 59 | have failed. You may change them to any database / table you wish. 60 | 61 */ 62 63 64 'failed' => [ 65 'database' => 'mysql', 'table' => 'failed_jobs', 66 ], 67 68];

試したこと

php artisan queue:work を実行 ⇒反応なし。
php artisan queue:restartを実行  

  Broadcasting queue restart signal.

が表示される。

php artisan queue:restartを実行

[PDOException] SQLSTATE[HY000] [2002] Connection timed out

php artisan config:casheを実行すると、システムが停止してしまいました。
Laravelが停止したような状態です。(php artisanが一切起動しない。)
しかし、bootstrap\cashe、framework\cache配下を削除して復旧しました。

補足情報

・データベースはPostgresを使っています。
・上記エラーを見ると、DBとの接続エラーに見えるのですが、そうだとしたらなぜQUEUEはDBテーブルにちゃんと書きこめているのかがわかりません。
⇒DB関連の設定のような気はします。
⇒QUEUEを稼働させるためのDB設定が正しくされていない??なのでQUEUEを見つけられない?だからflushが相手を探せずにタイムアウトする?
だとしたら、このqueueのDB設定はどこなのでしょうか?(queue.phpの何かがおかしいと言うことでしょうか?)

まだまだ初心者で、人の書いたプログラムを修正しているレベルです。
未熟な点が多く、大変申し訳ないのですが、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

今回複合的要因であったと思います。
1)php artisan queue:flush がタイムアウトする件。
こちらは、queue.phpのfailedの処理でmysqlが設定されていたのが原因。
修正して、直りました。

2)根本的なqueueを読みださない問題
jobsテーブルにはqueueを書き込むが、実行しないという問題です。
jobsテーブルに書き込むわけなので、DBの設定としてはOK。
このテーブルには過去の残骸がかなりあったので、一度全部削除し、
さらにIDを初期化しました。
select setval ('jobs_id_seq', 1, false);
(jobsテーブルなので、このようになります。)

ただ、これでも
php artisan queue:work --daemon
ではqueue読取実行はされませんでした。
しかし、
php artisan queue:work --daemon --queue=<キューの名前>
であれば、問題なく動くことを確認できました。
複数のキューがある場合は、すべてをカンマでつないで設定する必要がありますが、
当座はこれで問題ないと思います。

この後、これをSupervisorなどで設定し、運用にのせたいと思います。

投稿2019/07/19 11:03

maedamin

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikkame

2019/07/19 11:06

おめでとうございます! tada
maedamin

2019/07/19 11:13

最後は自力ですが、途中かなりヒントいただき、感謝しております。 ありがとうございました!
guest

0

php artisan queue:work 実行時に、キューに何もなければ、コマンドラインに戻る
で正常だった気がしますが
キューになにか入っている時は1件処理してコマンドラインに戻るが正常です

php artisan queue:work --daemon
daemonにして、随時実行するようにすればコマンドラインに戻ってくる事はなくなるのですが・・・。

ただ、雰囲気的にそれとは別に

SQLSTATE[HY000] [2002] Connection timed out

php artisan config:casheを実行すると、システムが停止してしまい

こちらが別途、影響しているような気がするので、いったんキューはおいといて
そちらが正常に動く事を目指したほうがよい気がします。

例えば、herokuやaws eb を使用時に、CLIに環境変数が足りなく(そもそもそんな事まれだと思うのですが)
CLI時のみ、DB設定が飛んでしまっている、などが考えられます
(php artisan tinker して、 config('database') と打てばCLI時の設定がみれる)

投稿2019/07/19 05:28

mikkame

総合スコア5036

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maedamin

2019/07/19 05:39

ありがとうございます。キューですが、データベースのjobsテーブルには既に40近いキュー情報がたまっています。キューは書き込んでいるけど、それを実行してくれないように見えます。 テーブルの中にattemptというのがあり、これがおそらく試行回数を記録するのだと思うのですが、そこは一切更新されないようです。 なので、おっしゃる通り、コネクションタイムアウトの方が問題と感じています。 php artisan tinker 試してみます。
mikkame

2019/07/19 05:42

管理画面上から環境変数がセットできるタイプのサーバであれば HTTP経由のみ環境変数があり、CLI時はない、とかがありそうなので。 また、超極希ですが、FTP/SSHサーバと、APPサーバが別になっていて (SSHサーバからnfsでAPPに同期している)、APPからのみDBにアクセス可能とかいう構成でしたら SSHした先でDBのコネクションはれない、とかがありそうです
maedamin

2019/07/19 05:58

php artisan thinkerでDB設定を見てみました。 ``` "fetch" => 8, "default" => "pgsql", "connections" => [ "sqlite" => [ "driver" => "sqlite", "database" => "..../user-api/storage/database.sqlite", "prefix" => "", ], "mysql" => [ "driver" => "mysql", "host" => "db.servicename.jp", "database" => "database_name", "username" => "user", "password" => "xxxxxx", "charset" => "utf8", "collation" => "utf8_unicode_ci", "prefix" => "", "strict" => false, ], "pgsql" => [ "driver" => "pgsql", "host" => "db.servicename.jp", "port" => "xxxxx", "database" => "database_name", "username" => "user", "password" => "xxxxxx", "charset" => "utf8", "prefix" => "", "schema" => "database_name", ``` user-api/storage/には何も存在していませんでした。sqliteも使っていないです。 mysqlも使っていないです。(設定内容はpgsqlのものが記入されていました。) pgsql(PostgreSQL)の設定情報は正しいです。 この変更はどこでされるのでしょうか?
mikkame

2019/07/19 06:01

mysqlとsqliteに自動的に値が入るのは正常です。 pgsqlとdefault" => "pgsqlが正常なら問題なさそうです。 (どうしても消したい、という事であればconfig/database.phpを編集してください。これと環境変数、.envの結合結果が表示されています)
mikkame

2019/07/19 06:02

あとは、artisanコマンド系は -v オプションを足すとデバッグ情報が出るのでお試しください
maedamin

2019/07/19 06:43

mikkameさま。ありがとうございます。ということは、DB設定に問題はないと言うことなのですね。 -vも試してみます。
mikkame

2019/07/19 06:51

あと、タイムアウトが30秒の場合は、多くの場合ドメイン名の間違いの事が多いです
maedamin

2019/07/19 07:05

php artisan queue:flush -v の結果ですが Exception trace: () ..../use-api/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:55 PDO->__construct() at ..../user-api/vendor/laravel/framework/src/Illuminate/Database/Connectors/Connector.php:55 Illuminate\Database\Connectors\Connector->createConnection() at ..../user-api/vendor/laravel/framework/src/Illuminate/Database/Connectors/MySqlConnector.php:22 Illuminate\Database\Connectors\MySqlConnector->connect() at ..../user-api/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php:60 Illuminate\Database\Connectors\ConnectionFactory->createSingleConnection() at ..../user-api/vendor/laravel/framework/src/Illuminate/Database/Connectors/ConnectionFactory.php:49 Illuminate\Database\Connectors\ConnectionFactory->make() at ..../user-api/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:175 Illuminate\Database\DatabaseManager->makeConnection() at ..../user-api/vendor/laravel/framework/src/Illuminate/Database/DatabaseManager.php:67 Illuminate\Database\DatabaseManager->connection() at ..../user-api/vendor/laravel/framework/src/Illuminate/Queue/Failed/DatabaseFailedJobProvider.php:110 Illuminate\Queue\Failed\DatabaseFailedJobProvider->getTable() at ..../user-api/vendor/laravel/framework/src/Illuminate/Queue/Failed/DatabaseFailedJobProvider.php:100 Illuminate\Queue\Failed\DatabaseFailedJobProvider->flush() at ..../user-api/vendor/laravel/framework/src/Illuminate/Queue/Console/FlushFailedCommand.php:30 Illuminate\Queue\Console\FlushFailedCommand->fire() at n/a:n/a call_user_func_array() at ..../user-api/vendor/laravel/framework/src/Illuminate/Container/Container.php:507 Illuminate\Container\Container->call() at ..../user-api/vendor/laravel/framework/src/Illuminate/Console/Command.php:150 Illuminate\Console\Command->execute() at ..../user-api/vendor/symfony/console/Command/Command.php:263 Symfony\Component\Console\Command\Command->run() at ..../user-api/vendor/laravel/framework/src/Illuminate/Console/Command.php:136 Illuminate\Console\Command->run() at ..../user-api/vendor/symfony/console/Application.php:853 Symfony\Component\Console\Application->doRunCommand() at ..../user-api/vendor/symfony/console/Application.php:200 Symfony\Component\Console\Application->doRun() at ..../user-api/vendor/symfony/console/Application.php:124 Symfony\Component\Console\Application->run() at ..../user-api/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php:107 Illuminate\Foundation\Console\Kernel->handle() at ..../user-api/artisan:36 気になるのが、途中でMySqlConnector.phpを呼んでいるところです。(PostgresConnectoer.phpではなく)
mikkame

2019/07/19 07:14

確かに、mysqlになるのはおかしい気がします。 例えばtinker内で \DB::table('hogetable')->select('*')->take(1)->get() とかすると、CLI上でDBクエリ走ると思うのですが、そっちはうまくいくんでしょうか
maedamin

2019/07/19 07:30

mikkame様。ありがとうございます。 試してみました。Postgresで管理されているテーブルを指定してみましたが、内容正しく表示します。 クエリは走るようです。
maedamin

2019/07/19 07:59

mikkame様、これですが、queue.phpの最後の部分、確かにmysqlとべた書きされています。 (上にqueue.phpも載せています。) これはfailしたときのDB先なので、この記述は間違いだと思います。 あと、このときの記述は .envではDB_CONNECTION=pgsql、上記mysqlのかわりにpgsqlが正しいのでしょうか?
mikkame

2019/07/19 08:01

DB_CONNECTION=pgsql とかかれていれば、env('DB_CONNECTION')がpgsqlになるはずなので問題ないと思うんですが・・・ 第一引数がnullったときに第二引数が使われるだけですので・・・ 基本的には問題ないと思うんですが このIssueと症状が結構似てるような気がするんですよね
maedamin

2019/07/19 08:07

mikkame様 いろいろとありがとうございます。 queue.phpの最後の部分を 'failed' => [ 'database' => 'pgsql', 'table' => 'failed_jobs', ], に書き換えて、 php artisan queue:flush を実行したところ All failed jobs deleted successfully! が出ました。 この部分は解決したみたいです。 .envにDB_CONNECTION=pgsqlの記述は無いので、追加して試してみます。
maedamin

2019/07/19 08:17

.envにDB_CONNECTION=pgsqlを追記しました。 jobsテーブルにはまだ前々から設定されたqueue情報が50ほど残っています。 この状態で、php artisan queue:work -v を実行しました。 特に何も起きずにコマンドプロプトに戻っています。 php artisan queue:restart -v を試すと Broadcasting queue restart signal. は出ますが、特にjobsテーブルにたまったqueueを処理している気配は無いようです。 flush時のタイムアウトエラーは出なくなりましたが、まだqueueの実行までは至っていないようです。 一度過去のqueueを削除した方が良いでしょうか?おそらく、数年前の残骸があるようです。 (かと言って、failed_jobに何か書き込まれているわけでもないのも事実ですが。)
mikkame

2019/07/19 08:26

php artisan queue:restart これについては配下のワーカーにリスタートさせる機能のようなきがするのであまり関係がないような気がします。
mikkame

2019/07/19 08:26

数年前の残骸、というと、queuerには実行予定時間がついているので乖離しているとひょっとしたら実行されないのかも・・・?
maedamin

2019/07/19 08:33

一度クリアしてみます。 ちなみに、php artisan queue:listenをするとキューの監視モードになると思うのですが、 何の反応も無いようです。(Control-C押さない限り、いったキリ・・)
maedamin

2019/07/19 08:35

jobsテーブル内容をすべて削除してから再実行してみましたが、現象に変化は無いようです。
mikkame

2019/07/19 08:50

うーん・・・すみません、こ以上はわからないですね お力になれず申し訳ないです
maedamin

2019/07/19 08:53

mikkame様、いえいえ、前進しています。 いろいろ相談に乗ってくださりありがとうございます!
maedamin

2019/07/19 10:39

まだ完全解決ではないですが、一歩前進しました。 https://stackoverflow.com/questions/41632559/php-artisan-queuework-not-working-but-job-are-inserted に似たケースがあり、そこで書かれていたjobsテーブルの初期化を実行しました。 具体的には、データをすべて削除し、idを1に初期化したと言うことです。 この状態で、jobsにqueueを設定、 php artisan queue:work --daemon --queue=push_test (push_testはキューの名前)を強制的に設定すると実行されました。 (キュー名を設定しないと実行されませんでした。これも上記の記事内に記述されています。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問