代码之家  ›  专栏  ›  技术社区  ›  Utku Dalmaz

苹果推送通知的curl请求太多

  •  3
  • Utku Dalmaz  · 技术社区  · 6 年前

    我正在使用此功能发送推送通知

    function SendPush($token,$message,$badge,$eventid) {
    
        $device_token   = $token;
        $pem_file       = '../pushcert.pem';
        $pem_secret     = 'pass';
        $apns_topic     = 'com.topic';
    
    
        $sample_alert = '{"aps":{"alert":"'. $message .'","sound":"default","badge":'. $badge .'}, "type":"attend", "eventID":"'.$eventid.'"}';
        $url = "https://api.push.apple.com/3/device/$device_token";
    
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $sample_alert);
        curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER, true );
        curl_setopt($ch, CURLOPT_HTTPHEADER, array("apns-topic: $apns_topic"));
        curl_setopt($ch, CURLOPT_SSLCERT, $pem_file);
        curl_setopt($ch, CURLOPT_SSLCERTPASSWD, $pem_secret);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
        curl_setopt($ch, CURLOPT_TIMEOUT, 15);
        $response = curl_exec($ch);
        $sonuc = json_decode($response,true);
    
        if ($sonuc['reason'] == "BadDeviceToken" || $sonuc['reason'] == "Unregistered" ) {
            return false;
        } else {
            return true;
        }
    
    }
    

    它工作得很好。我还可以检测到无效的令牌。

    我的问题是,当我需要发送超过1000个推送通知时,需要花费太多时间。

    有没有一种方法可以让curl连接保持活动状态并在不被苹果服务器阻止的情况下更快地发送通知?

    3 回复  |  直到 6 年前
        1
  •  2
  •   kiran malvi    6 年前

    为此,必须在后台放置通知代码。

    您可以参考以下网址: https://coderexample.com/how-to-run-a-php-script-in-background/

    因此,您的代码将在1秒内执行,并且您的通知将从后台发送,因此,您不必等到通知完成才等待响应。

    或者

    您可以使用第三方通知工具

    FCM公司:

    https://gist.github.com/rolinger/d6500d65128db95f004041c2b636753a

    一个信号:

    https://documentation.onesignal.com/reference

    它只会管理自己。

        2
  •  0
  •   Jomu    6 年前

    php curl库默认情况下应该重用http连接,您只需要重用curl句柄。 所以,解决办法是 $ch=curl_init($url); 一次,在此方法之外,然后将$ch作为参数添加到处理/发送通知的循环中的sendpush()中。

    这样,您的http连接将是持久的,并且将节省大量的连接建立时间。在没有成本和附加复杂性的情况下,你会得到排队效果。

        3
  •  -1
  •   Dinesh Chand    6 年前

    有卷发

    <?php
    //$message should be an array with the details
    function SendPush($messages) {
    $mh = curl_multi_init();
    $ch = array();
    foreach($messages as $key=>$mess)
    {
        $device_token   = $mess['token'];
        $pem_file       = '../pushcert.pem';
        $pem_secret     = 'pass';
        $apns_topic     = 'com.topic';
        $sample_alert = '{"aps":{"alert":"'. $mess['message'] .'","sound":"default","badge":'. $mess['badge'] .'}, "type":"attend", "eventID":"'.$mess['eventid'].'"}';
        $url = "https://api.push.apple.com/3/device/$device_token";
        $ch[$key]=curl_init($url);
        curl_setopt($ch[$key], CURLOPT_POSTFIELDS, $sample_alert);
        curl_setopt($ch[$key], CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_2_0);
        curl_setopt($ch[$key],CURLOPT_RETURNTRANSFER, true );
        curl_setopt($ch[$key], CURLOPT_HTTPHEADER, array("apns-topic: $apns_topic"));
        curl_setopt($ch[$key], CURLOPT_SSLCERT, $pem_file);
        curl_setopt($ch[$key], CURLOPT_SSLCERTPASSWD, $pem_secret);
        curl_setopt($ch[$key], CURLOPT_CONNECTTIMEOUT, 10);
        curl_setopt($ch[$key], CURLOPT_TIMEOUT, 15);
        curl_multi_add_handle($mh,$ch[$key]);
    
    }
    $running = null;
    do {
      curl_multi_exec($mh, $running);
    } while ($running);
    
    $sonuc = json_decode($response,true);
    foreach($ch as $curl)
    {
        $response = curl_multi_getcontent($curl);
        if ($sonuc['reason'] == "BadDeviceToken" || $sonuc['reason'] == "Unregistered" ) {
            //return false;
            //handle the bad device
        } else {
            //return true;
            //device ok
        }
    }
    }