> 백엔드 개발 > PHP 튜토리얼 > pthreads - 求助,php使用Pthread进行多进程的问题?

pthreads - 求助,php使用Pthread进行多进程的问题?

WBOY
풀어 주다: 2016-06-06 20:19:04
원래의
1454명이 탐색했습니다.

以下代码运行没有问题,感觉$urls数组有多少数据,就生产多少进程,如果有几万个数据,是不是会有几万个进程?

如果要设置成只有10个进程来处理$urls数组,应该怎么做?

<code><?php header("Content-Type: text/html;charset=utf-8");

    class DuoXianCheng extends Thread {
      public function __construct($arg){
        $this->arg = $arg;
      }
     
      public function run(){
        if($this->arg){
          // echo $this->result = $this->arg;
            $this->result = model_http_curl_get($this->arg);
        }
      }
    }

    $thread = new DuoXianCheng("World");
    if($thread->start()){
        $thread->join();
    }
      

    function model_http_curl_get($url) {
          $curl = curl_init();  
          curl_setopt($curl, CURLOPT_URL, $url);  
          curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
          curl_setopt($curl, CURLOPT_TIMEOUT, 5);  
          curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)');  
          $result = curl_exec($curl);  
          curl_close($curl);  
          return $result;  
    }

    for ($i = 0; $i $url) {
        $workers[$key] = new \DuoXianCheng($url);
        $workers[$key]->start();
    }
    
    foreach ($workers as $key=>$worker) {
        while($workers[$key]->isRunning()) {
            usleep(100);  
        }
        if ($workers[$key]->join()) {
            var_dump($workers[$key]->result);
        }
    }
    $e = microtime(true);
    echo "多线程耗时:".($e-$t)."秒<br>";  
     
     
    /* 单线程速度测试 */
    $t = microtime(true);
    foreach ($urls as $key=>$url) {
        var_dump(model_http_curl_get($url));
    }
    $e = microtime(true);
    echo "For循环耗时:".($e-$t)."秒<br>";  



?></code>
로그인 후 복사
로그인 후 복사

回复内容:

以下代码运行没有问题,感觉$urls数组有多少数据,就生产多少进程,如果有几万个数据,是不是会有几万个进程?

如果要设置成只有10个进程来处理$urls数组,应该怎么做?

<code><?php header("Content-Type: text/html;charset=utf-8");

    class DuoXianCheng extends Thread {
      public function __construct($arg){
        $this->arg = $arg;
      }
     
      public function run(){
        if($this->arg){
          // echo $this->result = $this->arg;
            $this->result = model_http_curl_get($this->arg);
        }
      }
    }

    $thread = new DuoXianCheng("World");
    if($thread->start()){
        $thread->join();
    }
      

    function model_http_curl_get($url) {
          $curl = curl_init();  
          curl_setopt($curl, CURLOPT_URL, $url);  
          curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
          curl_setopt($curl, CURLOPT_TIMEOUT, 5);  
          curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)');  
          $result = curl_exec($curl);  
          curl_close($curl);  
          return $result;  
    }

    for ($i = 0; $i $url) {
        $workers[$key] = new \DuoXianCheng($url);
        $workers[$key]->start();
    }
    
    foreach ($workers as $key=>$worker) {
        while($workers[$key]->isRunning()) {
            usleep(100);  
        }
        if ($workers[$key]->join()) {
            var_dump($workers[$key]->result);
        }
    }
    $e = microtime(true);
    echo "多线程耗时:".($e-$t)."秒<br>";  
     
     
    /* 单线程速度测试 */
    $t = microtime(true);
    foreach ($urls as $key=>$url) {
        var_dump(model_http_curl_get($url));
    }
    $e = microtime(true);
    echo "For循环耗时:".($e-$t)."秒<br>";  



?></code>
로그인 후 복사
로그인 후 복사

curl_init()不开新进程,但客户机的file descriptor是有限的,内存也是有限的,意味着能new的Thread不是无限的。你要达到pthread要达到的目的,不妨看看http://php.net/manual/en/function.curl-multi-init.php,它允许你异步的处理多个curl_init()返回。

Thread 类是线程,不是进程。
创建十个 DuoXianCheng 的对象:
for ($i = 0 ; $i $obj[$i] = new DuoXianCheng("World");
$obj[$i]->start();
}

感谢大家的回复!我指的是线程,不是进程,打字打错了!
如果$urls有十万条数据,然后只开十个线程,应该怎么操作?

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