J'utilise amazon PHP SDK V3.13.1, je dois envoyer au minimum 10 000 notifications push dans les 30 secondes. En ce moment j'utilise la méthode publishAsync
c'est plus rapide mais je ne l'ai pas envoyé dans le temps.
J'ai donc implémenté le socket et envoyé un paquet de 3500 push pour chaque fois. Voici ma fonction de contrôleur d'où j'envoie la demande de socket.Envoyer une grande quantité de notification en utilisant SNS PHP-SDK
$parts = parse_url(base_url() . "welcome/send_signal");
for ($i = 1; $i <= 10000; $i++) {
$device_type_ids_arr[$i]['token_id'] = "User token";
$device_type_ids_arr[$i]['arn'] = "User arn";
$device_type_ids_arr[$i]['member_id'] = $i;
if ((count($device_type_ids_arr) == 3500) || $i == 10000) {
$postData['devices'] = $device_type_ids_arr;
$postData['pushSet'] = $pushSet;
$postData['push_content'] = $push_content;
$post_string = http_build_query($postData);
$device_type_ids_arr = array();
$fp = fsockopen($parts['host'], isset($parts['port']) ? $parts['port'] : 80, $errno, $errstr, 600);
if (!$fp) {
echo "Some thing Problem";
}
$out = "POST " . $parts['path'] . " HTTP/1.1\r\n";
$out .= "Host: " . $parts['host'] . "\r\n";
$out .= "User-Agent: " . $_SERVER['HTTP_USER_AGENT'] . "\r\n";
$out .= "Content-Type: application/x-www-form-urlencoded\r\n";
$out .= "Content-Length: " . strlen($post_string) . "\r\n";
$out .= "Connection: Close\r\n\r\n";
$out .= $post_string;
fwrite($fp, $out);
fclose($fp);
}
}
Voici ma fonction qui reçoit les données de socket et envoie une notification push.
$sns = new Aws\Sns\SnsClient(array(
'version' => 'latest',
'key' => "my sns key",
'secret' => "secret",
'region' => "region",
'profile' => "amazon_user_profile",
'debug' => false,
'http' => array('verify' => false)
));
foreach ($device_id_arr as $device_detail) {
try {
$promises[] = $sns->publishAsync(array(
'Message' => '{ "GCM": "{\"data\": { \"message\": \"Hello user\" } }"}',
'MessageStructure' => 'json',
'TargetArn' => "member sns arn"
));
} catch (Exception $e) {
$errorMsg = $e->getMessage();
}
}
$results = \GuzzleHttp\Promise\settle($promises)->wait(TRUE);
$fp = fopen("test_parallel.txt", "a+");
fwrite($fp, "result:" . print_r($results, true) . "\r\n");
fclose($fp);
Quand j'envoie 10 avis que cela fonctionne très bien mais quand j'ai envoyé 3500 pousser alors il ne fonctionne pas et ne me donne pas de réponse. J'ai aussi essayé cette méthode. Amazon AWS PHP SDK with Guzzle's MultiCurl? mais il me donne l'erreur Argument 1 passed to Aws\AwsClient::execute() must implement interface Aws\CommandInterface, array given
$sns = new Aws\Sns\SnsClient(array(
'version' => 'latest',
'key' => "my sns key",
'secret' => "secret",
'region' => "region",
'profile' => "amazon_user_profile",
'debug' => false,
'http' => array('verify' => false)
));
foreach ($device_id_arr as $device_detail) {
try {
$publishCommands[] = $sns->getCommand('Publish', array(
"Message" => '{ "GCM": "{\"data\": { \"message\": \"' . $push_content . '\", \"type\": \"' . PUSH_TYPE_SIGNAL . '\" } }"}',
"MessageStructure" => "json",
"TargetArn" => $device_detail['arn']
));
} catch (Exception $e) {
$errorMsg = $e->getMessage();
}
}
try {
$successfulCommands = $sns->execute($publishCommands);
$failedCommands = array();
} catch (\Guzzle\Service\Exception\CommandTransferException $e) {
$successfulCommands = $e->getSuccessfulCommands();
$failedCommands = $e->getFailedCommands();
}
foreach ($failedCommands as $failedCommand) {
$fp = fopen("test_parallel4.txt", "a+");
fwrite($fp, "result:" . print_r($result, true) . "\r\n");
fclose($fp);
}
$messageIds = array();
foreach ($successfulCommands as $successfulCommand) {
$messageIds[] = $successfulCommand->getResult()->get('MessageId');
}
Alors quelqu'un a une solution pour cela? Ma principale préoccupation est d'envoyer des milliers de notifications push dans les 30 secondes.