例如,我使用以下代码:
org.richfaces.component.Positioning
答案 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'];
注意: