У меня есть такой код для процессинга ссылок
<?php
error_reporting(E_ALL & ~E_NOTICE);
include ("functions/curl.php");
class job extends Collectable {
private $url;
public $result = false;
private $outfile;
public function __construct($url, $out_file) {
$this->url = $url;
$this->outfile = $out_file;
}
public function run() {
$vars = GetServerVars ( $this->url );
// print_r($vars);
if ($vars) {
$str = "";
$n_ar = array ();
// удаляем ненужные символы, формируем строку
foreach ( $vars as $k => $v ) {
if ($v != "")
$v = trim ( $v );
$n_ar [$k] = $v;
}
$vars = $n_ar;
$str = implode ( ",", $vars );
$str .= "\r\n";
$fp = fopen ( $this->outfile, "a" ) or exit ( "Can't open " . $this->outfile . "!\n" );
if (flock ( $fp, LOCK_EX )) {
// пишем в залоченный файл
fputs ( $fp, $str );
fflush ( $fp );
flock ( $fp, LOCK_UN );
} else {
echo "Сan't flock() " . $this->outfile . "!\n";
return;
}
$this->result = true;
}
$this->setGarbage ();
}
}
//входной файл
//$input_file = "urls.txt";
$input_file = "Large_url.txt";
$lines = file($input_file);
//файл с результирующими строками
$out_file = "out.txt";
$fp = fopen($out_file, "w") or exit("Can't open ".$out_file."\n");
fclose($fp);
// Максимальное количество запущенных тредов
$max_threads = 100;
$pool = new Pool ( $max_threads );
// $lines = file("Large_url.txt");
//$lines = file ( "urls.txt" );
$total_lines = count ( $lines );
if($total_lines < 1)
exit("List is empty. Exiting\n");
$processed = 0;
$valid = 0;
$s_time = microtime ( TRUE );
$flag = true;
$total_tasks_count = 0;
$handled = 0;
$tasks = array ();
while ( $flag == true ) {
if ($total_tasks_count >= $total_lines) {
$flag = false;
break;
}
//запускаем не больше заданного числа тредов
$t = 0;
for($total_tasks_count; $total_tasks_count < $total_lines; $total_tasks_count ++) {
if ($total_tasks_count >= $total_lines) {
$flag = false;
break;
}
//добавляем задачу
$tasks [] = new job ( $lines [$total_tasks_count], $out_file );
echo "$total_tasks_count:" . $lines [$total_tasks_count] . "\n";
//нужное число тредов достигнуто
if ($t >= $max_threads)
break;
//новый тред добавлен в массив задач
$t ++;
}
// добавляем задачи
foreach ( $tasks as $task ) {
$pool->submit ( $task );
}
// ждем завершения очереди
$pool->shutdown ();
// получаем результаты работы потоков
$pool->collect ( function ($checkingTask) {
global $processed, $valid;
$processed ++;
if ($checkingTask->result == true) {
$valid++;
// echo "TRUE\n";
} else {
// echo "FALSE\n";
}
return $checkingTask->isGarbage ();
} );
echo "processed:".$processed."\n";
echo "\n\n\n\n";
//echo "$processed\n";
//echo "$total_lines\n";
$percent = ($processed / $total_lines) * 100;
echo "percent:".$percent."\n";
//sleep ( 5 );
unset ( $tasks );
}
Но в какой-то момент php вылетает и в лог пишется ошибка:
Fatal error: Uncaught exception 'RuntimeException' with message 'pthreads has detected that the Worker could not be started, the system lacks the necessary resources or the system-imposed limit would be exceeded' in C:\xampp\htdocs\w\thread_test.php:107
Stack trace:
#0 [internal function]: Thread->start()
#1 C:\xampp\htdocs\w\thread_test.php(107): Pool->submit(Object(job))
В чем может быть проблема (утечка ресурсов?) И как ее исправить? Спасибо.