PHP pthread 多线程 案例
<?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 多线程 案例的更多相关文章
- pthread多线程编程的学习小结
pthread多线程编程的学习小结 pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写 程序员必上的开发者服务平台 —— DevSt ...
- C#多线程案例基础
C#多线程案例基础(转) 在学习多线程之前,我们先来看几个概念: 1,什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源,当然一个程序也可能开 ...
- 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 ...
- Java 多线程案例
同步代码块 SynchronizedTest类,用来表示取票功能 package concurency.chapter6; public class SynchronizedTest implemen ...
- C语言使用pthread多线程编程(windows系统)二
我们进行多线程编程,可以有多种选择,可以使用WindowsAPI,如果你在使用GTK,也可以使用GTK实现了的线程库,如果你想让你的程序有更多的移植性你最好是选择POSIX中的Pthread函数库,我 ...
- clone的fork与pthread_create创建线程有何不同&pthread多线程编程的学习小结(转)
进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合,这些资源在Linux中被抽 象成各种数据对象:进程控制块.虚存空间.文件系统,文件I/O.信号处理函数.所以创建一个进程的 过程就是这 ...
- 多线程案例:龟兔赛跑-Race
多线程案例:龟兔赛跑-Race 前置条件: 首先来个赛道距离,然后要离终点越来越近 判断比赛是否结束 打印出胜利者 龟兔赛跑开始 故事中是乌龟赢了,兔子需要睡觉,所以我们来模拟兔子睡觉 乌龟赢得比赛 ...
- NDK中使用pthread多线程中自己写的一个BUG
在使用pthread进行NDK中的多线程开发时,自己写了一个BUG, void *darkGrayThread(void *args) { ThreadParam *param = (ThreadPa ...
- php Pthread 多线程 Worker
<?php //PHP 高级编程之多线程 http://www.netkiller.cn/journal/thread.php.html#idp57489856 //worker 是一个具有持久 ...
随机推荐
- 如何在hanlp词典中手动添加未登录词
我们在使用hanlp词典进行分词的时候,难免会出现分词不准确的情况,原因是由于内置词典中并没有收录当前的这个词,也就是我们所说的未登录词,只要把这个词加入到内置词典中就可以解决类似问题,如何操作,下 ...
- java中的内部类详解
https://www.cnblogs.com/dolphin0520/p/3811445.html https://www.cnblogs.com/chenssy/p/3388487.html
- 静态初始化块和main方法哪个先被执行?
直接看代码 public class BlockAndMain { public static void main(String[] args) { System.out.println(" ...
- api.js封装请求
1. 传入对象格式如 { a:{ getData:{ url: 'xx/xx/xx', method: 'get', require:['id', 'name'], // 简单检查 必传参数确实则不发 ...
- 涂抹mysql笔记-数据导出导入
数据导出导入<>利用CSV存储引擎加载数据:CSV存储引擎基于CSV格式文件存储数据,CSV格式是纯文本格式的文件,以逗号分隔取值.CSV引擎表的所有列值不能为空.Excel可以直接打开有 ...
- linux添加zabbix service并开机自动启动
最近有个数据库相关操作后需要重启操作系统,重启后发现zabbix监控一直没有数据,迷了半天原来zabbix压根就没有启动.想了半天决定把zabbix添加到系统服务,并设置开机启动. 1.按一定的规则编 ...
- Python3网络爬虫(四):使用User Agent和代理IP隐藏身份《转》
https://blog.csdn.net/c406495762/article/details/60137956 运行平台:Windows Python版本:Python3.x IDE:Sublim ...
- rabbitmq (三) 发布/订阅
rabbitmq的目的并不是让生产者把消息直接发到队列里面去, 这样不能实现解耦的目的,也不利于程序的扩展. 所以就有交换机(exchanges)的概念. 交换机有几种类型:direct, topic ...
- pyton unittest
在说unittest之前,先说几个概念: TestCase 也就是测试用例 TestSuite 多个测试用例集合在一起,就是TestSuite TestLoader是用来加载TestCase到Test ...
- Servlet 教程 各个知识点简单概括
Servlet 教程 http://www.ziqiangxuetang.com/servlet/servlet-cookies-handling.html Servlet 教程 Servlet 教程 ...