2016-01-09 96 views
7

我很難弄清楚我的Laravel應用程序到底發生了什麼。它在本地功能完全(Mac,php 5.5.26),所以我一直通過僞造(php 5.6.15)在我的數字海洋液滴上測試應用程序。Laravel隊列反序列化問題

我正在使用this package發送推送通知到消耗我的Laravel api的前端應用程序。爲了更快地完成api調用,我將推送通知委託給本地運行良好的Laravel隊列,但是當我在數字海洋上進行測試時,我收到了此錯誤。

[2016-01-09 20:34:09] stage.ERROR: exception 'ErrorException' with message 'Erroneous data format for unserializing 'ArrayIterator'' in {path}/{project}/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php:74 

我正在使用數據庫驅動程序。下面是序列化的工作排在我的本地數據庫的工作表...

{"job":"Illuminate\\Queue\\[email protected]","data":{"command":"O:28:\"App\\Jobs\\Push\\SendPushFollow\":4:{s:34:\"\u0000App\\Jobs\\Push\\SendPushFollow\u0000push\";O:27:\"App\\Helpers\\Push\\PushFollow\":5:{s:14:\"\u0000*\u0000ios_devices\";O:50:\"Sly\\NotificationPusher\\Collection\\DeviceCollection\":1:{s:7:\"\u0000*\u0000coll\";C:13:\"ArrayIterator\":21:{x:i:0;a:0:{};m:a:0:{}}}s:16:\"\u0000*\u0000android_count\";i:2;s:12:\"\u0000*\u0000ios_count\";i:0;s:18:\"\u0000*\u0000android_devices\";O:50:\"Sly\\NotificationPusher\\Collection\\DeviceCollection\":1:{s:7:\"\u0000*\u0000coll\";C:13:\"ArrayIterator\":953:{x:i:0;a:2:{s:162:\"APA91bGCWGMQlh6kMYVVPUjnkDKtgLmYBiHxv1WY4r3zPjmXO3C0_UcvBCoOWkiiiC8lBc4JRILBDo29K0BtGNQKKQAA46tCvJocklTp3u7_x4q8Nz9CubNuqJN_OaMRBys_HWUqNXPLzIbodjEHV_bTc-CUKurnRQ\";O:35:\"Sly\\NotificationPusher\\Model\\Device\":2:{s:42:\"\u0000Sly\\NotificationPusher\\Model\\Device\u0000token\";s:162:\"APA91bGCWGMQlh6kMYVVPUjnkDKtgLmYBiHxv1WY4r3zPjmXO3C0_UcvBCoOWkiiiC8lBc4JRILBDo29K0BtGNQKKQAA46tCvJocklTp3u7_x4q8Nz9CubNuqJN_OaMRBys_HWUqNXPLzIbodjEHV_bTc-CUKurnRQ\";s:13:\"\u0000*\u0000parameters\";a:0:{}}s:162:\"APA91bEUPnqR3t8KDhE0YTsc_HnkoxFvw4WyUpRxISm2A_2Ep7orCySVKsh2oRVSQTVOhSZS_yYjP7gup5vEnuwz2JPXcxHCc19P98E2QVNyjhTP_NvDkcfkogVIHAHpgelyGRuvm8aQ-SAs9uirxd3iBHPlZb16zA\";O:35:\"Sly\\NotificationPusher\\Model\\Device\":2:{s:42:\"\u0000Sly\\NotificationPusher\\Model\\Device\u0000token\";s:162:\"APA91bEUPnqR3t8KDhE0YTsc_HnkoxFvw4WyUpRxISm2A_2Ep7orCySVKsh2oRVSQTVOhSZS_yYjP7gup5vEnuwz2JPXcxHCc19P98E2QVNyjhTP_NvDkcfkogVIHAHpgelyGRuvm8aQ-SAs9uirxd3iBHPlZb16zA\";s:13:\"\u0000*\u0000parameters\";a:0:{}}};m:a:0:{}}}s:10:\"\u0000*\u0000message\";O:36:\"Sly\\NotificationPusher\\Model\\Message\":2:{s:42:\"\u0000Sly\\NotificationPusher\\Model\\Message\u0000text\";s:32:\"John Smith is now following you!\";s:10:\"\u0000*\u0000options\";a:12:{s:5:\"badge\";i:1;s:5:\"sound\";s:12:\"example.aiff\";s:12:\"actionLocKey\";s:20:\"Action button title!\";s:6:\"locKey\";s:13:\"localized key\";s:7:\"locArgs\";a:2:{i:0;s:14:\"localized args\";i:1;s:14:\"localized args\";}s:11:\"launchImage\";s:9:\"image.jpg\";s:5:\"title\";s:21:\"InMyBag: New Follower\";s:6:\"custom\";a:0:{}s:5:\"notId\";i:7;s:5:\"style\";s:5:\"inbox\";s:8:\"ledColor\";a:4:{i:0;i:0;i:1;i:0;i:2;i:255;i:3;i:0;}s:16:\"vibrationPattern\";a:3:{i:0;i:500;i:1;i:250;i:2;i:500;}}}}s:5:\"queue\";N;s:5:\"delay\";N;s:6:\"\u0000*\u0000job\";N;}"}} 

