<?php
//*************************************************************************
// multi_thread_tools.php : implementation file
// Version : 1.0
// Date :  December 2013
// Author : Andre Dolenko
// Email :  bigfozzy@gmail.com
// Latest Version : http://x-datas.com/
//*************************************************************************

//////////////////////////////////////////////////// ЗАПУСК PHP СБОРЩИКОВ В НЕСКОЛЬКО ПОТОКОВ /////////////////////////////////////////////////
class CMultiThreadLauncher
{
    
///////////////////////////////////////////////////

    // число потоков
    
var $num_threads;

    
// путь к исходным файлам
    
var $src_folder="src";
    
// путь к папке где будут созданы потоки
    
var $threads_folder="threads";

    
// массив с проксями
    
var $proxies=null;

    
///////////////////////////////////////////////////

    // конструктор
    
function CMultiThreadLauncher($num_threads,$src_folder="src",$threads_folder="threads")
    {
        
// число потоков
        
$this->num_threads=$num_threads;

        
// путь к исходным файлам
        
$this->src_folder=$src_folder;    

        
// путь к папке где будут созданы потоки
        
$this->threads_folder=$threads_folder;    
    }

    
///////////////////////////////////////////////////

    // разделим входящий файл на заданное число частей
    
private function split_in_file($path)
    {
        
// лог
        
global $log;
        
$log->event("Поделим файл $path на заданное число частей ... ");

        
// поделим входной файл на задное чило частей
        
CTextFile::split($path,$this->num_threads);
    }

    
// создаем папку потока
    
private function create_main_folder($Num)
    {
        
// создаем папку потока            
        
$thread_folder="$this->threads_folder/$Num/";
        
CFolder::create($thread_folder);

        
// копируем файл выполнения
        
CFile::copy ($this->src_folder."/run_one.php",$thread_folder."run.php");

        return 
$thread_folder;
    }
    
// создаем папку входных данных
    
private function create_in_folder($thread_folder,$Num)
    {
        
// создаем папку лога
        
$in_folder=$thread_folder."in";
        
CFolder::create($in_folder);

        
// переместить заданную часть проксей
        
CFile::move("src/in/proxy.txt.$Num.txt",$in_folder."/proxy.txt");
        
// переместить заданную часть запросов
        
CFile::move("src/in/queries.txt.$Num.txt",$in_folder."/queries.txt");

        
// удалим файл продолжения
        
CFile::delete($in_folder."/queries.txt.continue.txt");

        return 
$in_folder;
    }
    
// создаем папку лога
    
private function create_log_folder($thread_folder)
    {
        
// создаем папку лога
        
$log_folder=$thread_folder."log";
        
CFolder::create($log_folder);

        return 
$log_folder;
    }
    
// создаем папку выходных данных
    
private function create_out_folder($thread_folder)
    {
        
// создаем папку лога
        
$out_folder=$thread_folder."out";
        
CFolder::create($out_folder);

        return 
$out_folder;
    }
    
    
///////////////////////////////////////////////////

    // создадим папки потоков
    
function create_threads()
    {
        
// создадим папку для потоков
        
CFolder::create($this->threads_folder);

           
// разделим файл проксей
        
$this->split_in_file("src/in/proxy.txt");
           
// разделим файл запросов
        
$this->split_in_file("src/in/queries.txt");

        
// лог
        
global $log;
        
$log->event("Создаем $this->num_threads потоков выполнения : ");

        
// создадим папки потоков
        
for ($i=0;$i<$this->num_threads;$i++)
        {
                
// создаем папку потока                    
                   
$thread_folder=$this->create_main_folder($i);            
                
$log->event_begin("Создаем $thread_folder : ");    
        
                
// создаем папку входных данных
                
$this->create_in_folder($thread_folder,$i);
                
$log->event_add(" in ");    
                
                
// создаем папку лога
                
$this->create_log_folder($thread_folder);
                
$log->event_add(" log ");    

                
// создаем папку выходных данных
                
$this->create_out_folder($thread_folder);
                
$log->event_add(" out ");    

                
// завершаем событие лога
                
$log->event_end();    
        }
        
$log->event("Создание $this->num_threads потоков завершено.");
    }        

    function 
run($from,$php_path="\"c:/php/php.exe\"")
    {
        
// создадим бат файл
        
$bat_file_path=$from."\\run.bat";
        
$bat_file_content="";
        for (
$i=0;$i<$this->num_threads;$i++)
           
$bat_file_content.="start \"$i\" /i /b $php_path \"".$from."\\".$this->threads_folder."\\$i\\run.php\"\n";
        
CTextFile::write($bat_file_path,$bat_file_content);            

        global 
$log;
        
$log->event("Запускаем $this->num_threads потоков");
        
system("cmd /c \"".$bat_file_path."\"");
    }


    
///////////////////////////////////////////////////
};
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
?>