慢速PHP脚本,用于格式化、排序和从列表中删除重复项

慢速PHP脚本,用于格式化、排序和从列表中删除重复项,php,Php,我有一个由jQuery.post调用的PHP脚本,它将提交一个电子邮件地址列表,对列表执行一些操作(删除重复项、排序、格式化等),然后将每个地址存储到MySQL数据库中 我遇到的问题是,在一个大列表上执行此操作需要很长时间。我正在测试一个包含15000个电子邮件地址的列表,在300秒(5分钟)内,它只添加了大约5000个地址 我的代码是否有需要很长时间才能处理的地方?给你。我知道我正在做很多格式化工作,但那只是因为一些电子邮件地址包含奇怪的字符等等 // form posts $addresse

我有一个由jQuery.post调用的PHP脚本,它将提交一个电子邮件地址列表,对列表执行一些操作(删除重复项、排序、格式化等),然后将每个地址存储到MySQL数据库中

我遇到的问题是,在一个大列表上执行此操作需要很长时间。我正在测试一个包含15000个电子邮件地址的列表,在300秒(5分钟)内,它只添加了大约5000个地址

我的代码是否有需要很长时间才能处理的地方?给你。我知道我正在做很多格式化工作,但那只是因为一些电子邮件地址包含奇怪的字符等等

// form posts
$addresses = $_POST['email_addresses'];

// cleanse and format
$addresses = trim($addresses);
$addresses = trim($addresses, "\xC2\xA0");
$addresses = str_replace(" ", "", $addresses);
$addresses = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $addresses);
$addresses = str_replace("\n", ",", $addresses);
$addresses = preg_replace('/[^(\x20-\x7F)]*/','', $addresses); 
$addresses = strtolower($addresses);
$array_addresses = explode(",", $addresses);

// get unique values
$unique_addresses = array();
foreach($array_addresses as $key => $value) {
    if(filter_var($value, FILTER_VALIDATE_EMAIL)){ 
        $unique_addresses[$value] = $value;
    }
}

sort($unique_addresses);

foreach($unique_addresses as $arr) {

    if ($insert_addresses_stmt = $mysqli->prepare("INSERT INTO email_addresses (lid, email_addresses) VALUES (?, ?)")) {

        $insert_addresses_stmt->bind_param("ss", $new_lid, $arr);

        $insert_addresses_stmt->execute();

        $insert_addresses_stmt->close();

    }
}

想对此发表评论,但现在还不能。。不管怎么说,纯逻辑给了我一个线索,这样一个巨大的多重过滤/检查/替换帖子会给服务器CPU/RAM带来一些问题,并使PHP内存过载,这是我在处理大型查询时遇到的。。。因此,让我们给它一些空气以备不时之需

你可以试一试。做一个接一个(电子邮件)的工作——而不是一堆15千人。然后等待大约30秒,完成这项工作

// form posts
$add = $_POST['email_addresses']; //15.000 emails in this I suppose

//do walk in a park work first
$add = trim($add, "\xC2\xA0");

//lets get emails one by one..
$addr = explode(",", $add);
unset($add); //flush sufficient data

  {
    while (list($key,$add) = each($addr))
    {

// cleanse and format 1by1
$addresses = str_replace(' ', '', $add);
$addresses = preg_replace("/(^[\r\n]*|[\r\n]+)[\s\t]*[\r\n]+/", "\n", $addresses);
$addresses = str_replace("\n", ",", $addresses);
$addresses = preg_replace('/[^(\x20-\x7F)]*/','', $addresses); 

//finally lower chars
$addresses = strtolower($addresses);

//check email
    if(filter_var($addresses, FILTER_VALIDATE_EMAIL)){ 
//do mysql query (first) if email already exists in your DB. if not...
-> insert this email to DB
   }


 }
}
//done

当然,这种“方法”是在DB条目之前不使用sort()函数,因为这是1by1插入,而不是1db行中的15k束插入(其中
sort()
是必需的)。猜测它是没有必要的,因为我们可以在以后绘制按排序的数据。

使用像xdebug这样的探查器来找出代码中的慢代码。但是,将每个地址添加到数据库中会使您的速度变慢。第一部分似乎是多余的,仅使用过滤器就可以做到这一点。除此之外,如果要添加地址,瓶颈在于数据库操作。你应该分批添加地址,而不是逐个添加。你是如何进行DB插入的?您是在为每个地址进行DB调用,还是在以某种方式对插入进行批处理?因此,如果它添加了5000个项目,则必须通过数据库代码的所有格式设置。你能分享数据库代码吗?我已经更新了帖子,把代码插入数据库。