0

我在 Zend Framework 项目中使用 pthreads ( http://php.net/manual/en/book.pthreads.php ) 库。问题是新线程使用与整个 ZF 初始化不同的内存范围。所以从线程范围我无法达到 Zend Framework 的功能。所以我需要在每个线程调用中加载(初始化)整个 Zend 框架。但我不知道如何正确地做到这一点......我已经在做什么(线程中的 ZF 初始化)以及实际上对我不起作用的事情:

<?php

// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));

// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'development'));

// Ensure library/ is on include_path
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    get_include_path(),
)));

/** Zend_Application */
require_once 'Zend/Application.php';

// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);

那么有什么想法吗?有没有正确加载整个 ZF 的例子?

您的帮助将不胜感激。

4

1 回答 1

4

线程位于不同的地址空间中。但是,当您创建 Thread 您的环境时,就已加载的类(而不是对象)、函数、声明的常量和 ini 条目而言,新上下文是重复的。

代表您的应用程序的对象似乎是一个标准对象,应该是简单地将其设置为线程成员将使您的应用程序对象可用于线程上下文的情况。我不能说这是否是正确的做法,在每个线程中加载整个应用程序似乎没有用,我想你想加载框架的一个实例,但针对不同的任务对其进行不同的配置。

这是线程上下文中可用的 ZF2 的工作示例,正如我所说,我对框架一无所知,但它可能会有所帮助。

<?php
use Zend\Loader\StandardAutoloader;
use Zend\Feed\Reader\Reader;
use Zend\Debug\Debug;

require_once 'Zend/library/Zend/Loader/StandardAutoloader.php';
$loader = new StandardAutoloader(array('autoregister_zf' => true));
$loader->register();

class T extends Thread {
    public function __construct($loader) {
        $this->loader = $loader;
    }

    public function run() {
        $this->loader->register();

        printf(
            "Executing Thread with ZF2 Loaded (%s)\n", Debug::getSapi() 
        );

        var_dump ($this->loader);
    }
}

$t = new T($loader);
$t->start();
?>
于 2013-01-25T12:48:22.390 回答