3

この種の質問を投稿するのに適切な場所かどうかはわかりません。そうでない場合は、(丁寧に)お知らせください... :-)

PHP サイトから mysql データベースに 16MB を超えるファイルを保存する必要があります...

私はすでに c:\xampp\mysql\bin\my.cnf を変更しました

max_allowed_pa​​cket を 16 MB に設定すると、すべてが正常に機能しました

それから 32 MB に設定しましたが、16 MB を超えるファイルを処理する方法がありません。

次のエラーが表示されます。

「MySQL サーバーがなくなりました」

(max_allowed_pa​​cket が 1MB に設定されたときに発生したのと同じエラー)

16MB を超えるファイルを処理できない設定が他にあるはずです

おそらくphpクライアントだと思いますが、どこを編集すればよいかわかりません

これは私が実行しているコードです

file.txt が 16.776.192 バイトよりも小さい場合は問題なく動作しますが、

file.txt に 16.777.216 バイトがある場合、前述のエラーが発生します

ああ、フィールド download.content は longblob です...



$file = 'file.txt';

$file_handle = fopen( $file, 'r' );

$content = fread( $file_handle, filesize( $file ) );

fclose( $file_handle );

db_execute( 'truncate table download', true );

$sql = 
"insert into download( 
    code, title, name, description, original_name, 
    mime_type, size, content, 
    user_insert_id, date_insert, user_update_id, date_update )
values (
    'new file', 'new file', 'sas.jpg', 'new file', '$file',
    'mime', " . filesize( $file ) . ", '" . addslashes( $content ) . "',
    0, " . db_char_to_sql( now_char(), 'datetime' ) . ", 0, " . db_char_to_sql( now_char(), 'datetime' ) . " )";

db_execute( $sql, true );

(db_execute 関数は、接続を開いて SQL を実行するだけです)

Windows XP SP2 サーバー バージョンで実行: 5.0.67-community PHP バージョン 4.4.9 mysql クライアント API バージョン: 3.23.49

使用: ApacheFriends XAMPP (Basispaket) バージョン 1.6.8 + Apache 2.2.9 + MySQL 5.0.67 (Community Server) + PHP 5.2.6 + PHP 4.4.9 + PEAR + phpMyAdmin 2.11.9.2 ...

これは c:\xampp\mysql\bin\my.cnf の内容の一部です

# MySQL サーバー
[mysqld]
ポート= 3306
ソケット = "C:/xampp/mysql/mysql.sock"
basedir="C:/xampp/mysql"
tmpdir="C:/xampp/tmp"
datadir="C:/xampp/mysql/data"
スキップロック
key_buffer = 16M
# max_allowed_pa​​cket = 1M
max_allowed_pa​​cket = 32M
テーブルキャッシュ = 128
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M
4

4 に答える 4

3

編集:私の元の答えは間違っています。

php がリンクされた mysql クライアント ライブラリのバージョンは、mysql サーバーのバージョンよりも (かなり) 古いものでした。しかし、今はそうではないようです。正しい mysql クライアント ライブラリに対して php を再コンパイルすると、サーバー側の変数を更新するだけで済みます。

他の誰かが問題を見つける可能性があり、(私の場合のように) クライアント ライブラリに関連している可能性があるため、回答をここに残しておきます。それはまた(元の質問がv3ライブラリとv4サーバーを述べていることを考えると)元の質問に対する答えである可能性が非常に高いです。

走る

phpinfo()

バージョンを確認するには、mysql セクションで「クライアント API バージョン」を探します。

-- ここからの古い回答

問題は、サーバー変数「max_allowed_pa​​cket」がある一方で、クライアントにも 1 つのセットがあることです。これは、mysql クライアントで次のように設定できます。

mysql --max_allowed_packet 

または使用して

set-variable   = max-allowed-packet=64M

my.cnf の [client] セクション

残念ながら、php は my.cnf を読み取らず、このクライアント側変数を設定することもできません。したがって、php ソースのコンパイル時間の制限に固執しています。

ext/mysql/libmysql/net.c:ulong max_allowed_packet=16*1024*1024L;

この制限を変更してphpモジュールを再コンパイルすると、問題が解決するはずですが、他の人が指摘しているように、実際には別の方法で行う必要があります.

于 2010-04-20T09:48:39.490 に答える
1

私は過去にPHPとMySQLでこの問題に遭遇しました。

私のソリューションがバイナリをチャンクに分割し、配列をループしたことを覚えています。最初に新しい行を挿入し、次にCONCATステートメントを使用して行を更新します。

それは厄介でしたが、それはトリックをしました。

実際、最終的には、バイナリの内容をファイルに保存し、ファイルへのポインタをデータベースに保持しました。それははるかに効率的でした。

于 2009-01-04T23:01:07.860 に答える
1

この理由で max_allowed_pa​​cket を拡張するのは、不適切な実装の結果です。この記事/ファイルストレージの実装を読むことをお勧めします。あらゆるサイズのファイルを保存できます。

于 2009-01-04T23:05:27.523 に答える
-1

php.iniファイルにはアップロード制限の上限もあります。MySQLに直接接続されていませんが、phpを使用してデータを送信している場合は、問題が発生している可能性があります。

; Maximum allowed size for uploaded files.
upload_max_filesize = 16M

; Maximum size of POST data that PHP will accept.
post_max_size = 16M
于 2009-01-05T06:53:45.597 に答える