0

max_allowed_packetmysqli を介してデータベースに より大きいサイズの 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_datamysqli_send_long_data?
  • これは MySQL のエラーかもしれないと思ったので、5.5 から 5.6.11 (現在) にアップデートしました。これは何も修正しませんでした。
  • PHP 5.4.12 を使用しています。
  • データベース フィールドは型LONGBLOBであり、確実にデータを保持できます。を増やすmax_packet_sizeと、すべてが機能します。しかし、サーバー変数の操作にアクセスできることに頼ることはできません。

max_packet_sizeバイト以上を転送するにはどうすればよいですか?

4

2 に答える 2

0

max_packet_size を (変更せずに) 回避する方法はありません。

MySQL のドキュメントを参照してください: http://dev.mysql.com/doc/refman/5.5/en/packet-too-large.html

クライアントとサーバーの両方に独自の max_allowed_pa​​cket 変数があるため、大きなパケットを処理する場合は、クライアントとサーバーの両方でこの変数を増やす必要があります。

于 2013-06-02T14:40:31.690 に答える