前提・実現したいこと
初めて投稿します。
PHPの拡張機能 Pthreadを利用して、DBを検索した結果を返答するクラスを
作成したいと考えてます。
最終的に、ソケット通信で受け取ったデータを元に検索して、返答する予定です。
複数の端末から要求が来ることを考慮して、検索を並行処理できるように
考えています。
発生している問題・エラーメッセージ
new PDO failed: You cannot serialize or unserialize PDO instances
SELECT MM_SHO.商品コード, MM_SHO.商品名 FROM MM_SHO MM_SHO where MM_SHO.JANコード = ?
NULL
PHP Fatal error: Uncaught Error: Call to a member function prepare() on null in C:\work\t\thread_class.pcls:44
Stack trace:
#0 C:\work\t\thread_test.php(14): thread_class->run()
#1 {main}
thrown in C:\work\t\thread_class.pcls on line 44
該当のソースコード
呼び出し元
<?php
//ロケーション回答クラス(ソケット通信返信)
include_once ('thread_class.pcls');
//実行サーバー、データベースサーバー設定
include_once ('db_conf.txt');
error_reporting(E_ALL);
//Allow the script to hang
set_time_limit(0);
$dsn = 'sqlsrv:server='.$db_svr;
$proc= new thread_class($dsn,$user,$pass,$db);
$proc->run();
?>
検索処理クラス
ファイル名 thread_class.pcls
<?php
class thread_class extends Thread {
// プロパティの宣言
public $chk_jancode;
public $sock_resource;
private $dsn;
private $user;
private $pass;
private $db;
private $dbh;
private $pdo;
private $sqlstr;
private $sql_stmt;
private $wrt_len;
private $result;
//コンストラクタ
public function __construct($dsn,$user,$pass,$db) {
$this->dsn=$dsn;
$this->user=$user;
$this->pass=$pass;
$this->db=$db;
echo "in class:const"."\n";
} //__construct
//呼び出し元 start()メソッドでrun()が実行される
public function run() {
//DB接続
try {
$this->dbh = new PDO($this->dsn, $this->user, $this->pass);
} catch (PDOException $e) {
echo 'new PDO failed: ' . $e->getMessage()."\n";
}
//SQL準備
$this->sqlstr="SELECT MM_SHO.商品コード, MM_SHO.商品名 FROM " . $this->db. "MM_SHO where MM_SHO.JANコード = ? ";
//sql prepare
echo $this->sqlstr."\n";
var_dump($this->dbh);
try {
$this->sql_stmt=$this->dbh->prepare($this->sqlstr);
} catch (PDOException $e) {
echo 'prepare failed: ' . $e->getMessage();
$dbh = null; // #DBからの切断
exit;
}
//SQL実行
try {
$this->sql_stmt->execute(array(trim('XXXXXXXXXXXXX')));
} catch (PDOException $e) {
echo 'execute failed: ' . $e->getMessage();
$dbh = null; // #DBからの切断
exit;
}
//データ読込
try {
$this->result=$this->sql_stmt->fetchall();
} catch (PDOException $e) {
echo 'execute failed: ' . $e->getMessage();
$dbh = null; // #DBからの切断
exit;
}
foreach ($this->result as $this->value_chk){
$this->res_str = $this->jobcd.value_chk["商品コード"].value_chk[mb_convert_encoding("商品名", "SJIS", "auto")]."\n";
// sleep(10);
echo $this->res_str."\n";
$dbh = null; // #DBからの切断
exit ;
}
$dbh = null; // #DBからの切断
} //run()
} //class
?>
試したこと
PDOのインスタンス化を呼び出し側にして、引数渡しで試したりもしましたが、
同じ結果でした。
PDOがインスタス化できなので後続prepareも失敗していますが、
そもそもthreadクラス内でPDOの利用はできないのでしょうか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/16 02:51