0

PHP スクリプトでデータベースから 11M 行を更新する必要があります。

しばらくすると、スクリプトがフリーズまたはクラッシュします。EasyPHP 12 を再起動してリロードする必要があります。

私の構成:

  • Windows 7 プロ 64 ビット
  • インテル コア i7 860 2.8Ghz
  • 8G RAM

私の my.cnf ファイル:

port        = 3306
socket      = /tmp/mysql.sock

[mysqld]
port        = 3306
socket      = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
thread_concurrency = 8
log-bin=mysql-bin
server-id = 1

[mysqldump]
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

クラッシュする疑似コードを次に示します。

`For i to 100000 { do magic (check content on the web);    UPDATE table;    }`
4

3 に答える 3

1

my.cnf ではなく、php.ini を調べる必要があります。

単一のレコードに対して何らかのロジックを実行し、そのレコードを更新してから、次のレコードに更新していると思います。この場合、単一のレコード (またはレコードのサブセット) の更新にはそれほど時間がかかりませ

フリーズまたはクラッシュは、スクリプトがメモリ制限または実行時間制限に達したために発生します。

于 2012-11-16T08:22:54.660 に答える
0

実行時エラーが発生している可能性があります。コマンドラインから実行するシェルスクリプトを作成できます。

例(疑似):

<?php
SELECT * FROM table
LIMIT $x to $y

FOR every result
do some magic, SAVE to record with ID $id

このファイルを呼び出す場合はmy_update.php、入力して実行しphp path/to/my_update.php、魔法を監視します。(phpphp実行可能ファイルはどこにありますか)。

賢く、すべての行動を記録してください!そのため、スクリプトが失敗した場合でも、最初からやり直す必要はありません。クエリに LIMIT を追加したのはまさにそのためで、11M の行をバッファリングする必要はありませんが、ほんの数行です。行の最初の束の後、次の LIMIT に移動します。ページネーションに似ていますが、視覚的な出力はありません。

ソース:

于 2012-11-16T08:22:35.490 に答える
0

スクリプトの最大実行時間を php.ini ファイルから変更する必要があります。

于 2012-11-16T08:28:49.930 に答える