Сегодня решил попробовать написать что то на подобии многопоточного чекера прокси, помню я когдато сливал базу через sql пхп скриптом, база была большая и я делал несколько файлов которые с ливали данные с продолжительной нумерацией, типа 1файл = 0 -100, 2файл = 100-200 и тд, и я решил в даном примере просто размножить скриптом множество фреймов на странице с такойже последовательностью обработки и вот что получилось. PHP: <? error_reporting(0); if($_GET['mod'] == "number") { $start = $_GET['start']; $end = $_GET['end']; $file = file_get_contents("proxy.txt"); preg_match_all("#[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,9}#",$file,$act); $file = "goodproxy.txt"; $a = fopen($file, "a+"); for($i=$start;$i<=$end;$i++) { $proxy = $act[0][$i]; $timeout = 10; // время на соединение с прокси $add = explode(":", "$proxy"); $fp = fsockopen($add[0], $add[1], $er, $ers, $timeout); if (!$fp) {} else { fwrite($a, $add[0].":".$add[1]."\n"); } fclose($a); } }else{ $flow = "50"; // количество фреймов $file = file_get_contents("proxy.txt"); preg_match_all("#[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,9}#",$file,$act); $count = count($act[0]); $result_flow = round($count / $flow) ; for($i=0;$i<=$count;$i=$i+$result_flow ) { $i2 = $i+$result_flow - 1; echo "<iframe src='mpotok.php?mod=number&start=$i&end=$i2' frameborder='0' height='0' width='0'></iframe>"; } } ?> поставил 50 фреймов рейльный ефект в 50 раз быстрее чем просто PHP: <? $file = file_get_contents("proxy.txt"); preg_match_all("#[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:[0-9]{1,9}#",$file,$act); $file = "goodproxy.txt"; $a = fopen($file, "a+"); foreach($act[0] as $proxy) { $timeout = 10; $add = explode(":", "$proxy"); $fp = fsockopen($add[0], $add[1], $er, $ers, $timeout); if (!$fp) { } else { fwrite($a, $add[0].":".$add[1]."\n"); } } fclose($a); ?> Как вам моё творение? или ктото уже про многопоточность придумал лутше и я изобрёл велосипед?
Молодец, а теперь попробуй вместо фреймов сделать все через exec, а в качестве объекта синхронизации пусть будет файл/база данных.
Вроде на неблокирующих сокетах можно "разогнаться", у меня даже что-то получалось. Есть ещё мультикурл.
можно легко сделать синхронизацию через базу, я делал так под винду: - создавал bat файл: PHP: :m wget http://localhost:85/script_name/start.php -O null cls goto m Запускал этот бат файл другим бат файлом вот так: PHP: START 1thread.cmd START 1thread.cmd START 1thread.cmd START 1thread.cmd START 1thread.cmd START 1thread.cmd Останавливал все потоки таким бат файлом (kill.cmd): PHP: taskkill /F /IM cmd.exe wget и все батники ложил рядом со скриптами Все работает прекрасно до 30-40 поток, но дальше - крашится веб-сервер\пхп\еще что-то, так как это все неимоверно жрет ресурсы. И кстати ноут от перегрева вырубается. Переписав аналогичный скрипт на нет фреймворке - получил прирост в производительности в несколько раз, и уменьшение потребляемой памяти в десяток раз. А также - удобная и быстрая синхронизация потоков, блокировки и тд