Php 从pthreads访问$\u会话变量

Php 从pthreads访问$\u会话变量,php,multithreading,session,pthreads,scoping,Php,Multithreading,Session,Pthreads,Scoping,我在使用PHP的pthreads库从线程对象调用的函数中访问会话变量时遇到问题 从主线程调用函数时,不会发生错误,一切正常 但是,当从线程对象运行时,会出现以下错误: > PHP Notice: Undefined variable: _SESSION > PHP Notice: Undefined index: Properties Manager > PHP Fatal error: Call to a member function getGroupValue()

我在使用PHP的pthreads库从线程对象调用的函数中访问会话变量时遇到问题

从主线程调用函数时,不会发生错误,一切正常

但是,当从线程对象运行时,会出现以下错误:

> PHP Notice:  Undefined variable: _SESSION
> PHP Notice:  Undefined index: Properties Manager
> PHP Fatal error:  Call to a member function getGroupValue() on a non-object
错误指定的行号都指向此代码块:

function connect_mysql_db($database, $write = false) {
    $properties = $_SESSION['Properties Manager'];

    if(!isset($database) || strlen($database)==0){
        throw new Exception("No database specified");
    }

    // Read appropriate host, port, dbname, user & pass for this database
    $host    = $properties->getGroupValue($database, DB_HOST);
    $port    = $properties->getGroupValue($database, DB_PORT);
    $db_name = $properties->getGroupValue($database, DB_NAME);
    ...Removed unnecessary code...
}
稍微搜索一下,我就可以通过将session_start()放到;在我档案的顶端。 执行此操作后,除以下错误外,还将打印其他错误:

> PHP Notice:  A session had already been started - ignoring session_start()
所以我的主要问题是:在使用pthreads访问超级全局会话时,我需要做什么特殊的事情?还是说我在这里错过了完全不同的东西

编辑:
是的,我尝试过全球$\u会话;同样。

经过进一步研究,会话变量似乎不是线程安全的,事实上,在会话关闭之前,它是完全锁定的。我必须删除对会话的引用,只需将所需信息传递给函数或重新初始化它


幸运的是,正在创建的属性管理器没有性能下降。

您是否可以只
克隆()会话数组
并将其传递给
线程
?主要问题是,这是一个已定义的函数,我的线程没有直接使用它。我不仅要修改这个函数,还要修改所有其他调用这个函数的函数。除非你想把它传递给线程,否则就把它变成一个全局变量,这是值得一试的。当我回到这段代码时,我必须在某个时候尝试一下。不,我不是在提倡一个
全局
解决方案。我不知道您是如何设置线程代码的,但对我来说,我有一个
Worker
子对象,可以将内容注入其中(我这里不使用web服务器,但在您的情况下,这将是PHP/Apache入口点)。一个
Worker
将永久运行,直到它关闭,因此从那里我将
stack()
线程化
的子级。可以使用setter方法将内容从一个传递到另一个。(如果您正在写入会话,它会变得有点复杂,我会以另一种方式将内容传回,然后在Apache进程中读取它们)。