,這裏是從服務器上表中的行條目...

{"job":"Illuminate\\Queue\\[email protected]","data":{"command":"O:28:\"App\\Jobs\\Push\\SendPushFollow\":4:{s:34:\"\u0000App\\Jobs\\Push\\SendPushFollow\u0000push\";O:27:\"App\\Helpers\\Push\\PushFollow\":5:{s:14:\"\u0000*\u0000ios_devices\";O:50:\"Sly\\NotificationPusher\\Collection\\DeviceCollection\":1:{s:7:\"\u0000*\u0000coll\";O:13:\"ArrayIterator\":0:{}}s:16:\"\u0000*\u0000android_count\";i:2;s:12:\"\u0000*\u0000ios_count\";i:0;s:18:\"\u0000*\u0000android_devices\";O:50:\"Sly\\NotificationPusher\\Collection\\DeviceCollection\":1:{s:7:\"\u0000*\u0000coll\";O:13:\"ArrayIterator\":2:{s:162:\"APA91bGCWGMQlh6kMYVVPUjnkDKtgLmYBiHxv1WY4r3zPjmXO3C0_UcvBCoOWkiiiC8lBc4JRILBDo29K0BtGNQKKQAA46tCvJocklTp3u7_x4q8Nz9CubNuqJN_OaMRBys_HWUqNXPLzIbodjEHV_bTc-CUKurnRQ\";O:35:\"Sly\\NotificationPusher\\Model\\Device\":2:{s:42:\"\u0000Sly\\NotificationPusher\\Model\\Device\u0000token\";s:162:\"APA91bGCWGMQlh6kMYVVPUjnkDKtgLmYBiHxv1WY4r3zPjmXO3C0_UcvBCoOWkiiiC8lBc4JRILBDo29K0BtGNQKKQAA46tCvJocklTp3u7_x4q8Nz9CubNuqJN_OaMRBys_HWUqNXPLzIbodjEHV_bTc-CUKurnRQ\";s:13:\"\u0000*\u0000parameters\";a:0:{}}s:162:\"APA91bEUPnqR3t8KDhE0YTsc_HnkoxFvw4WyUpRxISm2A_2Ep7orCySVKsh2oRVSQTVOhSZS_yYjP7gup5vEnuwz2JPXcxHCc19P98E2QVNyjhTP_NvDkcfkogVIHAHpgelyGRuvm8aQ-SAs9uirxd3iBHPlZb16zA\";O:35:\"Sly\\NotificationPusher\\Model\\Device\":2:{s:42:\"\u0000Sly\\NotificationPusher\\Model\\Device\u0000token\";s:162:\"APA91bEUPnqR3t8KDhE0YTsc_HnkoxFvw4WyUpRxISm2A_2Ep7orCySVKsh2oRVSQTVOhSZS_yYjP7gup5vEnuwz2JPXcxHCc19P98E2QVNyjhTP_NvDkcfkogVIHAHpgelyGRuvm8aQ-SAs9uirxd3iBHPlZb16zA\";s:13:\"\u0000*\u0000parameters\";a:0:{}}}}s:10:\"\u0000*\u0000message\";O:36:\"Sly\\NotificationPusher\\Model\\Message\":2:{s:42:\"\u0000Sly\\NotificationPusher\\Model\\Message\u0000text\";s:32:\"John Smith is now following you!\";s:10:\"\u0000*\u0000options\";a:12:{s:5:\"badge\";i:1;s:5:\"sound\";s:12:\"example.aiff\";s:12:\"actionLocKey\";s:20:\"Action button title!\";s:6:\"locKey\";s:13:\"localized key\";s:7:\"locArgs\";a:2:{i:0;s:14:\"localized args\";i:1;s:14:\"localized args\";}s:11:\"launchImage\";s:9:\"image.jpg\";s:5:\"title\";s:21:\"InMyBag: New Follower\";s:6:\"custom\";a:0:{}s:5:\"notId\";i:10;s:5:\"style\";s:5:\"inbox\";s:8:\"ledColor\";a:4:{i:0;i:0;i:1;i:0;i:2;i:255;i:3;i:0;}s:16:\"vibrationPattern\";a:3:{i:0;i:500;i:1;i:250;i:2;i:500;}}}}s:5:\"queue\";N;s:5:\"delay\";N;s:6:\"\u0000*\u0000job\";N;}"}} 

