php多线程thread开发与应用的例子

Php多线程的使用,首先需要PHP5.3以上版本,并安装pthreads PHP扩展,可以使PHP真正的支持多线程,扩展如何安装请自行百度

PHP扩展下载:https://github.com/krakjoe/pthreads

PHP手册文档:http://php.net/manual/zh/book.pthreads.php

在安装好扩展之后,就可以运用多线程了,下面贴个通过搜索结果抓取百度网盘内容的代码:

<?php
include ‘include/CurlLoad.class.php‘; // 引入读取库
/**
 * 多线程抓取内容
 * @param array $url 待抓取URL列表集合
 * @return 成功返回指定内容,失败返回NULL
 */
function vget($url) {
 $ret = BaiduSRLinksGet ( $url, 1 ); // 获取结果列表地址
 if ($ret != null) {
  if (array_key_exists ( "links", $ret )) {
   $infos = array ();
   $number = count ( $ret [‘links‘] );
   for($i = 0; $i < $number; $i ++) {//循环创建线程对象
    $thread_array [$i] = new baidu_thread_run ( $ret [‘links‘] [$i] );
    $thread_array [$i]->start ();
   }
   foreach ( $thread_array as $thread_array_key => $thread_array_value ) {//检查线程是否执行结束
    while ( $thread_array [$thread_array_key]->isRunning () ) {
     usleep ( 10 );
    }
    if ($thread_array [$thread_array_key]->join ()) {//如果执行结束,取出结果
     $temp = $thread_array [$thread_array_key]->data;
     if ($temp != null)
      $infos [‘res‘] [] = $temp;
    }
   }
   $infos [‘pages‘] = $ret [‘pages‘];
   $infos [‘status‘] = "1";
  } else
  $infos = null;
 } else
  $infos = null;
 return $infos;
}
/**
 * 获取百度搜索结果列表URL
 *
 * @param string $url
 *         搜索结果页URL
 * @param int $format
 *         默认$format=0,获取默认地址;$format=1获取跳转后真实地址
 * @return NULL multitype:array()
 */
function BaiduSRLinksGet($url, $format = 0) {
 $html = CurlLoad::HtmlGet ( $url ); // 获取页面
 if ($html == null)
  return null;
 try {
  preg_match_all ( "/"url":"(?<links>.*)"}/", $html, $rets ); // 搜索结果链接筛选
  if (! array_key_exists ( ‘links‘, $rets )) // 如果数组中不包含Links键名,表示获取失败
   return null;
  $ret = array ();
  if ($format == 1) {
   $number = count ( $rets [‘links‘] );
   for($i = 0; $i < $number; $i ++) {
    $headr_temp = CurlLoad::Get_Headers ( $rets [‘links‘] [$i], 1 ); // 通过headr获取真实地址
    if (array_key_exists ( "Location", $headr_temp ))
     $ret [‘links‘] [$i] = $headr_temp [‘Location‘];
    else
     $ret [‘links‘] = $rets [‘links‘];
   }
  } else
   $ret [‘links‘] = $rets [‘links‘];
  preg_match_all ( ‘/href="?/s?wd=site%3Apan.baidu.com%20(?<url>.+?)&ie=utf-8">/‘, $html, $out );
  unset ( $out [‘url‘] [0] );
  $number = count ( $out [‘url‘] );
  for($i = 1; $i < $number; $i ++) {
   preg_match_all ( ‘/&pn=(.*)/‘, $out [‘url‘] [$i], $temp );
   $ret [‘pages‘] [$temp [1] [0] / 10] = base64_encode ( $out [‘url‘] [$i] );
  }
  return $ret;
 } catch ( Exception $e ) {
  WriteLog ( $e );
  return null;
 }
}
/**
 * 百度网盘资源信息获取
 *
 * @param string $url
 *         网盘资源页URL
 * @return NULL array
 */
function PanInfoGet($url) {
 $html = CurlLoad::HtmlGet ( $url ); // 获取页面
 if ($html == null)
  return null;
 try {
  if (preg_match_all ( "/文件名:(?<name>.*) 文件大小:(?<size>.*) 分享者:(?<user>.*) 分享时间:(?<date>.*) 下载次数:(?<number>[0-9]+)/", $html, $ret ) == 0)
   return null;
  $rets [‘name‘] = $ret [‘name‘] [0];
  $rets [‘size‘] = $ret [‘size‘] [0];
  $rets [‘user‘] = $ret [‘user‘] [0];
  $rets [‘date‘] = $ret [‘date‘] [0];
  $rets [‘number‘] = $ret [‘number‘] [0];
  $rets [‘link‘] = $url;
  return $rets;
 } catch ( Exception $e ) {
  WriteLog ( $e );
  return null;
 }
}
function WriteLog($str) {
 $file = fopen ( "../error.log", "a+" );
 fwrite ( $file, "Warning:" . date ( "Y/m/d H:i:s" ) . ":" . $str . "rn" );
 fclose ( $file );
}
/**
 * 多线程抓取对象
 * @author MuXi
 *
 */
