Laravel 5 Laravel命令、Pthreads和闭包

Laravel 5 Laravel命令、Pthreads和闭包,laravel-5,pthreads,php-pthread,php-closures,Laravel 5,Pthreads,Php Pthread,Php Closures,需要多线程执行特定的进程。我了解了php-pthreads的扩展 例如,Laravel之外的一个简单脚本可以很好地工作,我喜欢它的结果。我决定搬到拉维尔,面对这个问题。当然,我在谷歌上搜索,找到了一些关于stackoverflow的问题,extension的作者在那里回答。但是我没有帮他回答,所以我请你帮我 问题扩展作者 有一个类App\Commands\QuestionsParserCommand。在内部,我创建了类App\My\Questions\QuestionsParser的一个实例,并

需要多线程执行特定的进程。我了解了php-pthreads的扩展

例如,Laravel之外的一个简单脚本可以很好地工作,我喜欢它的结果。我决定搬到拉维尔,面对这个问题。当然,我在谷歌上搜索,找到了一些关于stackoverflow的问题,extension的作者在那里回答。但是我没有帮他回答,所以我请你帮我

问题扩展作者

有一个类App\Commands\QuestionsParserCommand。在内部,我创建了类App\My\Questions\QuestionsParser的一个实例,并调用方法init()。然后,方法init()的代码:

//创建一个池
$pool=newpool($this->threads,ParserWorkers::class);
//创建一个线程类
$thread=新类扩展了Threaded
{
公共功能运行()
{
//该类将从提供程序接收数据
//这将通过解析器在线程之间共享。
//它将与API一起工作,并将数据存储在数据库中。
//需要使用线程,
//因为处理的数据量惊人。
回声“+”;
}
};
//启动一个线程
对于($i=0;$i<$this->threads;$i++){
$pool->submit($thread);
}
$pool->shutdown();
类ParserWorkers继承自Worker,但有一个空方法run()

因此,我运行脚本并在php日志中获得一条消息:

[13-Oct-2016 11:27:35 Europe/Moscow] PHP Fatal error:  Uncaught Exception: Serialization of 'Closure' is not allowed in [no active file]:0
Stack trace:
#0 {main}
    thrown in [no active file] on line 0
信息:Laravel5.2.43,PHP7.0.8,Windows


谢谢大家

首先,您可以了解图书馆作者的策略:

foreach ($this->pool as $w) {
   $w->start(PTHREADS_INHERIT_ALL ^ PTHREADS_INHERIT_CLASSES);
}
这里使用的策略确保每个线程(工作线程)都获得框架的线程本地副本或正在加载的任何内容,但不会破坏从pthread派生的对象的功能


其次,要开始使用laravel功能(如服务提供商、Facades、Helper等),您需要初始化laravel

我在tests/CreatesApplication.php文件中查看了如何初始化应用程序。下面的代码显示了如何使用PHP7.2为Laravel5.7实现这一点

重要提示:指定Autoloader.php和app.php相对于Autoloader.php文件位置的正确路径。

namespace-App\Console\Commands;
使用工人;
使用light\Contracts\Console\Kernel;
类自动加载程序扩展工作程序
{
公共功能运行()
{
需要_DIR__.'/../../../../vendor/autoload.php';
$app=require/uuuu DIR\uuuu.'/../../../../bootstrap/app.php';
$app->make(内核::类)->bootstrap();
}
公共函数启动($options=PTHREADS\u INHERIT\u ALL)
{
返回parent::start(PTHREADS\u INHERIT\u INI);
}
}
namespace-App\Console\Commands;
使用例外;
使用螺纹;
类运算符读取扩展线程
{
/**
*@var运算符读取
*/
私人运营商;
私有$错误;
公共函数构造(运算符读取$operator)
{
$this->operator=$operator;
}
公共功能运行()
{
试一试{
$this->operator->handle();
}捕获(异常$Exception){
$this->error=(字符串)$exception;
}
}
公共函数getError(){
返回$this->error;
}
}
namespace-App\Console\Commands;
类运算符读取
{
私人一元;
公共功能构造($i)
{
$this->i=$i;
}
公共函数句柄()
{
睡眠(rand(1,3));
如果(app()->isBooted()){
echo$this->i.PHP\u EOL;
}
}
}

现在,您可以将Laravel与pthreads一起使用:

namespace-App\Console\Commands;
使用游泳池;
使用照明\控制台\命令;
类测试扩展命令
{
受保护的$description='test';
受保护的$签名='测试';
公共函数句柄()
{
$operators=[];
对于($i=0;$isubmit($thread);
}
而($pool->collect());
$pool->shutdown();
}
}
$php artisan测试
1.
2.
4.
0
3.

提供一些说明这将禁用继承类(与任何laravel类一样)的使用,就像没有框架一样