Google рдХреНрд▓рд╛рдЙрдб рдореИрд╕реЗрдЬрд┐рдВрдЧ - PHP рдореЗрдВ рдмреИрдХрдПрдВрдб рд▓рд┐рдЦрдирд╛

рдЫрд╡рд┐ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо GCM рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреВрд░реНрдг-рд╡рд░реНрдЧ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЬреЛ:



Google рдХреНрд▓рд╛рдЙрдб рдореИрд╕реЗрдЬрд┐рдВрдЧ - рд▓рдШреБ рдФрд░ рд╕реНрдкрд╖реНрдЯ


рдЬреАрд╕реАрдПрдо рдПрдХ рддреНрд╡рд░рд┐рдд рд╕рдВрджреЗрд╢ рд╕реЗрд╡рд╛ рд╣реИред рдорд╛рдирдХ рдорддрджрд╛рди рдФрд░ рд▓рдВрдмреЗ рдорддрджрд╛рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдХрд▓реНрдк, рд▓реЗрдХрд┐рди рдЕрдирдиреНрдп рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдкреВрд░рдХред Google рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд╕рдВрджреЗрд╢ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡рд┐рддрд░рдг рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдФрд░ рдЧрддрд┐ CDMDM рдХреЗ рдкреВрд░реНрд╡рдЬреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╕ рд╕реНрдерд╛рди рдмрди рдЧрдИ рд╣реИ)ред рдпрджрд┐ рдлреЛрди рдкрд░ рдЗрдВрдЯрд░рдиреЗрдЯ рдмрдВрдж рд╣реИ, рддреЛ рд╕рдВрджреЗрд╢ 4 рд╕рдкреНрддрд╛рд╣ рддрдХ GCM рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлреЛрди рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ, рдЫреБрдЯреНрдЯреА рдкрд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдЧрдорди рдкрд░, рдЙрд╕реЗ рдЕрдм рд╕рдВрджреЗрд╢ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, GCM рдХреЛ рдХреЗрд╡рд▓ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╡рд┐рддрд░рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдЬреИрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рд╛рдердорд┐рдХ рдорддрджрд╛рди - рд╕рд░реНрд╡рд░ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ N рдорд┐рдирдЯ рдореЗрдВ HTTP рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреЛрдИ рднреА Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди GCM рдХреЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЦреБрдж рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрдВрдЯрд░рдиреЗрдЯ рдЪрд╛рд▓реВ рд╣реЛрдиреЗ рдХреЗ рд╕рд╛рде, рдХреБрдЫ рд╣реА рд╕реЗрдХрдВрдб рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рдЖрд╡реЗрджрди GCM рд╕рд░реНрд╡рд░ рд╕реЗ RegistrationId рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрд╕рдХреЗ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдирддреАрдЬрддрди, рд╕рд░реНрд╡рд░ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдбрд┐рд╡рд╛рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдЬреЛ рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЙрдирдХрд╛ RegistrationId рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред

рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рд░реНрд╡рд░ рдХреЛрдб рдХреЛ рдЬреАрд╕реАрдПрдо рд╕рд░реНрд╡рд░ рдореЗрдВ рдЬреЙрдиреНрд╕ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ POST рдЕрдиреБрд░реЛрдз рднреЗрдЬрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рдХреБрдВрдЬреА => рдорд╛рди рднреА рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди json рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ)ред рд╕рд░реНрд╡рд░ рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдореЗрдВ json рднреА рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдХреЗ рд╣рдо рд╕рдордЭ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рд╕рдВрджреЗрд╢ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХреНрдпрд╛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рд╣реБрдИ рд╣реИрдВред

рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ


рдЪрд▓реЛ рджреЛ рдХрдХреНрд╖рд╛рдПрдВ GcmPayload рдФрд░ GcmSender рдмрдирд╛рдПрдВред

рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ
class GcmPayload { public function __construct($regId, $jsons) {} public $regId; public $jsons; } class GcmSender { public function __construct($payloads) {} public function send() {} protected function getPackages() {} protected function isReadyToFlush($items, $json) {} public function onResponse($response, $info, RollingCurlRequest $request) {} } 



GCM рд╢рдмреНрджрд╛рд╡рд▓реА рдореЗрдВ, рдкреЗрд▓реЛрдб рд╡рд╣ рдбреЗрдЯрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЛ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдбреЗрдЯрд╛ рдХреБрдВрдЬреА рдХреЗ рдореВрд▓реНрдп рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕рдХреА рд╕реАрдорд╛ 4096 рдмрд╛рдЗрдЯреНрд╕ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдЕрдиреБрд░реЛрдз рдкреНрд░рд╛рд░реВрдк рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА ред

GcmPayload - рдПрдХ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдореЙрдбрд▓ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдПрдХ RegistrationIdред $ Jsons рдлрд╝реАрд▓реНрдб рдХреЛ рдЗрд╕ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЛ рднреЗрдЬреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рд╡рд╛рд▓реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ json'ov рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд╕рд╛рде рдЖрд░рдВрднреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреЗ рдмрд╛рд╣рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣:

рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ
 $recipients = $messagesRepository->getRecipientsWithNewMessages(); $payloads = array(); foreach ($recipients as $recipient) { $jsons = array(); foreach ($recipient->messages as $message) { $jsons[] = json_encode($message); } $payloads[] = new GcmPayload($recipient['regId'], $jsons); } $gcm = new GcmSender(); $gcm->send($payloads); 



GcmSender


рд▓рдЧрд╛рддрд╛рд░ рдФрд░ рд╡рд░реНрдЧ рдХреЗ рд╕рджрд╕реНрдп

const GCM_API_KEY = 'рдЖрдкрдХреА рдПрдкреА рдХреБрдВрдЬреА'; // Google API рдХреЙрдиреНрд╕реЛрд▓ рдкреГрд╖реНрда рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
const CURL_TIMEOUT = 10; // Google рд╕рд░реНрд╡рд░ рд╕реЗрдХрдВрдб рдореЗрдВ
const GCM_MAX_DATA_SIZE = 4096; // рднреЗрдЬреЗ рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд╕реАрдорд┐рдд рдХрд░реЗрдВ
const GCM_SERVER_URL = 'https://android.googleapis.com/gcm/send'; // GCM рд╕рд░реНрд╡рд░ рдХрд╛ рдкрддрд╛
const GCM_MAX_CONNECTIONS = 10; // рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛

const KEY_REG_IDS = 'registration_ids'; // json рдЕрдиреБрд░реЛрдз рдореЗрдВ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреБрдВрдЬреА
const KEY_DATA = 'рдбреЗрдЯрд╛'; // json рдЕрдиреБрд░реЛрдз рдореЗрдВ рдбреЗрдЯрд╛ рдХреБрдВрдЬреА
const KEY_ITEMS = 'рдЖрдЗрдЯрдо'; // рдбреЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╣рдорд╛рд░реА рдбреЗрдЯрд╛ рд╕рд░рдгреА рд╡рд╛рд▓реА рдХреБрдВрдЬреА
const REGID_PLACEHOLDER = '_REGID_'; // рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдкрдВрдЬреАрдХрд░рдг рдХреЗ рд▓рд┐рдП json рдЕрдиреБрд░реЛрдз рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ
const ITEMS_PLACEHOLDER = '_ITEMS_'; // json рдЕрдиреБрд░реЛрдз рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХреА рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░

const GCM_ERROR_NOTRcture = 'NotRegistered'; // рддреНрд░реБрдЯрд┐ рдХреЗ рд▓рд┐рдП рдирд┐рд░рдВрддрд░ рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛

