PHPを使用して、ダイレクトアップロード経由でYouTubeにビデオを送信しています。小さいサイズのビデオでは問題なく動作しますが、390 MB のビデオを送信しようとすると、次のエラーが発生します。
PHP 致命的なエラー: メモリ不足 (割り当てられた 3932160) (390201902 バイトを割り当てようとしました)
増やしてみましmemory_limit
たが、うまくいきません。
if ($isFile) {
ini_set('memory_limit', '2G')
$data = file_get_contents($data);
}
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$out = curl_exec($ch);
curl_close($ch);
return $out;
curl も実行してみましexec()
たが、さらに奇妙なことが起こります。
curl http://uploads.gdata.youtube.com/feeds/api/users/default/uploads -H 'POST /feeds/api/users/default/uploads HTTP/1.1' -H 'ホスト: uploads.gdata.youtube .com' -H 'Authorization: OAuth [snip oauth info]"' -H 'GData-Version: 2' -H 'X-GData-Client: www.mywebsite.com' -H 'X-GData-Key: key =[中略]' -H'Slug: video.AVI' -H'Content-Type: multipart/related;boundary="iUI5C0hzisAHkx9SvaRJ"' -H'Content-Length: 390193710' -H'Connection: close' -d / tmp/youtube.xml
/tmp/youtube.xml は、アップロードするデータ ファイルを保存した場所です。この使い方は間違っているのではないでしょうか?
これには約 6 分かかるため、ファイルが送信されているように見えますが、空の返信が返されます。
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0
0 0 0 0 0 0 0 0 --:--:-- 0:00:02 --:--:-- 0
...
0 0 0 0 0 0 0 0 --:--:-- 0:06:00 --:--:-- 0
curl: (52) Empty reply from server
編集:
OAuth を使用しているため、通常の PHP API ライブラリを使用することはできません。ここで説明されているように、XML ファイルに含まれる動画のバイナリ データを含む XML ファイルをアップロードする必要があります。
ファイルをチャンクで読み取って送信するためのコードを提供した、同じ問題を抱えた別の人を見つけました。ただし、この方法を試すと、Youtube は「Content-Length」ヘッダーが必要であることを示す 411 ページを返します。content-length ヘッダーを設定しているので、これはバグである可能性があります。このメソッドは、fsockopen()
cURL の代わりに関数を使用します。[実際、コードをもう一度見てみると、ヘッダーを「\r\n」ではなく「\n」で区切っていただけであることに気付きました。それが問題かもしれません。キャリッジリターンも試してみます]
編集2:
「\r\n」は機能したと思いますが、コードを使用すると、YouTube から空の返信が再び届きます。
これを機能させるのに役立つ Curl の専門家はいますか? 私はこれに完全に困惑しています。