2016-08-05 13 views
1

私は私が底に達することができない興味深い問題があります。次のようにforeachループがループの終わりに達する前に壊れています

私のコードは次のとおりです。

public function __destruct() 
{ 
    foreach ($this->_queue as $index => $header) { 
     $result = socket_write($this->_socket, $header); 
     if (!$result) 
     { 
      $s_err = socket_last_error($this->_socket); 
      $str_err = socket_strerror($s_err); 
     } 
    } 
    socket_close($this->_socket); 
} 

これは、Googleアナリティクスのイベントを追跡するために使用されます。イベントは常に3つの異なるヘッダー文字列で構成され、ソケットに書き込む必要があります。

私は2イベントでテストしています。つまり、$this->_queueには6文字列が含まれています。

私はコードを実行するたびに、インデックス[2](3番目の項目)に達し、ループが終了すると、socket_close($this->_socket);行に決して到達することはありません。

解決策を試したところ、herehereは成功しませんでした。バッファサイズを100000に設定し、usleep(5)と適切な復帰文字を含めました。

私のコードが実行される前にforeachを終了する可能性がある他の理由はありますか?

もう1つ、が良いこれを行うには?

+0

ブラウザコンソールの情報はありますか?あなたは書き込みの間に答えを読むのを待っているソケットですか? –

+0

@SergioBernardo 'socket_write'は、何バイトが書き込まれたかを示す整数を返します。エラーがあった場合は' false'を返します。私はxdebugでデバッグしましたが、毎回うまく書かれています。PHPマニュアルや他の場所では、何かが読まれるのを待っていたことを示していません。これは、キュー内の最初の3つの別々のアイテムに対して機能し、その後、ループだけでなく、3番目のアイテムの後の機能からも抜け出します。 – Skytiger

+0

そのような場合、私はforeach(...)を次のように置き換えます:for($ i = 0; $ i _ queue); $ i ++){$ header = $ this - > _ queue [$ i]; ... print( "loop $ i - somewhere \ n")を特定の場所に置いて、どこで停止するかを確認してください。 –

答えて

-1

うーん... 6弦、および$index値はゼロから番号が付けられている場合は、時間($index$header)で2つの文字列を取得している、とあなたが見る最後のものは2、続いています2 * 3 = 6

しかし、一般的には、これらの事をデバッグする最も簡単な方法は、以下のとおりです。ループは正確に正しい番号である3回=(0..1..2)を実行しています一時的にprintステートメントまたは2つを追加して、を参照してください。どうしたの。

PHPでは、「警告」のログを常にチェックする必要があります。なぜなら、その言語は寒いのを止めなければならない状況で「続ける」ことが知られているからです。

+0

いいえ、あなたは疑問を誤解しているか、配列を構想するときにちょっとした問題があったと思います。 '$ index'変数が0〜2ではなく0〜5になることを意味します。私は警告と、書き込み自体が失敗したことを示すsocket_write関数からの戻り値をチェックしました。最後の手段としてここに投稿しました。単純なPHPデバッグのヒントで解決できる簡単な問題ではありません。申し訳ありませんが、これはあまりにも過酷に聞こえましたが、あなたの答えはコメントではなく、答えでなければなりません。 – Skytiger

0

まず、forループが存在した後にソケットがクローズしていることがわかります。そのためには、ループ内のすべての操作が完了する必要があります。 第2に、次の理由で関数がハングしているアイテム[2]の問題が発生する可能性があります。
$ str_err = socket_strerror($ s_err);
}
は、取得されたエラーを返さない可能性があります。呼び出されている2つのエラー関数を確認してください。したがって、socket_last_error($ this - > _ socket)とsocket_strerror($ s_err)です。

ブロックは、このような問題を引き起こしている可能性のあるエラーを...ジャンプする場合は、Useがで「継続」:
場合(!$結果){
続けます。
}

これはエラーをジャンプし、ループ内の次の項目に進みます。
これが問題になるのは、間違いなく2つのエラー機能が呼び出されていることです。

+0

ここでの問題は、私がテストするたびに、最初とは異なる3つの項目が少し違うことです。私はxdebugを使って複数回問題をデバッグしてエラーを返さなかったので( '$ result'は決して偽ではありませんでした)、実際には2つのエラー関数が呼び出されることはありません。間違っている:) – Skytiger

関連する問題