我使用亞馬遜PHP SDK V3.13.1,我必須在30秒內發送至少10,000次推送通知。現在我正在使用publishAsync
方法它更快,但我仍然沒有及時發送它。
所以我已經實現套接字,併發送一堆3500每次推。以下是我從哪裏發送套接字請求的控制器功能。使用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);
}
}
以下是我接收套接字數據併發送推送通知的函數。
$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);
當我發送10通知這是工作正常,但當我發送3500推,那麼它不工作,並沒有給我任何迴應。我也試過這種方法。 Amazon AWS PHP SDK with Guzzle's MultiCurl?但它給了我錯誤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');
}
所以任何人有一個解決方案?我主要關注的是在30秒內發送數以千計的推送通知。