<?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);
}

PHP pthread 多线程 案例的更多相关文章

  1. pthread多线程编程的学习小结

    pthread多线程编程的学习小结  pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写     程序员必上的开发者服务平台 —— DevSt ...

  2. C#多线程案例基础

    C#多线程案例基础(转) 在学习多线程之前,我们先来看几个概念: 1,什么是进程?    当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源,当然一个程序也可能开 ...

  3. VC++6.0 下配置 pthread库2010年12月12日 星期日 13:14VC下的pthread多线程编程 转载

    VC++6.0 下配置 pthread库2010年12月12日 星期日 13:14VC下的pthread多线程编程     转载 #include <stdio.h>#include &l ...

  4. Java 多线程案例

    同步代码块 SynchronizedTest类,用来表示取票功能 package concurency.chapter6; public class SynchronizedTest implemen ...

  5. C语言使用pthread多线程编程(windows系统)二

    我们进行多线程编程,可以有多种选择,可以使用WindowsAPI,如果你在使用GTK,也可以使用GTK实现了的线程库,如果你想让你的程序有更多的移植性你最好是选择POSIX中的Pthread函数库,我 ...

  6. clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结(转)

    进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...

  7. 多线程案例:龟兔赛跑-Race

    多线程案例:龟兔赛跑-Race 前置条件: 首先来个赛道距离,然后要离终点越来越近 判断比赛是否结束 打印出胜利者 龟兔赛跑开始 故事中是乌龟赢了,兔子需要睡觉,所以我们来模拟兔子睡觉 乌龟赢得比赛 ...

  8. NDK中使用pthread多线程中自己写的一个BUG

    在使用pthread进行NDK中的多线程开发时,自己写了一个BUG, void *darkGrayThread(void *args) { ThreadParam *param = (ThreadPa ...

  9. php Pthread 多线程 Worker

    <?php //PHP 高级编程之多线程 http://www.netkiller.cn/journal/thread.php.html#idp57489856 //worker 是一个具有持久 ...

随机推荐

  1. etcd和redis的比较和日常使用场景

    转自https://blog.csdn.net/weixin_41571449/article/details/79429511 个人观点:etcd的红火来源于kurbernetes用etcd做服务发 ...

  2. JDK8安装与配置

    如果是免安装包 配置方法 1.配置java环境变量 注意:jdk文件夹名字取名不要用汉语取名. 1)鼠标右键点击我的电脑(计算机)选择属性栏 2)再点击左边高级系统设置 3)点击环境变量 4)在系统变 ...

  3. Docker安装(一)

    环境:CentOS release 6.9 (Final)   1.检查环境是否支持安装docker 1)系统内核是否是3.8或更高版本 uname -a (这个安装不了,内核版本不够) Linux ...

  4. xpython在Windos下的安装及简单的文本打开、保存

    前几天写自动化部署脚本,用的是paramiko和shell相结合,paramiko可是实现ssh登录,文件及文件夹的上传下载,这些功能,然后一直想自己写个东西出来,于是就想把这些功能我把他放到图形化界 ...

  5. bootstrap模态框弹框后执行Ajax

    如下: editModal:模态框ID <script> $(document).ready(function() { $('#editModal').on('hidden.bs.moda ...

  6. 5G投资逻辑

    5G投资逻辑 关注光模块生产厂商. 通信射频滤波器,功率放大器生产厂商. 光无源器件的需求增多

  7. sql server紧急状态下登录脚本

    --打开xp_cmdshell功能  EXEC [sys].[sp_configure] @configname = 'xp_cmdshell', -- varchar(35)    @configv ...

  8. Centos6.5部署Sonar6.7.1备注

    1.一定要用非root账号登录(自己建立账号),建立Sonar目录并部署,因为使用了Elasticsearch 5.6.3做搜索服务器,而它不允许用root账号启动服务,会报如下错误: Excepti ...

  9. 廖雪峰Java7处理日期和时间-3java.time的API-1LocalDateTime

    1.java.time提供了新的日期和时间API: LocalDate/LocalTime/LocalDateTime ZoneDateTime/ZoneId Instant Formatter 新A ...

  10. CSS之img标签

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...