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

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

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

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

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

Q&A

1回答

3230閲覧

FuelPHPのtaskでマルチスレッドを使用すると外部クラスが見つからない

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

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

FuelPHP

FuelPHPは、軽量高速で開発が可能なPHPのWebアプリケーションフレームワークです。

0グッド

0クリップ

投稿2015/10/16 05:10

FuelPHPのtaskでバッチ処理を行っていたのですが、処理時間がだいぶかかるようになったため、マルチスレッド化して並列処理を行うように改修しているのですが、不可解な挙動をするので、相談させて下さい。

テストスクリプトとして以下を記述しました。

fuel/app/tasks/test.php

php

1<?php 2namespace Fuel\Tasks; 3 4class Test 5{ 6 public static function run() 7 { 8 // 動く(10がインサートされる) 9 \Foo_Bar::insert(10); 10 11 $bar = new \Foo_Bar(); 12 13 // 動く(20がインサートされる) 14 $bar->run(); 15 16 // 動かない(Class 'DB' not found) 17 $bar->start(); 18 } 19}

fuel/app/classes/foo/bar.php

php

1<?php 2class Foo_Bar extends Thread 3{ 4 public static function insert($i) 5 { 6 DB::insert('test')->set(array( 7 'i' => $i, 8 ))->execute(); 9 } 10 11 public function run() 12 { 13 $this->insert(20); 14 } 15}

挙動は、test.phpのコメントの通りとなります。
スタティックメソッド呼び出しの際は問題なくテーブルに10がインサートされます。
また、Foo_Barクラスをインスタンス化して、直接run()メソッドを呼び出しても問題ありません。
ところが、別スレッドとしてrun()メソッドが呼ばれると、Class 'DB' not foundエラーが発生します。
self::insert(20); としてみたり、run()メソッド内で直接 DB::insert()を呼び出しても同様のエラーが発生します。

DBアクセス以外の処理(外部クラスを利用しない)は問題なく、マルチスレッドで動くことは確認できています。
なぜ、マルチスレッドにした場合、外部クラスが見つからなくなるのか、また、どうすれば利用できるのかご教示いただけると幸いです。

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

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

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

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

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

guest

回答1

0

うまくいくかどうかはちょっと試してもらわないとわからないですが、

まず修正箇所としては、これでどうでしょうか。

DB::insert('test')->set(array('i' => $i))->execute();

\DB::insert('test')->set(array('i' => $i))->execute();  //エンマークをクラス名の前につける

これで解決するようであれば、
先頭行で、Taskの名前空間使用の宣言をしています。

「Task」の名前空間の中にDBクラスは存在しないので、
エラーになった物と思われます。

投稿2015/10/16 07:17

編集2015/10/16 07:43
hexagrimoire

総合スコア16

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

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

退会済みユーザー

退会済みユーザー

2015/10/16 10:06

ご回答ありがとうございます。 こちらも試してはみたのですが、結果は一緒でした。 補足ですが、 Fuel\Core\DB::insert('test')->set(array('i' => $i))->execute(); とすると、DBクラスではエラーは出ないのですが、今度は Class 'Database_Query_Builder_Insert' not found と、DBクラス内で使用しているDatabase_Query_Builder_Insertクラスが見つからないというエラーが出ます。 いまいちオートローダーの仕組みが分かっていないのですが、 fuel/app/bootstrap.php あたりに何か追記する必要があるのか悩んでいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問