class baidu_thread_run extends Thread {
 public $url;
 public $data;
 public function __construct($url) {
  $this->url = $url;
 }
 public function run() {
  if (($url = $this->url)) {
   $this->data = PanInfoGet ( $url );//线程执行方法
  }
 }
}
?>
时间: 2024-11-13 08:02:54

php多线程thread开发与应用的例子的相关文章

[java多线程] - Thread&amp;Runnable运用

负载是一个很大的话题,也是一个非常重要的话题.不管是在大的互联网软件中,还是在一般的小型软件,都对负载有一定的要求,负载过高会导致服务器压力过大:负载过低又比较浪费服务器资源,而且当高请求的时候还可能出现低效率的问题.多线程就是一种提高服务效率的方式.面对海量的用户请求,单线程肯定扛不住,那么多线程的需求也就应运而生,所以说掌握多线程的开发技术对于技术人员来说肯定是非常重要的.参考文档http://docs.oracle.com/javase/7/docs/api/. 一.Runnable使用

Java 多线程编程两个简单的例子

/** * @author gao */ package gao.org; public class RunnableDemo implements Runnable{ @Override public void run() { // TODO Auto-generated method stub for(int i=0;i<10;i++){ System.out.println("新线程输出:"+i); } } public static void main(String []

Java基础第八天听课总结(2)--多线程&Thread

进程 在任务管理器中查看进程,应用程序对应一个进程 进程之间的内存是隔离的,进程间是通过套接字通信Socket通信 什么是线程? ------------------------------ 线程是程序执行过程中,并发执行的代码段 线程之是可以共享内存. 线程的执行是从上往下按序执行的. 创建线程方式一 继承Thread 子类覆盖中的run方法,将线程执行的代码存放在run中 建立子类对象的同时线程也被创建. 通过调用start方法开启线程 Thread是线程类 start() //通知CPU可

2.匿名类,匿名类对象,private/protected/public关键字、abstract抽象类,抽象方法、final关键字的使用,多线程Thread类start方法原理

package com.bawei.multithread; //注意:模板方法我们通常使用抽象类或者抽象方法!这里我们为了方便在本类中使用就没有使用抽象类/抽象方法 public class TemplateThread { //如果这个方法不想被子类或者别人随意改动[这样子类就不能覆写该方法了],这里方法就要设置为final方法 public final void println(String message){ System.out.println("###################

Chromium开发--入门C++小例子

开始做Chromium开发的时候,都是从代码去摸索的,现在有几个例子了.希望看到的同学能有帮助,比直接在大量代码里领悟要快很多了. C++ in Chromium 101 - Codelab http://www.chromium.org/developers/cpp-in-chromium-101-codelab 0) hello world - https://codereview.chromium.org/23567011/ 1) command line arguments - http

RAD 极速应用开发 Spring ROO 入门例子

官网                                      http://projects.spring.io/spring-roo/ Spring ROO in action        http://www.kuaipan.cn/file/id_65688015804336770.htm?source=1 Eclipse 集成 STS               http://spring.io/tools/sts/all 减少了大量的配置文件的繁琐工作,爽!但前提是对

关于多线程Thread.Stop()破坏原子性

  public class Main { public static void main(String[] args) { // TODO Auto-generated method stub MutiThread t=new MutiThread(); Thread t1=new Thread(t); /*多线程断点调试,错误结果,如果在此处执行断点,t1执行完毕,numa回复正确状态-------此处注意*/ t1.start(); for(int i=0;i<5;i++){ new Th

QT 多线程程序设计(也有不少例子)

QT通过三种形式提供了对线程的支持.它们分别是,一.平台无关的线程类,二.线程安全的事件投递,三.跨线程的信号-槽连接.这使得开发轻巧的多线程Qt程序更为容易,并能充分利用多处理器机器的优势.多线程编程也是一个有用的模式,它用于解决执行较长时间的操作而不至于用户界面失去响应.在Qt的早期版本中,在构建库时有不选择线程支持的选项,从4.0开始,线程总是有效的. 线程类 Qt 包含下面一些线程相关的类:QThread 提供了开始一个新线程的方法QThreadStorage 提供逐线程数据存储QMut

Java 多线程——Thread类和Runable接口

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限, 下面看例子: [java] view plaincopy package org.thread.demo; class MyThread extends Thread{ private String name; public