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アクセス以外の処理(外部クラスを利用しない)は問題なく、マルチスレッドで動くことは確認できています。
なぜ、マルチスレッドにした場合、外部クラスが見つからなくなるのか、また、どうすれば利用できるのかご教示いただけると幸いです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/10/16 10:06