我在Zend Framework项目中使用pthreads(http://php.net/manual/en/book.pthreads.php)库。问题是新线程在整个ZF初始化中使用不同的内存范围。因此,从线程范围我无法达到Zend Framework功能。所以我需要在每个线程调用中加载(初始化)整个Zend Framework。但我不知道如何正确地做到这一点......我已经在做什么(线程中的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的例子?
我们将不胜感激。
答案 0 :(得分:4)
线程位于不同的地址空间中。但是,当你创建一个Thread环境时,只要加载的类(而不是对象),函数,声明的常量和ini条目都复制到新的上下文中。
表示您的应用程序的对象似乎是一个标准对象,应该是这样的情况,只需将其设置为一个线程的成员就可以使您的应用程序对象可用于线程上下文。我不能说这是否是正确的事情,在每个线程中加载整个应用程序似乎没什么用处,我想你想加载框架的一个实例,但是为不同的任务配置它不同。 / p>
这是一个在线程上下文中提供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();
?>