рд╕рдВрд░рдХреНрд╖рд┐рдд $ _template; // json рдЕрдиреБрд░реЛрдз рдЯреЗрдореНрдкрд▓реЗрдЯ
рд╕рдВрд░рдХреНрд╖рд┐рдд $ _baseDataSize; // рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдЖрдХрд╛рд░, рдЬрд┐рд╕рдореЗрдВ рдЖрдЗрдЯрдо рдХреБрдВрдЬреА, рдХреЛрд╖реНрдардХ рдЙрджреНрдзрд░рдг рдЪрд┐рд╣реНрди рдЖрджрд┐ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдбрд┐рдЬрд╛рдЗрдирд░

рдирд┐рд░реНрдорд╛рддрд╛ рдПрдХ рдЕрдиреБрд░реЛрдз рдЯреЗрдореНрдкрд▓реЗрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЧреЗрдЯрдкреЗрдХреЗрдЬ рд╡рд┐рдзрд┐ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐ рдбреЗрдЯрд╛ 4096 рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕реАрдорд╛ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рднреА рдпрд╛рдж рд░рдЦрдирд╛ рдФрд░ рд▓реЗрдирд╛ рд╣реЛрдЧрд╛: {"рдЖрдЗрдЯрдо": []}

рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ
 public function __construct() { $dataObj = '{"'.self::KEY_ITEMS.'": ['.self::ITEMS_PLACEHOLDER.']}'; $this->_template = '{ "'.self::KEY_REG_IDS.'": ["'.self::REGID_PLACEHOLDER.'"], "'.self::KEY_DATA.'": '.$dataObj.' }'; $baseDataJson = str_replace(self::ITEMS_PLACEHOLDER, '', $dataObj); $this->_baseDataSize = strlen($baseDataJson); } 



рд╡рд┐рдзрд┐ рднреЗрдЬреЗрдВ

рдЬреАрд╕реАрдПрдо рд╕рд░реНрд╡рд░ рдкрд░ рд╕реАрдзреЗ рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡рд┐рдзрд┐ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЧреЗрдЯрдкреЗрдХреЗрдЬ рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдбреЗрдЯрд╛ рдкреИрдХреЗрдЯ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдкреЛрд╕реНрдЯ рдбреЗрдЯрд╛ рдХреЛ рдЬреЛрдВрд╕ рдкреНрд░рд╛рд░реВрдк (рдПрдХ рдкреИрдХреЗрдЯ - рдПрдХ рдЕрдиреБрд░реЛрдз) рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ 4096 рдмрд╛рдЗрдЯ рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рддреА рд╣реИред рд╢реЗрд╖ рд╡рд┐рдзрд┐ рдЕрджреНрднреБрдд рд░реЛрд▓рд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЖрд░рдВрднреАрдХрд░рдг рд╣реИ, рдЬреЛ рдХрд░реНрд▓_рдореБрд▓реНрддрд┐_рд╕реЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдЕрдВрдЬрд╛рдо рджреЗрддреА рд╣реИ рдФрд░ рдЖрдкрдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдФрд░ рдкрд╛рд░рджрд░реНрд╢реА рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдХреЙрд▓рдмреИрдХ рд╡рд┐рдзрд┐ рдСрдирд░рд╕реНрдкреЛрдВрд╕ рдХреЗ рд╕рд╛рде RollingCurl рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рднреЗрдЬрдиреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рдмрд╛рдж рдбреЗрдЯрд╛ рд╕реНрд╡рдпрдВ рднреЗрдЬ рд░рд╣рд╛ рд╣реИред

рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ
 /** * @param GcmPayload[] $payloads */ public function send($payloads) { $packages = self::getPackages($payloads); if (!$packages || count($packages) == 0) return; $rc = new RollingCurl(array($this, 'onResponse')); $headers = array('Authorization: key='.self::GCM_API_KEY, 'Content-Type: application/json'); $rc->__set('headers', $headers); $rc->options = array( CURLOPT_SSL_VERIFYPEER => false, //   CURLOPT_RETURNTRANSFER => true, //,        CURLOPT_CONNECTTIMEOUT => self::CURL_TIMEOUT, //      CURLOPT_TIMEOUT => self::CURL_TIMEOUT); //     curl foreach ($packages as $package) { $rc->request(self::GCM_SERVER_URL, 'POST', $package); } $rc->execute(self::GCM_MAX_CONNECTIONS); } 



GetPackages рд╡рд┐рдзрд┐

рдЗрд╕ рдкрджреНрдзрддрд┐ рдореЗрдВ, рдХреНрд▓рд╛рд╕ рдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдкреЗрд▓реЛрдб рдХреА рдПрдХ рд╕рд░рдгреА рдХреЛ рд╕реЙрд░реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдзреАрд░реЗ-рдзреАрд░реЗ рднрд░рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдкреИрдХреЗрдЯ 4096 рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕реАрдорд╛ рд╕реЗ рдЕрдзрд┐рдХ рди рд╣реЛ рдЬрд╛рдП рдпрд╛ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХрд╛ рдбреЗрдЯрд╛ рд╕рдорд╛рдкреНрдд рди рд╣реЛ рдЬрд╛рдПред рд╡реИрд╕реЗ, рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдПрдХ рдкреИрдХреЗрдЯ рдПрдХ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕рдореНрдореЗрд▓рди рд╕рдЪ рд╣реИ рдЬрдм рдПрдХ рдкрд╛рда рд╕рдВрджреЗрд╢ рдХреЗрд╡рд▓ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЛ рд╕рдВрдмреЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕рдореВрд╣ рд╡рд╛рд░реНрддрд╛рд▓рд╛рдкреЛрдВ рдореЗрдВ, рдПрдХ рд╣реА рд╕рдВрджреЗрд╢ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ GCM рдЗрд╕реЗ Registration_ids рдХреБрдВрдЬреА рдХреЗ рдорд╛рди рдореЗрдВ рдХрдИ RegistrationId рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдХреЗ рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдлрд┐рд░, рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЬрдЯрд┐рд▓рддрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдорд╛рдорд▓реЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╡рд╛рдкрд╕ getPackages рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, isReadyToFlush рдлрд╝рдВрдХреНрд╢рди рдпрд╣рд╛рдВ рд░реБрдЪрд┐ рдХрд╛ рд╣реИ, рдЬреЛ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЬ рдореЗрдВ рдПрдХ рдирдпрд╛ рдЬрд╕рди рдЬреЛрдбрд╝рдирд╛ 4096 рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕реАрдорд╛ рд╕реЗ рдкрд░реЗ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рд╣рд╛рдБ, рддреЛ рдкреИрдХреЗрдЬ рддреБрд░рдВрдд рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдирдП рдкреИрдХреЗрдЬ рдореЗрдВ рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ
 /** * @param GcmPayload[] $payloads * @return string[] */ protected function getPackages($payloads) { $packages = array(); foreach($payloads as $payload) { $template = str_replace(self::REGID_PLACEHOLDER, $payload->regId, $this->_template); $items = ''; foreach($payload->jsons as $json) { if ($this->isReadyToFlush($items, $json)) { $package = str_replace(self::ITEMS_PLACEHOLDER, $items, $template); $packages[] = $package; $items = ''; } if ($items) $items .= ','.$json; else $items = $json; } if ($items) { //        $package = str_replace(self::ITEMS_PLACEHOLDER, $items, $template); $packages[] = $package; } } return $packages; } 



OnResponse рд╡рд┐рдзрд┐

рдпрд╣ рди рдХреЗрд╡рд▓ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдмрд▓реНрдХрд┐ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рднреА рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдХрд┐рд╕ рдХрд╛рд░рдг рд╕реЗред onResponse рд╡рд╣ рдХреЙрд▓рдмреИрдХ рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдордиреЗ рд░реЛрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдореЗрдВ RollingCurl рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ред рдХреЛрд▓реНрдмреЗрдХ рддреАрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ:
  1. $ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ - рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛
  2. $ рдЬрд╛рдирдХрд╛рд░реА curl_getinfo рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИ php.net/manual/en/function.curl-getinfo.php рдФрд░ рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рдгреА рджреЗрддрд╛ рд╣реИ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ http рдХреЛрдб рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЕрдкрд▓реЛрдб / рдбрд╛рдЙрдирд▓реЛрдб рдЧрддрд┐ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рдХреЗрд╡рд▓ http рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб рджрд┐рд▓рдЪрд╕реНрдк рд╣реИред
  3. RollingCurlRequest $ рдЕрдиреБрд░реЛрдз - рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВред рд╣рдо $ рдЕрдиреБрд░реЛрдз рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ-> post_data


рдлрд╝рдВрдХреНрд╢рди рд╕реВрдЪреА рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдВрдЧреА:

рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ
 /** * @param string $response * @param array $info * @param \RollingCurl\RollingCurlRequest $request */ public function onResponse($response, $info, RollingCurlRequest $request) { //       $success = true; // json,     post $post = json_decode($request->post_data, true); if (json_last_error() != JSON_ERROR_NONE) { // json ,     . return; } // RegistratonId     $regId = $post[self::KEY_REG_IDS][0]; $items = $post[self::KEY_DATA][self::KEY_ITEMS]; //   $code = $info != null && isset($info['http_code']) ? $info['http_code'] : 0; //  : 2, 3, 4, 5 $codeGroup = (int)($code / 100); if ($codeGroup == 5) { //  5xx,  ,  GCM   ,    //TODO    Retry-After $success = false; } if ($code !== 200) { // http  ,    //           http://developer.android.com/google/gcm/gcm.html#response $success = false; } if (!$response || strlen(trim($response)) == null) { // ,  -   ,     . $success = false; } // ,    http://developer.android.com/google/gcm/gcm.html#success if ($response) { $json = json_decode($response, true); if (json_last_error() != JSON_ERROR_NONE) { //  json ,         $success = false; $json = array(); } } else { $json = array(); $success = false; } // failure     (    ,  failure    0  1) $failure = isset($json['failure']) ? $json['failure'] : null; // canonical_ids   ,     RegistrationId (     failure -   0  1). $canonicalIds = isset($json['canonical_ids']) ? $json['canonical_ids'] : null; //    ,      .   $success=true       if ($failure || $canonicalIds) { //results   .      ,      (     RegistrationId) $results = isset($json['results']) ? $json['results'] : array(); foreach($results as $result) { $newRegId = isset($result['registration_id']) ? $result['registration_id'] : null; $error = isset($result['error']) ? $result['error'] : null; if ($newRegId) { // $regId  $newRegId; //  ,  Update 1 } else if ($error) { if ($error == self::GCM_ERROR_NOTREGISTERED) { // $regId  ; } else { //  ,   //   ,       http://developer.android.com/google/gcm/gcm.html#error_codes } $success = false; } } } //  ,        . } 



рдЕрдкрдбреЗрдЯ рез
jcrow рдкрдВрдЬреАрдХрд░рдг рдХреЗ рдЕрджреНрдпрддрди рдХреЗ рджреМрд░рд╛рди рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрдиреЗ рд╡рд╛рд▓реЗ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИред рд╕реНрдерд┐рддрд┐: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЕрдирдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░ рджрд┐рдпрд╛ рдФрд░ рдлрд┐рд░ рд╕реЗ => рдлрд┐рд░ рд╕реЗ рдкрдВрдЬреАрдХреГрдд рдХрд┐рдпрд╛ рдФрд░ рдПрдХ рдирдпрд╛ рдкрдВрдЬреАрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ред рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рджреЛ рд░рд┐рдХреЙрд░реНрдб рд╣реИрдВред рдФрд░ рдПрдХ рдкреБрд░рд╛рдирд╛ RegistrationId рдХреЗ рд╕рд╛рде рд░рд┐рдХреЙрд░реНрдб, рдФрд░ рджреВрд╕рд░рд╛ рдирдП рдХреЗ рд╕рд╛рдеред рдпрджрд┐ рд╣рдо рджреЛрдиреЛрдВ RegistrationId рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддреЗ рд╣реИрдВ, рддреЛ рдкреБрд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ RegistrationId рдЖрдПрдЧрд╛ред рдирддреАрдЬрддрди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рдкрдВрдЬреАрдХрд░рдгрдЖрдИрдб рдХреЗ рд╕рд╛рде рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рджреЛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдВ рд╣реИрдВред

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк: рдпрджрд┐ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ RegistrationId рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рд╕реВрдЪрдХрд╛рдВрдХ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИред рдпрджрд┐ рдХреЛрдИ рдЗрдВрдбреЗрдХреНрд╕ рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╣рд░ рдмрд╛рд░ рджреЛ рд╕рдорд╛рди рд╕рдВрджреЗрд╢ рдорд┐рд▓рддреЗ рд╣реИрдВред

рд╕рдорд╛рдзрд╛рди: рдЬреИрд╕реЗ рд╣реА рд╣рдореЗрдВ рдСрдирд░рд╕реНрдкреЗрд╕ рдореЗрдВ рдПрдХ рдирдпрд╛ RegistrationId рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ, рд╣рдореЗрдВ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЗрд╕рдХреЗ рдЕрд╕реНрддрд┐рддреНрд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдФрд░ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╛ рддреЛ рдПрдХ рд░рд┐рдХреЙрд░реНрдб рд╣рдЯрд╛ рджреЗрдВ рдпрд╛ рдЕрдиреНрдп рддрд╛рд▓рд┐рдХрд╛рдУрдВ рд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛ рджреЛрдиреЛрдВ рд░рдЦреЗрдВред

рдЖрдЧреЗ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ?


рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдкрдиреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрджреЗрд╢ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ GCM рд╕рд░реНрд╡рд░ рдкрд░ рд╕рдлрд▓ рднреЗрдЬрдиреЗ рдХрд╛ рдорддрд▓рдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рджреНрд╡рд╛рд░рд╛ рд╕рдВрджреЗрд╢ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд╛рдкреНрддрд┐ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЫреБрдЯреНрдЯреА рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдпрд╛рдж рдХрд░рддреЗ рд╣реБрдП, рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдСрди-рдкреНрд░рд┐рдиреНрд╕реЗрд╕ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдлрд┐рд░ рдХрд╣рд╛рдБ? рдореЗрд░реЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ - рдорддрджрд╛рди рджреНрд╡рд╛рд░рд╛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╕рдордп рд╕реНрдЯреЗрдЯрд╕ рдбрд╛рд▓реЗрдВред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЛ рдПрдХ рд╣реА рдбреЗрдЯрд╛ рджреЛ рдмрд╛рд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдЖрд╡реЗрджрди рд╕реНрддрд░ рдкрд░, рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдбреЗрдЯрд╛ рдкрд╣рд▓реЗ рд╣реА рдкреНрд░рд╛рдкреНрдд рд╣реЛ рдЪреБрдХрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВред рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдореБрдЦреНрдп рд▓рд╛рдн рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рд╣реИ, рдбреЗрдЯрд╛ рд╣рдореЗрд╢рд╛ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рд╡рд┐рдкрдХреНрд╖ - рдпрд╛рддрд╛рдпрд╛рдд рдФрд░ рдмреИрдЯрд░реА рдХреА рдЦрдкрдд рдореЗрдВ рд╡реГрджреНрдзрд┐ред

рдпрджрд┐ рдЖрдкрдиреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рдкрдврд╝рд╛ рд╣реИ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред

рдЕрдВрддрднрд╛рд╖рдг


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рди рдХреЗрд╡рд▓ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реБрд░реБрдЖрддреА рдмрд┐рдВрджреБ рдмрди рдЬрд╛рдПрдЧрд╛, рдмрд▓реНрдХрд┐ рдЖрдкрдХреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдмреИрдХрдПрдВрдб рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рдордп рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рднреА рдорджрдж рдХрд░реЗрдЧрд╛ред

Source: https://habr.com/ru/post/In161305/


All Articles