我跑了一個在線文字DIF與發現該Blob的序列化數據部分在ArrayIterator部分中出現了一些差異(如錯誤日誌指出的那樣)。看起來不同之處在於我的本地機器和服務器之間的PushNotification :: DeviceCollection對象序列化方式不同。在我的測試中,我使用相同的POST數據在本地和服務器上打api端點,以確保序列化的輸出應該是相同的,但不是。

我不知道如何去解決這個問題。我不知道這在技術上是否與PushNotification軟件包有關(我沒有看到與此問題有關的任何錯誤報告),還是僅僅是其他的東西我正在掩飾。

另外,就一個方面說明,我使用另一個隊列來發送KeenIO事件,使用與此Push結構類似的類結構,並且它沒有任何問題,所以我真的覺得它必須是PushNotification的問題包什麼...任何想法?


解決

因此,原來它是用PHP版本的問題。我的服務器正在運行5.6,當我在PHP 7.0上創建另一個小程序並克隆服務器時,一切都開始運行。我離開了原來的服務器並運行,所以它可以作爲使用beanstalkd的推送通知的隊列處理器,並且像冠軍一樣工作。


編輯

我使用監督員運行隊列:工作命令。我已經運行

php artisan queue:restart 

我確定當通過命令行執行kill命令來運行新測試時,工匠進程已完全停止。再次,隊列工作人員對服務器上的KeenIO作業沒有任何問題,只是推送通知作業。

這裏的作業類:

<?php namespace App\Jobs\Push; 

use Illuminate\Queue\SerializesModels; 
use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Contracts\Bus\SelfHandling; 
use Illuminate\Contracts\Queue\ShouldQueue; 
use App\Jobs\SendPushEvent; 
use App\Helpers\Push\PushFollow; 

class SendPushFollow extends SendPushEvent implements SelfHandling, ShouldQueue { 
    use InteractsWithQueue, SerializesModels; 
    private $push; 
    /** 
    * Create a new job instance. 
    * 
    * @return void 
    */ 
    public function __construct($follower, $followee) 
    { 
     $this->push = new PushFollow($follower, $followee); 
    } 

    /** 
    * Execute the job. 
    * 
    * @return void 
    */ 
    public function handle(){ 
     $this->push->send(); 
    } 
} 

下面是它具有所有PushNotification邏輯在其中的PushFollow類。

<?php namespace App\Helpers\Push; 

use PushNotification; 
use App\Helpers\Push\Push; 
use Log; 

class PushFollow extends Push { 
    /** 
    * This builds the default notification. 
    * @param array $data the passed in data array 
    * @param [type] $type android or iOS 
    */ 
    public function __construct ($follower, $followee) { 
     $_ios_devices = []; 
     $_android_devices = []; 
     $this->ios_count = 0; 
     $this->android_count = 0; 

     foreach($followee->devices as $_device){ 
      if($_device->platform == "ios"){ 
       $_ios_devices[] = PushNotification::Device($_device->identifier); 
       $this->ios_count++; 
      } elseif ($_device->platform == "android") { 
       $_android_devices[] = PushNotification::Device($_device->identifier); 
       $this->android_count++; 
      } 
     } 

     Log::info('FINISHED BUILDING THE LISTS!!!'); 

     $this->ios_devices = PushNotification::DeviceCollection($_ios_devices); 
     $this->android_devices = PushNotification::DeviceCollection($_android_devices); 

     Log::info('SET THE DEVICE COLLECTIONS'); 

     $this->message = PushNotification::Message($follower->profile->name.' is now following you!',[ 
      'badge' => 1, 
      'sound' => 'example.aiff', 
      'actionLocKey' => 'Action button title!', 
      'locKey' => 'localized key', 
      'locArgs' => array(
       'localized args', 
       'localized args', 
      ), 
      'launchImage' => 'image.jpg', 
      'title' => env('APP_NAME').': New Follower', 
      'custom' => [], 
      'notId' => rand(1, 20), 
      'style' => 'inbox', 
      /* 
      'actions' => [ 
       ['icon' => "emailGuests", 'title' => "EMAIL GUESTS", 'callback' => "app.emailGuests"], 
       [ 'icon' => "snooze", 'title' => "SNOOZE", 'callback' => "app.snooze"], 
      ], 
      */ 
      'ledColor' => [0, 0, 255, 0], 
      'vibrationPattern' => [500, 250, 500], 

     ]); 

     Log::info('SET THE MESSAGE'); 
    } 

