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

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

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

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

Q&A

解決済

2回答

556閲覧

PHPでthreadクラスを利用したDBアクセス

hirota_akiyoshi

総合スコア12

PHP

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

0グッド

0クリップ

投稿2020/06/16 01:56

前提・実現したいこと

初めて投稿します。

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の利用はできないのでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

そもそもthreadクラス内でPDOの利用はできないのでしょうか?

そのとおりです。

複数の端末から要求が来ることを考慮して、検索を並行処理できるように

考えています。

普通にWebシステムとして組めば、サーバサイドで適切な設定をすることでPHP自体が並列実行されるので、PHP内部でスレッド化を行う必要もないかと思います。

投稿2020/06/16 02:04

編集2020/06/16 02:09
maisumakun

総合スコア146018

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

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

hirota_akiyoshi

2020/06/16 02:51

回答ありがとうございます。 質問について、省略しすぎたかもしれません。 Web(ブラウザ経由ではなく)、サーバーサイドで単独処理をさせようとしています。 接続相手が携帯端末(Androidなどではない業務用)なので、単純にソケットで受けてソケットにコールバックするような仕組みを考えていました。 そもそもできないようなので、別の方法を考えてみます。
guest

0

解決方法
携帯端末からソケット通信(http)でPHPのCGIを呼び出しレスポンスデータを編集表示する様にしました。
サーバー側をWebサーバーで受けることで、並行処理を気にする必要がなくなりました。
受け側がブラウザではないので、受信内容の抜き出し考慮する必要はありますが、期待通りの結果になりました。

投稿2020/07/04 01:45

hirota_akiyoshi

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問