web-dev-qa-db-ja.com

wp_remote_postは本文の1024バイトを超えては動作しません

必要なもの

私はサードパーティのAPIを使っていて(この質問の目的のためにはどちらにも関係ありません)、外部サービスにPOSTリクエストを送る必要があります。

私はwp_remote_postを使って必要なものを実現しようとしていますが、リクエストボディで送信できるデータ量には限界があるようです。

私が直面している問題

本文に 最大1024文字が含まれる場合のみ _が送信されます。 1文字以上で(明らかに)要求は送信されません。

デバッグ

ngrok を使用して$urlでPOST要求を待機し、手動で "bla bla bla(...)"の文字列として$bodyを設定することで問題をデバッグしようとしています。 $bodyに含まれる文字数が1024文字以下の場合にのみ表示されます。 5xxエラーやその他のエラーメッセージが表示されません。実際、is_wp_error( $response )falseを返します。

ただし、 Postman などのツールを使用して、同様のPOSTrequest outside WP を生成する場合、ngrokそれだけで大丈夫です。


  • WP - > 1024バイトより小さいリクエストボディ - > ngrok = OK
  • WP - > 1024バイトを超えるリクエストボディ - > ngrok = ??
  • 郵便配達人 - > 1024バイト以下のリクエストボディ - > ngrok = OK
  • 郵便配達人 - > 1024バイトを超えるリクエストボディ - > ngrok = OK

私が試したこと

  • 本文に1024バイトを超えるワードプレスの外部から同じリクエストを送信します。
  • まったく新しいWordPressはプラグインもなくデフォルトのテーマ(21)でインストールされます:それは動作しません。
  • 最新のFedoraインストール、最新のLinuxカーネル、最新のFirefoxバージョン、最新のDockerバージョンを使用して別のPCを試してもうまくいきませんでした。

私の設定

すべてのテストは私のローカルマシン上で行われ、WordPress 4.9.5はデフォルトのWordPressイメージでDockerコンテナ内で実行されており、以下のカスタムphp ini行を除いて未修正のデフォルト設定を使用します。

file_uploads = On
memory_limit = 64M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 600

コード

  $response = wp_remote_post( $url,
    array(
      'timeout' => 60,
      'redirection' => 5,
      'blocking' => true,
      'headers' => array(
        'Content-Type' => 'application/json',
      ),
      'body' => 'bla bla (...)' // fails if larger than 1024
    )
  );

  if ( is_wp_error( $response ) ) {
    $error_message = $response->get_error_message();
    echo "Something went wrong: $error_message";
  } else { echo "Request sent"; }
2

あなたが偶然CURLトランスポートを使用しているのであれば、それは時々1024文字を超えるPOSTリクエストを送ることに小さな問題を抱えています。詳細はこちら:

https://stackoverflow.com/questions/463144/php-http-post-fails-when-curl-data-1024

空のExpect:ヘッダを送信することをお勧めします。このようにコードを修正することでこれを行うことができます。

$response = wp_remote_post( $url,
    array(
      'timeout' => 60,
      'redirection' => 5,
      'blocking' => true,
      'headers' => array(
        'Content-Type' => 'application/json',
        'Expect' => '',
      ),
      'body' => 'bla bla (...)' // fails if larger than 1024
    )
  );

編集:詳細情報:

CurlとPHPのバージョンによっては、本文に1024文字を超える文字を入力すると、最初にヘッダーを送信し、次に "Expect:100-continue"ヘッダーを送信します。これを受信したWebサーバーは、クライアントが本文の残りの部分を送信し続けるために100 Continueステータスで応答する必要があります。

本物のWebサーバーを使用している場合は、その応答を送信して残りのメッセージを受信します。一部の古いWebサーバーはこれを行わなかったため、その前の質問で指定された回避策がありました。

Ngrokが何であるかはわかりませんが、ここでは通常のWebサーバーのように応答していないと思います。そのサーバーがPOSTを続行するように指示せずに、curlはそれが行われるのを待ちます。やがてタイムアウトします。

5
Otto