    public function send() { 
     Log::info('CALLING THE SEND METHOD'); 
     if($this->android_count) { 
      PushNotification::app(env('ANDROID_PUSH_NAME')) 
       ->to($this->android_devices) 
       ->send($this->message); 
     } 

     if($this->ios_count){ 
      PushNotification::app(env('IOS_PUSH_NAME')) 
       ->to($this->ios_devices) 
       ->send($this->message); 
     } 
    } 
} 

這裏是我所有不同的推動類擴展的Push類。

<?php namespace App\Helpers\Push; 

abstract class Push { 
    protected $ios_devices; 
    protected $android_count; 
    protected $ios_count; 
    protected $android_devices; 
    protected $message; 
} 

哦,這裏還有堆棧跟蹤。

#0 [internal function]: Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(2, 'Erroneous data ...', '/home/forge/def...', 74, Array) 
#1 {path_to_project}/vendor/laravel/framework/src/Illuminate/Queue/CallQueuedHandler.php(74): unserialize('O:28:"App\\Jobs\\...') 
#2 {path_to_project}/vendor/laravel/framework/src/Illuminate/Queue/Jobs/Job.php(212): Illuminate\Queue\CallQueuedHandler->failed(Array) 
#3 {path_to_project}/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(261): Illuminate\Queue\Jobs\Job->failed() 
#4 {path_to_project}/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(201): Illuminate\Queue\Worker->logFailedJob('database', Object(Illuminate\Queue\Jobs\DatabaseJob)) 
#5 {path_to_project}/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(159): Illuminate\Queue\Worker->process('database', Object(Illuminate\Queue\Jobs\DatabaseJob), '5', 0) 
#6 {path_to_project}/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(111): Illuminate\Queue\Worker->pop(NULL, 'keen,push_notif...', 0, 3, '5') 
#7 {path_to_project}/vendor/laravel/framework/src/Illuminate/Queue/Worker.php(87): Illuminate\Queue\Worker->runNextJobForDaemon(NULL, 'keen,push_notif...', 0, 3, '5') 
#8 {path_to_project}/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(103): Illuminate\Queue\Worker->daemon(NULL, 'keen,push_notif...', 0, 128, 3, '5') 
#9 {path_to_project}/vendor/laravel/framework/src/Illuminate/Queue/Console/WorkCommand.php(71): Illuminate\Queue\Console\WorkCommand->runWorker(NULL, 'keen,push_notif...', 0, 128, true) 
#10 [internal function]: Illuminate\Queue\Console\WorkCommand->fire() 
#11 {path_to_project}/vendor/laravel/framework/src/Illuminate/Container/Container.php(507): call_user_func_array(Array, Array) 
#12 {path_to_project}/vendor/laravel/framework/src/Illuminate/Console/Command.php(150): Illuminate\Container\Container->call(Array) 
#13 {path_to_project}/vendor/symfony/console/Command/Command.php(256): Illuminate\Console\Command->execute(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 
#14 {path_to_project}/vendor/laravel/framework/src/Illuminate/Console/Command.php(136): Symfony\Component\Console\Command\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 
#15 {path_to_project}/vendor/symfony/console/Application.php(837): Illuminate\Console\Command->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 
#16 {path_to_project}/vendor/symfony/console/Application.php(189): Symfony\Component\Console\Application->doRunCommand(Object(Illuminate\Queue\Console\WorkCommand), Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 
#17 {path_to_project}/vendor/symfony/console/Application.php(120): Symfony\Component\Console\Application->doRun(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 
#18 {path_to_project}/vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(107): Symfony\Component\Console\Application->run(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 
#19 {path_to_project}/artisan(36): Illuminate\Foundation\Console\Kernel->handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 
#20 {main} 
+0

你是否在守護這個過程?如果您使用Upstart或Supervisord之類的東西,您是否嘗試重置守護進程?我知道,如果您在運行守護程序命令後更改了腳本,則需要重置該腳本,否則它將不會收到更改。 – maiorano84

+0

@ maiorano84看到我的編輯。 – Panda4Man

回答

1

所以事實證明這是一個PHP版本的問題。我的服務器正在運行5.6,當我在PHP 7.0上創建另一個小程序並克隆服務器時,一切都開始運行。我離開了原來的服務器並運行,所以它可以作爲使用beanstalkd的推送通知的隊列處理器,並且像冠軍一樣工作。