Во-первых, ваш скрипт импортирует файл, используя \n
, но если кто-то загрузит файл с символом Windows, например \r\n
, ваш скрипт не будет работать.
Во-вторых, ваше почтовое регулярное выражение не работает должным образом. Я рекомендую использовать filter_var .
Что бы я порекомендовал для вашего стола, это создавать ежедневные столы. Таким образом, когда вы запрашиваете вашу таблицу, она будет выполняться быстрее. Если у вас есть только одна таблица с varchar
в качестве индексов, это может через некоторое время замедлиться (при условии, что люди хотят отказаться от плохого сайта [что, я думаю, они делают]) - но это только я.
CREATE TABLE `unsub_20111127` (
`email` varchar(255) NOT NULL,
`domain` varchar(255) NOT NULL,
`is_unsubscribed` tinyint(3) NOT NULL DEFAULT 0,
PRIMARY KEY (`email`, `domain`),
KEY is_unsubscribed (`is_unsubscribed`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Таким образом, каждый раз легче обрабатывать небольшое количество данных. Я добавил статус на случай, если вам придется повторить процесс снова, чтобы вы обрабатывали данные только с is_unsubscribed = 0
(не обработано)
(если вам нужно создать таблицу, которая читает все таблицы, вы можете создать таблицу слияния );
PHP:
function insertEmail($db, $service, array $data) {
// logic for insert
$sql = 'INSERT IGNORE INTO table_YYYYMMDD VALUES ' . implode(',', $data);
}
function createTable($date) {
// logic for insert
$sql = 'CREATE TABLE IF NOT EXISTS table_' . $date . ' /* etc...*/';
}
// start
// create the table for the next day if not exists
createTable(date('Ymd', strtotime('tomorrow')));
$file = file('sample.txt', FILE_IGNORE_NEW_LINES ^ FILE_SKIP_EMPTY_LINES);
$emailList = array();
foreach($file as $line) {
$line = decrypt($line);
if(!filter_var($line, FILTER_VALIDATE_EMAIL)) {
$services = checkEmail($line);
if(is_array($services)) {
foreach($services as $service) {
$emailList[] = "('" . $line . "', '" . $service . "', 1)";
}
if(!empty($emailList)) {
insertEmail($db, $service, $emailList);
}
$emailList = array();
}
}
}