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__)
来定位到当前文件。