max_allowed_packet
mysqli を介してデータベースに より大きいサイズの BLOB を挿入する必要がある場合は、 send_long_data
. これは誰にとってもうまくいくようです(thisまたはthisまたはthisを参照)。これは(そうではない)最小限の例です:
<?php
# Establishing connection
$db = new mysqli('localhost', 'user', 'password', 'database');
$db->query('SET CHARACTER SET "utf8"');
# Get max value
$res = $db->query('SHOW VARIABLES WHERE `Variable_name` = "max_allowed_packet"');
$max = (int)$res->fetch_assoc()['Value'];
$res->free();
# Prepare
$content = file_get_contents('C:\\file.png');
$stmt = $db->prepare('UPDATE `table` SET `field` = ? WHERE `id` = ?');
$null = null;
$id = 1;
$stmt->bind_param('bi', $null, $id);
# send_long_data
$m = $max -8;
$p = -$m;
$l = strlen($content) + $p;
while($p < $l)
$stmt->send_long_data(0, substr($content, $p += $m, $m));
if(!$stmt->execute())
echo "{$db->errno}: {$db->error}";
# finalize
$stmt->close();
$db->close();
?>
パッケージサイズが より小さい場合、これは完全にうまく機能しますmax_packet_size
。そうでない場合、いくつかの問題があります。
- に設定
$m
しただけ$max
では機能しません。エラー メッセージは次のとおりです2006: MySQL server has gone away
。この前に、警告が表示されます:Warning: Error while sending STMT_SEND_LONG_DATA packet. ... on line 20
(20 は$stmt->send_long_data
) - したがって、これから少なくとも 8 の値を引く必要があります
max_packet_size
。なぜ8?何かに依存しているのでしょうか?なぜ単純ではないのですmax_packet_size
か? - しかし、わかりました、8 を引きます。すると、次のエラーになります。
1105: Parameter of prepared statement which is set through mysql_send_long_data() is longer than 'max_allowed_packet' bytes
substr
のように、確実にバイト数を返しますmbstring.func_overload = 0
。- while ループを使用しない場合、画像の転送は機能しますが、もちろん、画像の一部は転送されません。
send_long_data
バイト以上を転送できるというまさにその目的を意図していると思いましたmax_packet_size
! - ところで、なぜエラーメッセージは何かを教えてくれているのです
mysql_send_long_data
かmysqli_send_long_data
? - これは MySQL のエラーかもしれないと思ったので、5.5 から 5.6.11 (現在) にアップデートしました。これは何も修正しませんでした。
- PHP 5.4.12 を使用しています。
- データベース フィールドは型
LONGBLOB
であり、確実にデータを保持できます。を増やすmax_packet_size
と、すべてが機能します。しかし、サーバー変数の操作にアクセスできることに頼ることはできません。
max_packet_size
バイト以上を転送するにはどうすればよいですか?