Ниже приведен код, который добавляет 200 последних твитов (JSON, предоставляемый Twitter API) в базу данных для пользователя Twitter. Здесь $users
массив содержит только одного пользователя (например, @katyperry), но в конечном итоге он будет содержать больше. Для каждого из пользователей в массиве через Twitter API вводится 200 твитов. Весь этот сбор данных работает отлично.
Вот проблема сейчас: Для каждого пользователя я вставляю 200 твитов в таблицу MySQL DB (я должен использовать только MySQL, другого выбора нет). Теперь я понимаю, что каждый TwitterResp
JSON stringified огромен (возможно, в этом проблема).
Пример TwitterResp:
{"created_at":"Thu Jul 23 18:25:30 +0000 2015","id":624284214704390145,"id_str":"624284214704390145","text":"when your fragrance is ud83dudd25#madpotion https://t.co/UfyPQIwIj4","source":"<a href="http://instagram.com" rel="nofollow">Instagram</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":21447363,"id_str":"21447363","name":"KATY PERRY","screen_name":"katyperry","location":"","description":"CURRENTLYu2728BEAMINGu2728ON THE PRISMATIC WORLD TOUR 2014/2015!","url":"http://t.co/fxFJjKX30d","entities":{"url":{"urls":[{"url":"http://t.co/fxFJjKX30d","expanded_url":"http://www.katyperry.com","display_url":"katyperry.com","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":73404466,"friends_count":157,"listed_count":143175,"created_at":"Fri Feb 20 23:45:56 +0000 2009","favourites_count":1663,"utc_offset":-28800,"time_zone":"Alaska","geo_enabled":false,"verified":true,"statuses_count":6566,"lang":"en","contributors_enabled":false,"is_translator":false,"is_translation_enabled":true,"profile_background_color":"CECFBC","profile_background_image_url":"http://pbs.twimg.com/profile_background_images/378800000168797027/kSZ-ewZo.jpeg","profile_background_image_url_https":"https://pbs.twimg.com/profile_background_images/378800000168797027/kSZ-ewZo.jpeg","profile_background_tile":false,"profile_image_url":"http://pbs.twimg.com/profile_images/609748341119844352/7dUd606e_normal.png","profile_image_url_https":"https://pbs.twimg.com/profile_images/609748341119844352/7dUd606e_normal.png","profile_banner_url":"https://pbs.twimg.com/profile_banners/21447363/1428015534","profile_link_color":"D55732","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"78C0A8","profile_text_color":"5E412F","profile_use_background_image":true,"has_extended_profile":false,"default_profile":false,"default_profile_image":false,"following":true,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"is_quote_status":false,"retweet_count":5366,"favorite_count":10510,"entities":{"hashtags":[{"text":"madpotion","indices":[24,34]}],"symbols":[],"user_mentions":[],"urls":[{"url":"https://t.co/UfyPQIwIj4","expanded_url":"https://instagram.com/p/5fRc5mP-YB/","display_url":"instagram.com/p/5fRc5mP-YB/","indices":[35,58]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"}
Поэтому, когда я вставляю в цикл, как показано в коде для TwitterResp
будучи огромной строкой, в конце я вижу что-то вроде 154 строки в таблице не 200. Для какого-то другого пользователя я вижу 186 не 200 и так далее. Теперь независимо от того, сколько раз я запускаю код для Кэти Перри, я получаю только 154 и аналогично для других пользователей. Мне было интересно, почему это может быть? Является ли процесс вставки медленным для этого цикла с огромными вставками строк, которые пропускают некоторые строки?
$users = array("result" => ["@katyperry"]);
foreach ($users['result'] as $user) {
// strip the initial character '@' and get 200 Twitter Responses for that screen-name.
$twitterResp = getTweet(substr($user, 1), 200);
$count = 1;
mysqli_query(getConnection(), "START TRANSACTION;");
foreach($twitterResp as $response){
$object = $response;
$query = "INSERT INTO Tweets(Number, TwitterHandle, TwitterResp) VALUES('".(string)$count."', '".$user."', '".json_encode($object)."');";
$count += 1;
$res = mysqli_query(getConnection(),$query);
}
mysqli_query(getConnection(), "COMMIT;");
}
PS: я также попытался добавить твиты в один запрос, в основном добавив много VALUES (), VALUES (), …..
Это тоже не сработало.
Как я могу это исправить? Какие-либо предложения?
Сначала измените ваш код для обработки ошибок MySQL. Это определенно даст вам подсказку, что происходит не так.
$res = mysqli_query(getConnection(),$query);
if(false === $res) {
echo "Insertion error: " . mysqli_error();
}
Я предполагаю, что вы превышаете максимальную длину для TEXT
или же BLOB
типа, что вы использовали для столбца TwitterResp.
Может показаться, что длина данных для TEXT
или же BLOB
Тип неограничен, но это не так. TEXT
/ BLOB
может обрабатывать до 65536 байт (~ 64 КБ), в то время как MEDIUMTEXT
/ MEDIUMBLOB
имеют емкость ~ 16 МБ и LONGTEXT
/ LONGBLOB
до ~ 4 ГБ.
Обратите внимание, что это только ограничения типа, вы также должны учитывать размер буфера соединения, количество доступной памяти и т. Д., Что также может привести к усечению данных. Увидеть MySQL документация для получения дополнительной информации.
В заключение вы можете попробовать изменить тип столбца на MEDIUMTEXT
или же MEDIUMBLOB
которые имеют более высокую емкость. Тем не менее, если этого недостаточно, я бы предложил сохранить данные в файле и сохранить путь к файлу в базе данных.
Других решений пока нет …