2

POSTリクエストを使用して、curl(php)を含む大きなファイルをAmazons3にアップロードしています。
ファイルが小さい場合(数MB)-動作します。ファイルが数百MBの場合、スクリプトはそのcurl_exec行でエラー500で終了します(ログをその直前と直後に配置したため、正確にわかります)。

カールの初期化は次のようになります

$postdata = array_merge( $headers_array , array('file' => '@' . $filename));           
$curl_handle = curl_init();         
curl_setopt( $curl_handle , CURLOPT_URL , $s3_url );
curl_setopt( $curl_handle , CURLOPT_RETURNTRANSFER , 1 ); 
curl_setopt( $curl_handle , CURLOPT_POST , TRUE );
curl_setopt( $curl_handle , CURLOPT_HEADER , FALSE );
curl_setopt ($curl_handle , CURLOPT_POSTFIELDS, $postdata);

$response = curl_exec( $curl_handle ); 
`500 here`

問題はメモリ不足(または同様のもの)であると思います。ホスティングプロバイダーにerror_logを表示するように要求しましたが、今できることがあるかもしれません。

大いに感謝する!

4

1 に答える 1

3

自分のサーバーが 500 エラーで die() している場合は、メモリが不足している可能性があります。次の手順を試してください。

エラーログを表示できないため、スクリプト ファイルからエラーが出力されていることを確認します。

ini_set('display_errors', 1);
error_reporting(E_ALL);

php.ini のメモリ制限を増やすか、できれば送信前にファイル全体をメモリにロードしないようにします (curl にファイル コンテンツ全体ではなく、ファイル ポインタを指定します)。

この優れた PHP S3 ライブラリで例を確認できます。

Amazon S3 PHP クラス

Amazon が 500 エラーを返す場合、これが理由を特定する方法です。

ここから: 数字の "5" で始まる応答ステータス コードは、サーバーがエラーに遭遇したこと、または要求を実行できないことを認識している場合を示します。HEAD リクエストに応答する場合を除き、サーバーはエラー状況の説明を含むエンティティを含め、それが一時的な状態か永続的な状態かを示す必要があります。

応答ヘッダーと応答本文を出力して、理由の説明を探します。

curl_setopt($curl_handle, CURLOPT_HEADER, 1);
$responseBody = curl_exec($curl_handle);
echo $responseBody;
print_r(curl_getinfo($curl_handle));

原因はどこかに記載されているはずです。

于 2012-07-02T13:37:58.030 に答える