pthreads php使用记录

一直想试试Pthread,之前没什么好的练手项目。最近正好在做haimawari8大图抓取,此站只提供550大小的图片。分辨率更高的图片是分成了d*d块550大小的局部图,想要大图必须先将局部图都抓下来,然后再进行拼接。然,抓每张图片都挺慢的,遂->pthread

1.pthread 中的start()方法,会将写在class中的run()方法在单独的线程中执行。

/**
* Get pics by threads
*/
class PicSpyder extends Thread
{
    private $url;
    private $filename;

    function __construct($url,$filename)
    {
        $this->url=$url;
        $this->filename=$filename;
    }

    public function run()
    {
        $this->curlGetPics($this->url,$this->filename);
    }

    /**
    *Get file and store 
    *@param $url ,$filename
    */
    public function curlGetPics($url,$filename)
    {
        $ch=curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $img=curl_exec($ch);
        curl_close($ch);
        $fp=fopen($filename, 'w');
        fwrite($fp, $img);
        fclose($fp);
    }
}

2.全部对象start()之后,需要再另行join()

//good
foreach($pool as $worker){
    $worker->start();
}
foreach($pool as $worker){
    $worker->join();
}

如果start()和join()在同一个循环中,线程会按照顺序单独执行(a完成才执行b)

//bad
foreach($pool as $worker){
    $worker->start();
    $worker->join();
}

3.线程中文件路径要写绝对路径

在线程中,如果写成相对路径,fopen会返回一个false
只有写成绝对路径才行 ps.原因不明
使用 dirname(__FILE__) 来定位到当前文件。

标签: none
返回文章列表 文章二维码
本页链接的二维码
打赏二维码
添加新评论