<?php /** *检测http服务是否可以正常访问 *启动三个线程执行任务 */ class taskWork extends Thread { public $url = ''; //检测任务URl public $name = ''; public $thread_id = ''; public $is_runing = true; //运行标志 public function __construct($name) { $this->name = $name; } public function run() { while($this->is_runing) { if(!empty($this->url)) //判断当前进程是否存在任务 { echo "线程:[{$this->name}]正在处理 URL:[{$this->url}]\r\n"; $t1 = microtime(true); $httpcode = $this->httpcode($this->url); $t2 = microtime(true); $t = $t2-$t1; if($httpcode == 200) { echo "URL:[{$this->url}] 处理结果 正常 请求时间{$t}\r\n"; }else{ echo "URL:[{$this->url}] 处理结果 异常 请求时间{$t}\r\n"; } $this->url = ''; //任务执行完 清空 }else{ echo "线程:[{$this->name}]等待任务....\r\n"; } sleep(1); } } public function httpcode($url){ $ch = curl_init(); $timeout = 3; curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); curl_setopt($ch,CURLOPT_URL,$url); curl_exec($ch); $httpcode = curl_getinfo($ch,CURLINFO_HTTP_CODE); curl_close($ch); return $httpcode; } } $urls=[ 'https://www.1.com', 'https://www.2.com', 'https://www.3.com', 'https://www.baidu.com', 'https://www.163.com', 'https://www.qq.com', 'https://www.www.sina.com.cn', 'https://www.51cto.com', 'https://www.9.com', 'https://www.0.com', ]; $threads[] = new taskWork('thread_1'); $threads[] = new taskWork('thread_2'); $threads[] = new taskWork('thread_3'); /** *创建三个线程 *如果不希望在thread->start()后就运行程序 *就执行$thread->wait()后线程并不会立即运行 *收到 $thread->notify()信号后才运行程序 */ foreach($threads as $thread) { $thread->start(); } //线程派发任务 for($i = 1; $i<10; $i++) { while (true) { foreach ($threads as $worker) { if ($worker->url=='') { $worker->url = array_pop($urls); //给每个人线程派发任务 echo "线程:[{$worker->name}]空闲,放入参数{$worker->url}\r\n"; break 2; } } sleep(1); } } echo "所有线程派发完毕,等待执行完成.\r\n"; while (count($threads)) { foreach ($threads as $key => $thread) { if ($thread->url == '') { echo "[{$thread->name}]线程运行完成,空闲 退出.\r\n"; $thread->is_runing = false; //停止线程运行标志 unset($threads[$key]); } } echo "等待中其他线程完成...\r\n"; sleep(1); }