6

する方法はありますか

curl -X POST -H "Content-Type:application/xml" --data @myfile.xml http://example.com

しかし、PHPで直接?

CURLOPT_PUT/CURLOPT_UPLOADだけでfile_get_contentsなくexec

POSTである必要があり、ファイルが巨大であるためストリーミングする必要があるため、ソリューションではありません。

何か案は?

4

2 に答える 2

14

バルク API エンドポイントが PUT 要求を受け入れることに気付くまで、大量の取り込みファイルを PHP から Elasticsearch のバルク API にフィードしようとして、同様の問題が発生しました。とにかく、このコードは巨大なファイルで POST リクエストを実行します:

$curl = curl_init();
curl_setopt( $curl, CURLOPT_PUT, 1 );
curl_setopt( $curl, CURLOPT_INFILESIZE, filesize($tmpFile) );
curl_setopt( $curl, CURLOPT_INFILE, ($in=fopen($tmpFile, 'r')) );
curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, 'POST' );
curl_setopt( $curl, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json' ] );
curl_setopt( $curl, CURLOPT_URL, $url );
curl_setopt( $curl, CURLOPT_RETURNTRANSFER, 1 );
$result = curl_exec($curl);
curl_close($curl);
fclose($in);

ここで$tmpFile、リクエストボディを含むファイルのフルパスです。

注:重要な部分は、設定CURLOPT_CUSTOMREQUESTされているに'POST'もかかわらずCURLOPT_PUTに設定することです。

サーバーが期待するものに合わせてContent-Type:ヘッダーを調整する必要があります。

tcpdump を使用して、リクエスト メソッドが POST であることを確認できました。

POST /my_index/_bulk HTTP/1.1
Host: 127.0.0.1:9200
Accept: */*
Content-Type: application/json
Content-Length: 167401
Expect: 100-continue

[...snip...]

Ubuntu 14.04 でパッケージ libcurl3 (バージョン 7.35.0-1ubuntu2.5) と php5-curl (バージョン 5.5.9+dfsg-1ubuntu4.11) を使用しています。

于 2015-07-29T09:44:47.867 に答える
1

Curl は投稿をサポートしているので、次のようなものを探していると思います: Posting or Uploading Files Using Curl With PHP

// URL on which we have to post data
$url = "http://localhost/tutorials/post_action.php";
// Any other field you might want to catch
$post_data['name'] = "khan";
// File you want to upload/post
$post_data['file'] = "@c:/logs.log";

// Initialize cURL
$ch = curl_init();
// Set URL on which you want to post the Form and/or data
curl_setopt($ch, CURLOPT_URL, $url);
// Data+Files to be posted
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
// Pass TRUE or 1 if you want to wait for and catch the response against the request made
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// For Debug mode; shows up any error encountered during the operation
curl_setopt($ch, CURLOPT_VERBOSE, 1);
// Execute the request
$response = curl_exec($ch);

// Just for debug: to see response
echo $response;

(元のリンクされた作成者へのコードのすべてのクレジット)。

「巨大」に関しては、kb、mb、gb、tb など、より具体的にする必要があります。追加の問題は、PHP スクリプトが自動終了せずに存続できる時間、スクリプトのメモリ使用量 (ファイル全体をロードするのではなく、チャンクで処理する必要がある場合があります) などに関連します。

編集: ああ、生の投稿の場合は、これが必要になると思います: Raw POST using Curl in PHP

于 2013-03-19T19:43:01.407 に答える