5

情報(json形式)をandroid/iphoneアプリに返すcodeIgniterRESTfulAPI(https://github.com/philsturgeon/codeigniter-restserver)を使用しています。

いくつかの値を送信する操作があります。それで問題がなければ、応答として200コードを返します。

ここで、同じ方法で新しい操作を追加したいと思います。APNS(Apple Push Notificacion Service)とGCM(Google Cloud Messaging)を使用してこの変更の通知を送信します。

3〜5個以下の通知を送信する必要がある場合はうまく機能します。問題は、APNSです。これは、このメッセージを1つずつ送信する必要があり、時間がかかるため、アプリがタイムアウト例外を受け取るためです(すべての通知は送信されましたが、ユーザーはエラー接続を取得します...)

200コードの応答を送信してから、この通知を送信し続けることはできますか?(このようなもの...)

function my_update_method_post(){
   //....GET my POST values
   update($data);
   $this->response(array('result'=>1),200));


   //Send Notifications
   ....
}

前もって感謝します...

4

4 に答える 4

2

私は結果の値を期待していないので、私にとって完璧に機能するソリューションを見つけました。通知を送信できない場合...データベースに記録します。

これは、「非同期」リクエストを送信するために使用する関数です (はい、これは非同期リクエストではありませんが、探している方法で動作します)

function curl_post_async($url, $params)
{
    $post_string = http_build_query($params);
    $parts=parse_url($url);

    $fp = fsockopen($parts['host'],
        isset($parts['port'])?$parts['port']:80,
        $errno, $errstr, 30);

    if(!$fp)
    {
        //Perform whatever logging you want to have happen b/c this call failed!    
    }
    $out = "POST ".$parts['path']." HTTP/1.1\r\n";
    $out.= "Host: ".$parts['host']."\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";
    if (isset($post_string)) $out.= $post_string;

    fwrite($fp, $out);
    fclose($fp);
}
于 2012-12-03T19:51:48.133 に答える
1

PHP はスレッドや非同期関数呼び出しをネイティブにサポートしていないため、一種のハッキーなソリューションを使用する必要があります。ここで私の質問を見てください: PHP file_get_contents() follow Content-length header

解決策はConnection: CloseContent-Lengthヘッダーを送信し、クライアントにこれらのヘッダーを認識させることです (上記のリンクを参照)。たとえば、curl の場合、Content-Length に達するとすぐに接続が閉じられますが、PHP スクリプトは引き続き「バックグラウンドで」実行されるため、時間のかかる操作を開始できます。

敬具、

ステファン

PSスクリプトの実行に非常に時間がかかる場合は、PHPの最大実行時間が邪魔にならないようにしてください

于 2012-12-03T12:02:25.783 に答える
1

はい、これは可能です。

PHP exec()このリンクを見てください。コマンドラインから呼び出されるように、コントローラーに関数を設定する必要があります。次に、使用する GCM/APNS データの配列を渡します。

すべてのメッセージが正常に送信されたことをクライアントに伝えることができないため、このソリューションは理想的ではありません。リクエストが正常に受信されたことを伝えるために 200 を送り返します。

于 2012-12-03T12:02:36.297 に答える
0

この記事を見てください。クライアントがサーバーにすぐに電話を切るように指示するよりも、このソリューションが好きです。このソリューションをサーバー側で構築すると、複数の利点があります。

  1. クライアントが切断されても、サーバーは処理を続行することがわかっています
  2. クライアントは引き続きサーバーからの応答を受信できます

編集

OPがここでサービスにアクセスできないことに気づきませんでした。この場合、私が言及した記事はほとんど価値がありません。ここでの問題は、サーバーが応答するのに時間がかかり、クライアントがハングアップすることです。これについては、 curl_multi_initをお勧めします。これにより、複数のリクエストを同時に行うことができます。

于 2013-10-03T04:46:15.100 に答える