2

更新 - これはbeanstalkdに絞り込まれ、sync動作します

実稼働環境でキューに入れられたコマンドを実行しようとすると、次のエラーが表示されます。

    exception 'ErrorException' with message 'unserialize(): Function spl_autoload_call() hasn't defined the class it was called for' 
in /home/forge/default/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php:74

beanstalkd ドライバーとデータベース ドライバーの両方を試しましたが、変化はありません。簡単にするために、次のコマンドを使用しています。

<?php namespace App\Commands;

use App\Commands\Command;

use App\User;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Queue\ShouldBeQueued;

class TestQueueCommand extends Command implements SelfHandling, ShouldBeQueued {

    use InteractsWithQueue, SerializesModels;
    /**
     * @var User
     */
    private $user;

    /**
     * Create a new command instance.
     *
     * @param User $user
     */
    public function __construct(User $user)
    {
        //
        $this->user = $user;
    }

    /**
     * Execute the command.
     *
     * @return void
     */
    public function handle()
    {
        \Log::info("You gave me " . $this->user->fullName());
    }

}

発送コード:

get('queue-test', function()
{
    Bus::dispatch(new TestQueueCommand(User::first()));
});

これは私のホームステッド環境では機能しますが、本番環境 (デジタル オーシャン、フォージ) では失敗します。複数の beanstalkd ワーカーがあり、それらを再起動しようとしました。私も実行しphp artisan queue:flushました。

エラーが発生しているコードは次のとおりです(ソースから):

/**
     * Handle the queued job.
     *
     * @param  \Illuminate\Contracts\Queue\Job  $job
     * @param  array  $data
     * @return void
     */
    public function call(Job $job, array $data)
    {
        $command = $this->setJobInstanceIfNecessary(
            $job, unserialize($data['command'])
        );

        $this->dispatcher->dispatchNow($command, function($handler) use ($job)
        {
            $this->setJobInstanceIfNecessary($job, $handler);
        });

        if ( ! $job->isDeletedOrReleased())
        {
            $job->delete();
        }
    }
4

1 に答える 1

1

過去に、シリアル化解除中に同様の問題に遭遇しました。問題は、デフォルトの Beanstalk ジョブ サイズ (65,535 バイト) でした。これは、シリアル化されるクラスに保持する必要がある多くのプロパティが含まれている場合、十分に大きくない可能性があります (シリアル化された文字列のサイズを増やし、ストレージに 65K を超える容量を使用します)。

これを解決するには、設定ファイル ( )-zでオプションを使用して、サイズを 131,072 または 262,144 バイトに設定してみてください。/etc/default/beanstalkd

BEANSTALKD_EXTRA="-z 262144"

その後、サービスを再起動する必要があります。

また、使用しているディストリビューションによっては、構成ファイルのパスが異なる場合があることに注意してください。

また、Digital Ocean を使用しているので、そのドキュメントが役立つ場合があります。

于 2015-04-16T21:29:29.333 に答える