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

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

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

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

Q&A

解決済

1回答

315閲覧

PHP: 子スレッドから親スレッドに「配列」を返したい。

ID_7UGzV8hCHGs5

総合スコア58

PHP

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

0グッド

3クリップ

投稿2018/01/18 16:05

編集2018/01/19 00:23

解決したいこと

PHPのPthreadを使っています。

親スレッドから子スレッドの処理を開始し、
子スレッド内で作った配列を、親スレッドで使いたいと考えております。

尚、速度を重視しているため、
下記の受け渡し方法は、出来るだけ行いたくないと考えております。

・DBに保存
・テキストファイルに書き出し
・json(string)にして返す

試したソース

php

1$MyThread = new MyThread; 2$MyThread->start(); 3$MyThread->join(); 4 5//ここで、$arrayにアクセスしたい。 6 7class MyThread extends Thread 8{ 9 public $data; 10 11 public function __construct() 12 { 13 //処理なし 14 } 15 16 public function run() 17 { 18 //この配列を親スレッドで使いたい 19 $array = array('data1', 'data2'); 20 21 //以下、試したこと 22 23 //プロパティに格納 → NG 24 //$this->data = array('data1', 'data2'); //メインスレッドに処理が戻った時に、$this->dataは既に破棄されていて、アクセス出来ない。 25 26 //セッションに格納 → NG 27 //$_SESSION['myArray'] = $array; //メインスレッドに処理が戻った時に、既に破棄されていてアクセス出来ない。 28 29 //グローバル変数に格納 → NG 30 //$GLOBALS['myArray'] = $array; //メインスレッドに処理が戻った時に、既に破棄されていてアクセス出来ない。 31 32 //json_encodeしてstringにする → OK 33 //$this->data = json_encode($array); //もちろんこれは出来たのですが、$arrayは実際は大きいデータなので、json_encodeする時間が惜しいんです。 34 35 } 36} 37 38

スレッドで配列を返す事が不可能なら、しぶしぶjsonで返そうかと考えております(T_T)

追記: プロパティに格納しようとしたNGだったソースを掲載します。

php

1<?php 2 3$MyThread = new MyThread; 4$MyThread->start(); 5$MyThread->join(); 6 7//1 8var_dump($MyThread); 9//2 10var_dump($MyThread->data); //NG 11 12class MyThread extends Thread 13{ 14 public $data; 15 16 public function __construct() 17 { 18 //処理なし 19 } 20 21 public function run() 22 { 23 //この配列を親スレッドで使いたい 24 $array = array('data1', 'data2'); 25 26 27 //プロパティに格納 → NG 28 $this->data = array('data1', 'data2'); //メインスレッドに処理が戻った時に、$this->dataは既に破棄されていて、アクセス出来ない。 29 30 } 31} 32 33 34/* 出力結果 35▼1のvar_dump //プロパティdataは含まれていない。 36/var/www/html/Arbitrage_ROOT_PATH/thread_array.php:6: 37class MyThread#1 (0) { 38} 39 40▼2のvar_dump // 既に削除されたようなエラーメッセージ 41Fatal error: Uncaught RuntimeException: pthreads detected an attempt to connect to an object which has already been destroyed in /var/www/html/main.php on line 7 42*/

#質問追記
「そもそもThreadから配列を返すなんて処理は、普通(仕事)では書かないよ」的な意見でもぜひください。
私は趣味でプログラムしているので、そういう最前線の言葉が凄い貴重です。

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

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

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

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

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

Zuishin

2018/01/18 23:47

メインスレッドから $data はどのようにアクセスしましたか? コメントに書いてあるように $this を使いましたか?
ID_7UGzV8hCHGs5

2018/01/19 00:06

Zuishinさん メインスレッドから、「var_dump($MyThread->data);」のようにアクセスしました。
guest

回答1

0

ベストアンサー

PHP公式にもデータのやり取り法は用意されていますが、結局シリアル化されます。つまり、本質的に「JSONで渡す」のとそう変わらない、という結論になります。

データストレージ: 目安として、シリアライズ可能なデータ型なら何でも、スレッド化されたオブジェクトのメンバーとして使えます。 そのオブジェクトへの参照を持つあらゆるコンテキストから、メンバーの読み書きができます。 すべてのデータ型がシリアライズされるわけではなく、基本型はそのままの形式で格納されます。 それ以外の複雑な型や配列、スレッド化されていないオブジェクトは、シリアライズして格納されます(PHPマニュアルより)。

投稿2018/01/19 00:38

maisumakun

総合スコア145121

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

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

ID_7UGzV8hCHGs5

2018/01/19 01:12

maisumakunさん 回答頂きありがとうございます。 そうなんですね。承知いたしました。 ちょっと残念ですが、スッキリしました。 マニュアルを添付して頂きありがとうございました。 以上、お礼申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問