Старая тема закрыта (не мудрено, 8 мес назад отложил дела на потом, вот руки дошли наконец), оставлю ремарку,
$number = 3000;//кол-во обрабатываемых сообщений за один проход
Я проверил работу скрипта на локальном сервере, в результате было обработано 17 тыс. сообщений и создано около 1,5 тыс. чатов, скрипт отработал нормально.
Оценил масштаб своей базы данных - порядка 369500 сообщений в личках. У меня загрузка страницы экспорта остановилась на цифре 22, это когда я уже снизил кол-во обрабатываемых сообщений до 500 на сайте для тестов, цель не была достигнута .../?transfer_old_messages=go&transfer_page=22
Из решений - могу попробовать снизить аж до 300 сообщений за один проход, но видимо, в этом нет смысла, ведь скрипт работает и в итоге через некоторые время вырубится?
Либо у меня на нормальном сервере будет все нормально, там помощнее, чем на тест-площадке на джино.ру
Вопрос в том сможет ли хостинг за раз пройти 3000? Зависит от параметра в php.ini max_execution_time - время работы скрипта. На моем сайте оно равно 30 секундам
И соответственно как шустро он будет перебирать за эти 30 секунд - ответа нет. Каждый сервер по разному.
судя по вашему репорту было обработано только 11 тыс. сообщений, это не так много для нормального хостинга, а вот порядка 400 тыс. сообщений уже могут вызвать проблемы. Ограничения на кол-во сообщений в чатах не установлено? Лучше установить, подождать сутки, чтобы отработало удаление старых сообщений, а потом производить перенос.
Otshelnik-Fm сказал(а)
Я точно не помню как там в 15й версии, вроде daily (раз в сутки который отрабатывает) но ничего страшного не случится если вы все события крона начинающиеся на rcl_cron_ выполните - запустите все что можно
daily_schedule_notify_user
wp_scheduled_auto_draft_delete
_cron_subscribe_reloaded_purge
rcl_cron_daily_schedule
itsec_purge_logs
wp_scheduled_delete (?)
quick_chat_target_clean_update
daily_delete_notifications
Ок, продолжу изучение, что там не так
daily_schedule_notify_user - вроде от дополнения уведомлений
rcl_cron_daily_schedule - один раз в день срабатываемое задание. Видимо оно вам и нужно
daily_delete_notifications - возможно тоже от допа уведомлений.
- остальные это что-то стороннее.
Но в 16й версии (да вроде и в 15й все это было приведено к единому стандарту) WP-Recall и допы которые работают с 16-й версией все крон задачи имеют префикс rcl_cron_
Поэтому после перехода на 16ю версию можете смело удалять вышеназванные мной планы крона (если они кем то будут нужны - восстановятся после переактивации плагина. Но по моему это оставшиеся в бд "хвосты")
upd: если это "хвосты" от WP-Recall, то явно от версии младше 14й. Вот
что крон задачи приведены в единый вид (3 февраля 2016)
Вижу вы задание опубликовали... А сами то можете ответить - крон у вас работает?
Работа крона определяется например так: вы видите что на странице дополнений есть их обновления.
Потому как я писал в статье, ссылку на которую давал - крон может быть отключен вами через конфиг (раздел "В чем причины")
Крон работает:
WP-recall: Вы используете версию 15.1.9. Обновить до 16.0.8.
На странице аддонов: 19 штук+шаблон просит обновлений.
Доступная свежая версия Across Ocean 3.1. смотреть информацию о версииили обновиться автоматически
Доступная свежая версия Add News WP-Recall FULL (Объявление в личном кабинете) 4.7.
Доступная свежая версия Comments Tuner 1.4.4.
и т.д.
В конфиге нет никаких упоминаний о кроне.
сейчас никто не сможет ответить почему сообщения не удаляются по крону, тк мы говорим о работе дополнения Private Message Wp-Recall, которое уже давно не поддерживается и не дорабатывается. Если бы попытка миграции сообщений была сделана своевременно, то возможно, проблемы бы и не было, что заставило ждать почти год - непонятно.
Как вариант, можно попробовать произвести миграцию сообщений добавленных только за последний год или два, тогда объем переносимых сообщений должен быть гораздо меньше. Для этого в скрипте миграции приведенном тут
следует изменить строку
$messages = $wpdb->get_results("SELECT * FROM ".RCL_PREF."private_message ORDER BY author_mess DESC LIMIT $offset,$number");
до такого вида
$messages = $wpdb->get_results("SELECT * FROM ".RCL_PREF."private_message WHERE time_mess > date_sub('".current_time('mysql')."', interval 1 YEAR) ORDER BY author_mess DESC LIMIT $offset,$number");
Привело к
САЙТ/?transfer_old_messages=go&transfer_page=38
1500 сообщений на проход уходило
белая стр-ца с текстом в итоге:
Catchable fatal error: Object of class WP_Error could not be converted to string in /***/wp-content/plugins/wp-recall/add-on/rcl-chat/class-rcl-chat.php on line 117
я не знаю, сколько сообщений было перенесено и за какой период, не могу сказать была ли миграция успешна.
я предложил вариант решения проблемы, возможно и не самый лучший, код миграции есть, можете править его под себя и решать задачу, или подождать еще 8 месяцев - может само уляжется. А вообще, не надо было идти на поводу у юзеров, еще 8 месяцев назад надо было отключать старый чат, было бы пару дней нытья, зато сейчас не было бы такой проблемы.
Знакомый программист помог перенести сообщения за два года и 5 минут работы скрипта следующим скриптом:
add_action('wp','rcl_init_transfer_old_messages'); function rcl_init_transfer_old_messages(){ if(isset($_GET['transfer_old_messages'])){ $page = (isset($_GET['transfer_page']))? $_GET['transfer_page']: 1; rcl_transfer_old_messages($page); } //print 'ok'; } function rcl_transfer_old_messages($page){ global $wpdb; $number = 37000;//кол-во обрабатываемых сообщений за один проход $offset = ($page - 1) * $number; file_put_contents(__DIR__ .'/transfer_old_messages', $offset." "); $messages = $wpdb->get_results("SELECT * FROM ".RCL_PREF."private_message WHERE time_mess > date_sub('".current_time('mysql')."', interval 2 YEAR) ORDER BY author_mess DESC LIMIT $offset,$number"); if(!$messages) wp_die('Сообщений больше нет! <a href="'.get_bloginfo('wpurl').'">На главную</a>'); require_once RCL_PATH.'/add-on/rcl-chat/class-rcl-chat.php'; $old_room = false; foreach($messages as $message){ $chat_room = rcl_get_private_chat_room($message->author_mess,$message->adressat_mess); if($chat_room!=$old_room){ $chat = new Rcl_Chat(array('chat_room'=>$chat_room,'chat_status'=>'private','user_id'=>$message->author_mess)); } $result = rcl_insert_old_message($chat,$message); if(!$result) wp_die('Возникла ошибка!'); $old_room = $chat_room; } $nextpage = $page + 1; file_put_contents(__DIR__ .'/transfer_old_messages', "ok "); wp_redirect(get_bloginfo('wpurl').'?transfer_old_messages=go&transfer_page='.$nextpage); exit; } function rcl_insert_old_message($chat,$message){ global $wpdb; $key = explode(':',$chat->chat_room); $private_key = ($key[1]==$message->author_mess)? $key[2]: $key[1]; $message = array( 'chat_id'=>$chat->chat_id, 'user_id'=>$message->author_mess, 'message_content'=>$message->content_mess, 'message_time'=>$message->time_mess, 'private_key'=>$private_key, 'message_status'=>1, ); $result = $wpdb->insert( RCL_PREF.'chat_messages', $message ); return $result; }