2

我正在使用 POST 请求将带有 curl (php) 的大文件上传到 amazon s3。
当文件很小(几个 MB)时 - 它可以工作。当文件为几百 MB 时 - 脚本在该curl_exec行出现错误 500(我完全知道,因为我在它之前和之后放置了日志记录)。

curl初始化看起来像

$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 错误而死(),您可能内存不足,请尝试以下步骤。

由于您无法查看错误日志,请确保从脚本文件中输出错误:

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

增加 php.ini 中的内存限制,或者最好不要在发送之前将整个文件加载到内存中(给 curl 一个文件指针,而不是整个文件内容)。

在这个优秀的 PHP S3 库中可以看到一个示例:

Amazon S3 PHP 类

如果是亚马逊返回 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 回答