如何在多线程中使用php curl?

时间:2012-09-13 14:31:10

标签: php multithreading wordpress curl

如何使此脚本适用于多线程? 已经尝试过所有教程但没有成功:( 什么是我可以使用curl php的最大线程数?

<?php
$imput  = file("$argv[1]");
$output = $argv[2];


foreach ($imput as $nr => $line) {
$line = trim($line);
print ("$nr - check :" . $line . "\r\n");

$check = ia_continutul($line); 

if (strpos($check,'wordpress') !== false) {

  $SaveFile = fopen($output, "a");
  fwrite($SaveFile, "$line\r\n");
  fclose($SaveFile);
  }
}
print "The END !\r\n";

function ia_continutul($url) {  
    $ch = curl_init();  
    $timeout = 3;  
    curl_setopt($ch,CURLOPT_URL,$url);  
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);  
    curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
  curl_setopt($ch, CURLOPT_TIMEOUT, 5);  
    $data = curl_exec($ch);  
    curl_close($ch);  
    return $data;  
}
?>

2 个答案:

答案 0 :(得分:4)

您可以在PHP中进行多线程...

class Check extends Thread {
    public function __construct($url, $check){
        $this->url = trim($url);
        $this->check = $check;
    }
    public function run(){
        if (($data = file_get_contents($this->url))) {
            if (strpos($data, "wordpress") !== false) {
                return $this->url;
            }
        }
    }
}
$output = fopen("output.file", "w+");
$threads = array();
foreach( file("input.file") as $index => $line ){
    $threads[$index]=new Check($line, "wordpress");
    $threads[$index]->start();
}
foreach( $threads as $index => $thread ){
    if( ($url = $threads[$index]->join()) ){
    fprintf($output, "%s\n", $url);
    }
}

https://github.com/krakjoe/pthreads

答案 1 :(得分:-2)

你不能多线程PHP。它是一种脚本语言,因此脚本按特定顺序运行,如果你必须等待卷曲完成它将继续加载,这就像在你的代码中放入一个Sleep(1)函数。

您可以采取一些基本的措施来帮助加快代码速度。不要在循环内部执行mysql请求(我没有看到任何内容),而是建立一个查询,然后在循环结束后执行。看看你的代码重组,这样你就可以做最少量的卷发,这样就可以快速完成。试着找到一种在循环外做卷曲的方法。