我有一个PHP脚本,我用它作为cron作业运行。
当这个脚本在16000个用户记录上运行大约需要13分钟时。
请建议我以最佳效果运行此脚本。
我需要知道,如果我把更新放入循环中,如果有任何问题,或者在循环内插入然后更新。
$db_conn = getDbObject('my_db');
$now_timestamp = time();
$message_text = getMessage('notify');
$users_sql = "SELECT * FROM users_tbl WHERE status = 'sub' and expire_timestamp < '{$now_timestamp}' ";
$users_result = mysql_query($users_sql,$db_conn);
while($user_row = mysql_fetch_assoc($users_result)){
$update_user_sql = "UPDATE users_tbl SET status = 'pending' WHERE user_id = '{$user_row['user_id']}' ";
mysql_query($insert_message_sql,$db_conn);
$insert_message_sql = "INSERT INTO
messages_tbl
(
message_id ,
message_text ,
user_id ,
status
)
VALUES
(
NULL ,
'{$message_text}',
'{$user_row['user_id']}',
'0',
)";
mysql_query($insert_message_sql,$db_conn);
}
mysql_close($db_conn);
答案 0 :(得分:2)
我需要知道,如果我把更新放入循环中,如果有任何问题,或者在循环内插入然后更新。
当然这是一个问题。
你应该摆脱循环并使你的操作基于集合:
INSERT
INTO messages_tbl (message_id, message_text, user_id, status)
SELECT NULL, '{$message_text}', user_id, '0'
FROM users_tbl
WHERE status = 'sub'
AND expire_timestamp < '{$now_timestamp}'
UPDATE users_tbl
SET status = 'pending'
WHERE status = 'sub' and expire_timestamp < '{$now_timestamp}'