0

あるphpスクリプトから別のphpスクリプトにjson_encodedデータをエコーし​​ています(リクエストはfsockopen / GETによって行われます)。

40 要素の配列をエンコードした場合は問題ありません。41 でまったく同じことを行うと、json 文字列の先頭にいくつかの数字と \r\n が追加されます。

これは、エコーする直前の文字列の先頭です。

{"transactions":[{"transaction_id":"03U191739F337671L",

これは私がデータを送信する方法です:

header('Content-Type: text/plain; charset=utf-8');
error_log(json_encode($transaction_list));
echo json_encode($transaction_list);

要求しているスクリプトでデータを受信したらすぐに、それを error_log に再度出力します。

27fc\r\n{"transactions":[{"transaction_id":"03U191739F337671L",

取得するデータが少ない場合、「27fc\r\n」はありません。

これは私が応答を処理する方法です:

$response="";
 while (!feof($fp)) {
            $response .= fgets($fp, 128);
 }

 //Seperate header and content
 $separator_position = strpos($response,"\r\n\r\n");      

 $header_text = substr($response,0,$separator_position);      

 $body = substr($response,$separator_position+4);                   
 error_log($body);  

 fclose($fp);   

fsockopen リクエストのタイムアウトを試してみましたが、問題ありません。php.ini の max_execution_time と max_input_time と同じことは問題ではありません。タイムアウトで何か内容がカットされているのではないかと思っていたのですが…

41 番目の配列は、前のものとコンテンツの形式に違いはありません。

どうすれば修正できますか?

Linux、Apache (httpd)、および PHP を使用しています。

アップデート

データはチャンクされているようです。応答には、「Transfer-Encoding: chunked」というヘッダーが含まれています。

4

1 に答える 1

0

file_get_contents を使用するという @Salmans のアイデアに基づいて、これが実用的なソリューションです。これは POST を使用してデータを送信します (GET は機能していないようでした。そのクエリ文字列を URL 自体に追加する必要があると思います)。

$postdata = http_build_query(         
   array('customer_id' => $customer_id)
);

$opts = array('http' =>
   array(
    'method'  => 'POST',
    'header'  => 'Content-type: application/x-www-form-urlencoded',
    'content' => $postdata
   )
);

$context  = stream_context_create($opts);  
$content = file_get_contents($my_url, false, $context);
return $content;
于 2012-12-08T12:01:00.563 に答える