解決したいこと
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から配列を返すなんて処理は、普通(仕事)では書かないよ」的な意見でもぜひください。
私は趣味でプログラムしているので、そういう最前線の言葉が凄い貴重です。
回答1件
あなたの回答
tips
プレビュー