2015-10-18 3 views
1

В основном у меня есть скрипт, он проверяет страницу для прокси и добавляет ее в строку, затем проверяет ее на наличие дубликатов и выводит их.Удаление дубликатов из строки

Единственная проблема заключается в том, что проверяемая страница имеет 20k + прокси на ней, поэтому это занимает около 3-4 минут подряд, и большинство раз даст мне ошибку, испущенную байтом, или ошибку max_execution.

Есть ли способ проверить дубликаты и просто вывести их быстрее или проще?

<?php 

ini_set('memory_limit', '-1'); 

set_time_limit(1000); 

//Curl Setup; 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, 'x'); 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_HEADER, 1);   
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 

//Execute Curl; 
$page = curl_exec($ch); 

//Regex For Matching Proxies; 
preg_match_all('/(\d){1,3}\.(\d){1,3}\.(\d){1,3}\.(\d){1,3}:(\d){1,5}/ism',$page,$output); 

//Foreach Proxy Found, Output it; 
foreach($output[0] as $op){ $proxies .= $op."\n"; } 

//This doesnt work 
implode('\n',array_unique(explode('\n', $proxies))); 

//Output each proxy 
echo $proxies; 

?> 

О, И, когда он действительно получает прокси без ошибок и помещает их в текстовое поле с помощью AJAX, что делает серьезные проблемы лага. Вы не сможете щелкнуть по чему-то, что есть в запасе. Не уверен, что весь этот вопрос больше связан с AJAX, но не уверен.

ответ

1

Храните их в массиве и используйте array_unique.

$proxies = array(); 
for($i =0, $max = count ($output[0]];$i <$max; $i++) { 
    $proxies[] = $output [0][$i]; 
    // unset to reduce memory usage. Unsure if it'll actually help but 
    unset($output [0][$i]); 
} 
echo implode("\n", array_unique ($proxies)); 

Или используйте значения как ключи для ассоциативного массива. Не уверен, если это будет быстрее, хотя

$proxies = array(); 
foreach($output[0] as $op){ 
    $proxies[$op] = null; 
} 
echo implode("\n", array_keys ($proxies)); 
+0

Ответ youre решены мои проблемы с памятью, первый бит работал. Благодаря! –

0

В соответствии с этим (http://php.net/manual/en/function.array-unique.php#70786 я не проверить это) возможный путь для того, что вы хотите, будет что-то вроде следующего кода:

//Populate the array maybe different for your needs 
$proxies = array(); 
foreach($output[0] as $op) { 
    $proxies[] = $op; 
} 
$unique_proxies = array_keys(array_flip($proxies)); 

*** Запрос:

Было бы неплохо, если бы вы могли сделать бенчмарк, используя свои данные, и сообщить нам результаты.

+0

Просто указатель, делающий пустой массив, связанный с переменной, чтобы использовать [] (Добавить индекс), не требуется. –

+0

Вы отвечаете хорошо, это намного быстрее при использовании Curl. Нагрузку потребовалось около 0,2 секунды. Единственная проблема заключается в том, что с его массива мне нужно было бы сделать массив foreach $ как значение $ и выводить значение, заставляя его делать то же самое, делая много проблем с памятью и (VarDup и Print_R не имеют этой проблемы) Любые идеи? –

+0

Просто попробовал это foreach для вывода прокси, и, как и ожидалось, я получаю фатальную ошибку: допустимый размер памяти 134217728 байт исчерпан (пытался выделить 72 байта). Единственный способ, которым я знаю, это исправить: ini_set ('memory_limit', '-1') ;. Но, как говорят люди, это не очень хорошая практика. Есть идеи? –

Смежные вопросы