会话未在线程中设置

时间:2015-09-09 08:24:42

标签: php multithreading session

  1. 我在线程类的run方法中设置会话但是我不能从外部访问会话。
  2. 我在run方法中通过fopen创建文件,但文件也没有创建。
  3. 例如,我使用以下代码:

    org.richfaces.component.Positioning

2 个答案:

答案 0 :(得分:1)

有两种可能性。

1)由于某些错误,未调用run()函数。

2)正如你所说,fopen不是创建文件,所以有可能由于某些错误文件没有创建而代码执行在$ _SESSION [' test']定义之前停止。 / p>

答案 1 :(得分:1)

通过多个线程更新SESSION或任何其他变量是不安全的!
你想做什么是危险的:你很容易丢失数据,因为你的会话的更新功能在不同的线程之间不同步

解决方案是更新您的代码:

<?php   
session_start();
class Async extends Thread 
{
    private $_session = NULL;
    public function __construct($session) 
    {
        $this->_session = $session;
    }
    public function run() 
    {
        // imagine if N threads want to open the same file with 'write' mode ?
        $fp = fopen(Thread::getCurrentThreadId() . '_test.txt', 'w');
        fwrite($fp, '1');
        fclose($fp);    
        $this->_session['test'] = 'test';
    }
    public function getSession() 
    {
        return $this->_session;
    }
}

foreach ($tests as $test)
{
    $workers[$i] = new Async($_SESSION);
    $workers[$i]->start();
    // to synchronize thread operations : wait until the launched thread has terminated
    $workers[$i]->join();
    $_SESSION = $workers[$i]->getSession();
}
echo $_SESSION['test'];

注意:

  • 当我正在做一些测试时,我在线程中尝试更新数组时发现了一个问题,所以我在SO中打开了一个新问题http://stackoverflow.com/q/32476271/4098311
  • 我不太确定`$ _SESSION`在一个线程中是可见的,所以我把它作为参数传递给了构造函数