teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

5

質問内容を追記しました。

2018/01/19 00:23

投稿

ID_7UGzV8hCHGs5
ID_7UGzV8hCHGs5

スコア58

title CHANGED
File without changes
body CHANGED
@@ -104,4 +104,9 @@
104
104
  ▼2のvar_dump // 既に削除されたようなエラーメッセージ
105
105
  Fatal 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
106
106
  */
107
- ```
107
+ ```
108
+
109
+
110
+ #質問追記
111
+ 「そもそもThreadから配列を返すなんて処理は、普通(仕事)では書かないよ」的な意見でもぜひください。
112
+ 私は趣味でプログラムしているので、そういう最前線の言葉が凄い貴重です。

4

追加でコードを掲載しました。

2018/01/19 00:23

投稿

ID_7UGzV8hCHGs5
ID_7UGzV8hCHGs5

スコア58

title CHANGED
File without changes
body CHANGED
@@ -56,4 +56,52 @@
56
56
  ```
57
57
 
58
58
  #
59
- スレッドで配列を返す事が不可能なら、しぶしぶjsonで返そうかと考えております(T_T)
59
+ スレッドで配列を返す事が不可能なら、しぶしぶjsonで返そうかと考えております(T_T)
60
+
61
+
62
+
63
+ # 追記: プロパティに格納しようとしたNGだったソースを掲載します。
64
+ ```php
65
+ <?php
66
+
67
+ $MyThread = new MyThread;
68
+ $MyThread->start();
69
+ $MyThread->join();
70
+
71
+ //1
72
+ var_dump($MyThread);
73
+ //2
74
+ var_dump($MyThread->data); //NG
75
+
76
+ class MyThread extends Thread
77
+ {
78
+ public $data;
79
+
80
+ public function __construct()
81
+ {
82
+ //処理なし
83
+ }
84
+
85
+ public function run()
86
+ {
87
+ //この配列を親スレッドで使いたい
88
+ $array = array('data1', 'data2');
89
+
90
+
91
+ //プロパティに格納 → NG
92
+ $this->data = array('data1', 'data2'); //メインスレッドに処理が戻った時に、$this->dataは既に破棄されていて、アクセス出来ない。
93
+
94
+ }
95
+ }
96
+
97
+
98
+ /* 出力結果
99
+ ▼1のvar_dump //プロパティdataは含まれていない。
100
+ /var/www/html/Arbitrage_ROOT_PATH/thread_array.php:6:
101
+ class MyThread#1 (0) {
102
+ }
103
+
104
+ ▼2のvar_dump // 既に削除されたようなエラーメッセージ
105
+ Fatal 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
106
+ */
107
+ ```

3

「グローバル変数に格納」出来るかテストした旨を追記しました。

2018/01/19 00:10

投稿

ID_7UGzV8hCHGs5
ID_7UGzV8hCHGs5

スコア58

title CHANGED
File without changes
body CHANGED
@@ -5,11 +5,11 @@
5
5
  子スレッド内で作った配列を、親スレッドで使いたいと考えております。
6
6
 
7
7
  尚、速度を重視しているため、
8
- 下記のデータを受け渡し方法は、出来るだけ行いたくないと考えております。
8
+ 下記の受け渡し方法は、出来るだけ行いたくないと考えております。
9
9
 
10
10
  ・DBに保存
11
- ・テキストファイルへの書き出
11
+ ・テキストファイル書き出
12
- ・jsonにしてかえ
12
+ ・json(string)にして
13
13
 
14
14
 
15
15
  # 試したソース
@@ -43,6 +43,9 @@
43
43
  //セッションに格納 → NG
44
44
  //$_SESSION['myArray'] = $array; //メインスレッドに処理が戻った時に、既に破棄されていてアクセス出来ない。
45
45
 
46
+ //グローバル変数に格納 → NG
47
+ //$GLOBALS['myArray'] = $array; //メインスレッドに処理が戻った時に、既に破棄されていてアクセス出来ない。
48
+
46
49
  //json_encodeしてstringにする → OK
47
50
  //$this->data = json_encode($array); //もちろんこれは出来たのですが、$arrayは実際は大きいデータなので、json_encodeする時間が惜しいんです。
48
51
 

2

変数名を訂正しました

2018/01/18 23:32

投稿

ID_7UGzV8hCHGs5
ID_7UGzV8hCHGs5

スコア58

title CHANGED
File without changes
body CHANGED
@@ -38,10 +38,10 @@
38
38
  //以下、試したこと
39
39
 
40
40
  //プロパティに格納 → NG
41
- //$this->data = array('data1', 'data2'); //メインスレッドに処理が戻った時に、$this->myArrayは既に破棄されていて、アクセス出来ない。
41
+ //$this->data = array('data1', 'data2'); //メインスレッドに処理が戻った時に、$this->dataは既に破棄されていて、アクセス出来ない。
42
42
 
43
43
  //セッションに格納 → NG
44
- //$_SESSION['myArray'] = $array; //メインスレッドに処理が戻った時に、既に破棄されていてアクセス出来ない。
44
+ //$_SESSION['myArray'] = $array; //メインスレッドに処理が戻った時に、既に破棄されていてアクセス出来ない。
45
45
 
46
46
  //json_encodeしてstringにする → OK
47
47
  //$this->data = json_encode($array); //もちろんこれは出来たのですが、$arrayは実際は大きいデータなので、json_encodeする時間が惜しいんです。

1

変数名が誤っていたため変更しました。

2018/01/18 16:09

投稿

ID_7UGzV8hCHGs5
ID_7UGzV8hCHGs5

スコア58

title CHANGED
File without changes
body CHANGED
@@ -38,7 +38,7 @@
38
38
  //以下、試したこと
39
39
 
40
40
  //プロパティに格納 → NG
41
- //$this->myArray = array('data1', 'data2'); //メインスレッドに処理が戻った時に、$this->myArrayは既に破棄されていて、アクセス出来ない。
41
+ //$this->data = array('data1', 'data2'); //メインスレッドに処理が戻った時に、$this->myArrayは既に破棄されていて、アクセス出来ない。
42
42
 
43
43
  //セッションに格納 → NG
44
44
  //$_SESSION['myArray'] = $array; //メインスレッドに処理が戻った時に、既に破棄されていて、アクセス出来ない。