PHP readfile和curl将大型视频上传到Picasa网络相册“致命错误:允许的内存大小”

时间:2015-01-14 21:08:19

标签: php shell curl

我的项目有问题。我尝试使用here中的脚本将视频上传到Picasa, 但上传的视频文件大于600MB,我收到了这个错误:

  

PHP致命错误:在第119行的/path/to/file/test/picasa.php中,允许的内存大小为1497366528字节(尝试分配681179924字节)

我尝试在memory_limit = 128MB中将memory_limit = 1028MB更改为php.ini,但它仍无效。

这是上传的功能:

function upload_file( $authHeader, $user_id, $album_id, $filename ) {
// Picasa album url
$albumUrl = "https://picasaweb.google.com/data/feed/api/user/$user_id/albumid/$album_id";
// Video file to upload
$imgName = $filename;
// Xml data
$ImgXml =   '<entry xmlns="http://www.w3.org/2005/Atom">
                <title>'.$filename.'</title>
                <summary>'.$filename.'</summary>
                <category scheme="http://schemas.google.com/g/2005#kind" term="http://schemas.google.com/photos/2007#photo"/>
                </entry>';

// Get the file size
$fileSize = filesize($imgName);

// Read the Video file, NOTE : THE ERROR FROM FREAD
$fh = fopen($imgName, 'rb');
$imgData = fread($fh, $fileSize);
fclose($fh);

// Count the file and data lengh
$dataLength = strlen($ImgXml) + $fileSize;

// Data for curl postpields
$data = "";
$data .= "\nMedia multipart posting\n";
$data .= "--P4CpLdIHZpYqNn7\n";
$data .= "Content-Type: application/atom+xml\n\n";
$data .= $ImgXml . "\n";
$data .= "--P4CpLdIHZpYqNn7\n";
$data .= "Content-Type: video/x-matroska\n\n";
$data .= $imgData . "\n";
$data .= "--P4CpLdIHZpYqNn7--";
$header = array(
                'GData-Version:  2', 
                $authHeader, 
                'Content-Type: multipart/related; boundary=P4CpLdIHZpYqNn7;', 
                'Content-Length: ' . strlen($data),
                'MIME-version: 1.0'
                );
$return = "";
// Post the video with the data and header
$ch = curl_init($albumUrl);
$options = array(
                    CURLOPT_SSL_VERIFYPEER => false,
                    CURLOPT_POST => true,
                    CURLOPT_RETURNTRANSFER => true,
                    CURLOPT_HEADER => false,
                    CURLOPT_FOLLOWLOCATION => true,
                    CURLOPT_POSTFIELDS => $data,
                    CURLOPT_HTTPHEADER => $header
                );
curl_setopt_array($ch, $options);
$return = curl_exec($ch);
curl_close($ch);

我尝试更换

$fh = fopen($imgName, 'rb');
$imgData = fread($fh, $fileSize);
fclose($fh);

用这个:

ob_start();
readfile($imgName);
$output = ob_get_contents();
ob_end_clean();

但它仍然显示同样的错误。我试图通过ssh运行脚本,没有运气。也许是因为我的VPS只有2 GB的内存?

然后我读了关于curl的内容并找到--data-binary <data>,我想也许--data-binary <data>可以做这个工作。

我的问题是:

在PHP中是否有readfile的替代方法,还是有其他方法可以实现这一目标?

我可以使用curl作为linux命令将该视频上传到Picasa吗?

0 个答案:

没有答案