我使用POST请求将一个带有curl(php)的大文件上传到amazon s3
当文件很小(几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,但也许我现在可以做些什么。
非常感谢你!
答案 0 :(得分:3)
如果您自己的服务器因为500错误而死(),则可能是内存不足,请尝试以下步骤。
由于您无法查看错误日志,因此请确保从脚本文件输出错误:
ini_set('display_errors', 1);
error_reporting(E_ALL);
增加php.ini中的内存限制,或者最好在发送之前不要将整个文件加载到内存中(给curl一个文件指针,而不是整个文件内容)。
在这个优秀的PHP S3库中可以看到一个例子:
如果亚马逊返回500错误,这将是确定原因的方法:
来自here: 以数字“5”开头的响应状态代码表示服务器知道它遇到错误或者无法执行请求的情况。除响应HEAD请求外,服务器应包含一个包含错误情况说明的实体,并指出它是暂时还是永久的条件。
输出响应标头和响应正文以查找原因说明:
curl_setopt($curl_handle, CURLOPT_HEADER, 1);
$responseBody = curl_exec($curl_handle);
echo $responseBody;
print_r(curl_getinfo($curl_handle));
应该在某处提到原因。