在Laravel项目中,我试图通过推送器播放名为“已关闭”的事件。
在我的控制器中,我打电话:
<script type="text/javascript">
var strValue = "@Model.YourObject"; //You set value here from your Model to any JavaScript object.
</script>
我的App \ Jobs \ Closing.php:
App\Jobs\Closing::dispatch();
我的app \ Jobs \ Close.php:
<?php
namespace App\Jobs;
use App\Jobs\Close;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class Closing implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct(){}
public function handle()
{
$delay = mt_random(10,20);
Close::dispatch()->delay(now()->addSeconds($delay));
}
}
我的应用\活动\ Closed.php:
<?php
namespace App\Jobs;
use App\Events\Closed;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
class Close implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct(){}
public function handle()
{
event(new Closed());
}
}
此时我需要解释两种强制性情况。
第一个是我需要将作业Close类创建为一个作业,因为我需要延迟执行任务关闭。我可以看到实现这种“延迟”的唯一方法是使用Job Class。
第二个是我选择在Closed类中实现“ShouldBroadcastNow”而不是“ShouldBroadcast”,因为我不想将广播排队。
现在问题是跑完后:
<?php
namespace App\Events;
use Illuminate\Queue\SerializesModels;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcastNow;
class Closed implements ShouldBroadcastNow
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public function __construct(){}
public function broadcastOn()
{
return ['updates'];
}
public function broadcastAs()
{
return 'closed';
}
public function broadcastWith()
{
return ['message' => 'Is Closed!'];
}
}
我在命令控制台上输入以下输出:
处理:App \ Jobs \ Closing
已处理:App \ Jobs \ Closing
处理:App \ Jobs \ Close
处理:App \ Events \ Closed
失败:App \ Events \ Closed
失败:App \ Jobs \ Close
我发现奇怪的第一件事是App \ Events \ Closed尽管它实现了“ShouldBroadcastNow”,但仍然排队。
在laravel.log上,它似乎发生在PusherBroadcaster.php的BroadcastException。
但如果在控制器中我做了:
php artisan queue:work --tries=1
通过推送器将事件正确地广播到客户端浏览器。
出了什么问题?
还有其他方法可以延迟没有工作的“关闭”吗?
目的是拥有以下工作流程:
1 - 我们有一个名为“关闭”的事件是另一个名为“已关闭”的事件;
2 - 我们有一个名为“close”的任务,在事件“关闭”后“x”秒发生,其中“x”是一个随机数;
3 - 执行“关闭”任务后,我们广播事件“已关闭”。
感谢您关注我的问题
答案 0 :(得分:0)
与此同时,我发现这是一个众所周知的问题(https://github.com/laravel/framework/issues/16478)。
可以通过两种方式解决:
1 - 编辑相关的php.ini文件(在我的情况下是mamp / conf / php7.0.9 / php.ini和mamp / bin / php / php7.0.9 / php.ini)指向的位置卷曲证书;
2 - 编辑config / broadcasting.php(在推送选项中将加密设置为false)。