За последние 24 часа нас посетили 62774 программиста и 1741 робот. Сейчас ищут 1149 программистов ...

Таймаут в PHP pthreads / kill() не работает.

Тема в разделе "PHP для новичков", создана пользователем freelsd, 12 апр 2015.

  1. freelsd

    freelsd Активный пользователь

    С нами с:
    12 апр 2015
    Сообщения:
    63
    Симпатии:
    0
    Я уже не знаю куда с этим вопросом писать. Суть в том, что мне нужен таймаут в выполнении потока и соответственно завершать поток, когда таймаут достигнут. Хотелось бы знать, есть ли такая возможность в самой библиотеке? Пробовал вручную реализовать, но здесь еще одна проблема $workers[$i]->kill(); возвращает false и поток не завершает. В чем может быть проблема? Спасибо.
    Код (PHP):
    1. <?php
    2.  
    3. /**
    4. * Author: Abu Ashraf Masnun
    5. * URL: http://masnun.me
    6. */
    7. //define("TMT",3); 
    8.  
    9. class WorkerThreads extends Thread
    10. {
    11.     private $workerId;
    12.  
    13.     public function __construct($string)
    14.     {
    15.         $this->command_string = trim($string);
    16.     }
    17.  
    18.     public function run()
    19.     {
    20.           
    21.         echo $this->command_string." ".Thread::getCurrentThreadId()."\n";
    22.     //sleep(rand(0, 3));
    23.     $str = "C:\\Users\\Alex\\Desktop\\2web\\phantom\\phantomjs.exe C:\\Users\\Alex\\Desktop\\2web\\test.js ";
    24.     
    25.     $url = $this->command_string;
    26.     $d = explode("://",$url);
    27.     $ex_str = $str." ".$url." > ".$d[1].".html";
    28.     //$ex_str = $str." ".$url;
    29.     //echo $ex_str;
    30.     //$ex_str =  escapeshellarg($ex_str);
    31.     //echo $ex_str;    
    32.     
    33.     exec($ex_str, $out);
    34.         
    35.     //print_r($out);
    36.     }
    37. }
    38.  
    39. //$data = file('sites.txt'); 
    40. $data_f = file('sites_x.txt');
    41. print_r($data_f);
    42. $data = array();
    43. $data_size = count($data_f);
    44. for($i = 0;$i<$data_size;$i++)
    45. {
    46.   $info = explode(";",trim($data_f[$i]));
    47.   if($info[1] === 'y')
    48.     continue;
    49.   $data[] = $info[0];
    50. }
    51. print_r($data);
    52. $data_size = count($data);
    53. // Worker pool
    54. $workers = [];
    55. $t_count = 4;
    56. $flag = 1;
    57. $k = 0;
    58. //echo "$data_size";
    59.  
    60. while($flag === 1)
    61. {    
    62.   
    63.   
    64.   /*
    65.   //echo "$k\n";
    66.   if($k >= $data_size)
    67.   {    
    68.     //echo "111"; exit();
    69.     $flag = 0;
    70.     break 2;
    71.   }
    72.   */
    73.   $c_w = count($workers);
    74.  
    75.   if($c_w < $t_count)
    76.   {
    77.     for($i = $c_w; $i<$t_count - $c_w;$i++)
    78.     {
    79.       if($k >= $data_size)
    80.       {
    81.         $flag = 0;
    82.         break;
    83.       }    
    84.       
    85.       $workers[$i] = new WorkerThreads($data[$k]);
    86.       //echo $data[$k]."\n";
    87.       echo "worker $i started\n";
    88.       $workers[$i]->start();
    89.       $k++;    
    90.     }
    91.   
    92.   }
    93.  
    94.   $c_w = count($workers);
    95.   for($i=0;$i<$c_w;$i++)
    96.   {
    97.       
    98.       $workers[$i]->kill();
    99.       unset($workers[$i]);
    100.       echo "unset $i\n";
    101.       //var_dump($workers[$i]->isTerminated(), $workers[$i]->getTerminationInfo());
    102.       /*
    103.       if($workers[$i]->join())
    104.       {
    105.         //var_dump($workers[$i]->isTerminated(), $my->getTerminationInfo());
    106.         echo "joining $i\n";
    107.         unset($workers[$i]);
    108.         
    109.       } 
    110.       */
    111.   }
    112.   
    113.  
    114. }
    115.  
    116. ?>