php pthread 实例,使用pthreads的PHP多线程,类没有在Thread实例中加载

这篇博客讲述了在PHP中使用pthreads进行多线程编程时遇到的自动加载类的问题。作者在尝试异步写入MongoDB时,发现在线程中某些类无法被正确加载。问题在于SPL自动加载器在pthreads环境中不起作用。解决方案是在`run()`方法中包含`vendor/autoload.php`以重新初始化自动加载器。
摘要由CSDN通过智能技术生成

所以我使用pthreads来异步写入MongoDB(我想尝试React但它不支持PUT和POST HTTP方法)但是在使用Thread类时我遇到了一个问题.出于某种原因,当我将代码放在__construct()和run()方法中时,执行它会给出一个错误,即找不到某些类.我正在使用相同的Composer自动加载器,并且在我不使用Threading API时没有问题.关于它为什么会发生的任何想法?

class WriterThread extends Thread

{

private $validator;

private $pathResolver;

private $fileUpload;

private $fileSystem;

public $result;

public function __construct($folderPath, $mongoFS)

{

try {

$this->validator = new MongoFileSystemValidator(1024 * 1024 * 1024 * 2); //the maximum size set to 2GB

// Simple path resolver, where uploads will be put

$this->pathResolver = new FileUpload\PathResolver\Simple($folderPath);

// The machine's filesystem

$this->fileSystem = new MongoFS($mongoFS);

// FileUploader itself

$this->fileUpload = new FileUpload\FileUpload($_FILES['files'], $_SERVER);

//var_dump(get_declared_classes());

$this->fileUpload->setPathResolver($this->pathResolver);

$this->fileUpload->setFileSystem($this->fileSystem);

$this->fileUpload->addValidator($this->validator);

} catch (Exception $e) {

echo $e->getMessage();

}

}

public function run()

{

$this->result = $this->fileUpload->processAll();

}

}

所以PHP输出一个错误,说明在我应该加载的时候找不到我在线程中使用的一个类实例的类定义.如果我使用include或require手动导入它,代码会输出另一个错误,指出我正在尝试访问非对象类型变量的方法.

解决方法:

在编写pthreads应用程序时,默认情况下,在创建线程时会继承类,函数和常量表.但是,SPL自动加载机制,因为它实现奇怪 – 一半在核心,一半在外 – 必须重置,因为没有理智的方法来从pthreads扩展中操作它.

解决方案是在:: run中包含自动加载代码,通常是vendor / autoload.php,您应该知道应用程序的此代码的路径.

TLDR;类表是可用的,自动加载器不是,包含它…

标签:php,multithreading,pthreads

来源: https://codeday.me/bug/20190728/1564355.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值