@astrotrain

Почему php pthreads крашится?

У меня есть такой код для процессинга ссылок
<?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))


В чем может быть проблема (утечка ресурсов?) И как ее исправить? Спасибо.
  • Вопрос задан
  • 278 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы