PHP多线程pthreads使用例子

<?php
declare(ticks = 1);
$running = 1;
 
//信号处理函数
function sig_handler($signo)
{
  switch ($signo) {
  case SIGINT:
    finish();
    break;
  default:
    break;
  }
}
 
pcntl_signal(SIGINT, "sig_handler");
class test extends \Thread {
  public $url;
  public $result;
 
  public function __construct($url) {
    $this->url = $url;
  }
 
  public function run() {
    if ($this->url) {
      $this->result = model_http_curl_get($this->url);
    }
  }
}
function model_http_curl_get($url) {
  $curl = curl_init(); 
  curl_setopt($curl, CURLOPT_URL, $url); 
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
  curl_setopt($curl, CURLOPT_TIMEOUT, 5); 
  curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)'); 
  $result = curl_exec($curl); 
  curl_close($curl); 
  return $result; 
}
for ($i = 0; $i < 500; $i++) {
  $urls[] = 'http://www.baidu.com/s?wd='. rand(10000, 20000);
}
 
$pool = array();
for ($i=1;$i<=5;$i++) {
  $key = uniqid();
  $url = array_shift($urls);
  $pool[$key] = new test($url);
  $pool[$key]->start();
  echo "启动线程$key\n";
}
while ($urls && $running) {
  foreach ($pool as $key=>$worker) {
    if(! $worker->isRunning()){
      //unset($pool[$key]);
      echo "线程".$key."已结束\n";
      $url = array_shift($urls);
      $pool[$key] = new test($url);
      $pool[$key]->start();
      echo "启动线程$key\n";
    }
  }
  usleep(1000);
}
 
function finish() {
  global $running;
  global $pool;
  $running = 0;
  echo "接收到信号,等待运行中线程结束\n";
  foreach ($pool as $key=>$worker) {
    if ($pool[$key]->join()) {
      var_dump($pool[$key]->result);
    }
  }
}

时间: 2024-09-08 19:58:25

PHP多线程pthreads使用例子的相关文章

python中多线程的一个例子总是报错大家帮忙看看

问题描述 python中多线程的一个例子总是报错大家帮忙看看 解决方案 http://bbs.csdn.net/topics/390614709 解决方案二: ...找到原因了是t2里的args函数名没写对.............,还是谢谢各位了

php与python 线程池多线程爬虫的例子

php例子 <?php   class Connect extends Worker  //worker模式 {   public function __construct() {   }   public function getConnection() { if (!self::$ch) { self::$ch = curl_init(); curl_setopt(self::$ch, CURLOPT_TIMEOUT, 2); curl_setopt(self::$ch, CURLOPT_R

PHP多线程(pthreads)与自动加载BUG问题

近日用PHP处理约7k条网络数据,现有网络情况下,耗时通常一秒一条,跑完整个程序大约近两个小时. 由于跑一次数据的时间太长,因此计划通过多个线程实现并行处理,我们可以通过pthreads扩展来实现真正的多线程,而不是常见的fsockopen来"模拟".pthreads的官网介绍在这里:http://pthreads.org/ 需要注意的是,如果尝试用数组在线程间交换数据,你会失望的,因为php的数组本身不是线程安全的,正确的做法是继承Stackable类.一个简单的demo如下所示:

python多线程编程简单例子

我喜欢用代码来理解程序,而不是单单的教程 类 ThreadClass 继承自 threading.Thread,也正因为如此,您需要定义一个 run 方法,以此执行您在该线程中要运行的代码.在这个 run 方法中唯一要注意的是,self.getName()是一个用于确定该线程名称的方法.  代码如下 复制代码 #! /usr/bin/env python #coding=utf-8 import threading import datetime import time import rando

PHP多线程(pthreads)参数传递学习笔记

测试环境 OS: win7 64 PHP: 5.4.25 ts pthreads: 0.1.0 1.性能问题 2.PDO等某些类型不能serialize所以就不能传递到线程. 这两个问题是能通过其他凡是解决的,解决方法仁者见仁智者见智. 另外,可以通过传递匿名函数到线程中,但是有个bug,匿名函数不能赋值给线程中的属性,导致传递的匿名函数只能在线程的构造方法中才能使用(call_user_fun*系列函数调用). Thread属性定义一定要注意必须在构造方法中初始化,否则必定为null.__co

php curl_multi 多线程查询的例子

PHP自身没有多线程的,可以借助扩展实现.但是curl_multi* 函数实现了多线程访问网站数据的功能. 步骤总结如下: 第一步:调用curl_multi_init 第二步:循环调用curl_multi_add_handle 这一步需要注意的是,curl_multi_add_handle的第二个参数是由curl_init而来的子handle. 第三步:持续调用curl_multi_exec 第四步:根据需要循环调用curl_multi_getcontent获取结果 第五步:调用curl_mul

PHP使用CURL_MULTI实现多线程采集的例子_php实例

这两天有一客户定制了一个免登录发布模块,因为在模块中需要涉及到很多图片下载的问题,考虑到性能问题,所以特别写了一个CURL_MULTI远程采集网页的函数,以方便以后使用,估计以后都不会使用原来的单线程curl函数去foreach了,其性能对比很明显的.同样获取我的博客的十个不同网页,curl_multi:4.5246081352234,file_get_contents:33.001797914505,将近8倍的效率,可想而知,如果在附件更多的情况下,性能差异就越明显了,希望对您有所帮助! 复制

php pthreads多线程的安装与使用_php实例

安装Pthreads 基本上需要重新编译PHP,加上 --enable-maintainer-zts 参数,但是用这个文档很少:bug会很多很有很多意想不到的问题,生成环境上只能呵呵了,所以这个东西玩玩就算了,真正多线程还是用Python.C等等 一.安装 这里使用的是 php-7.0.2 ./configure \ --prefix=/usr/local/php7 \ --with-config-file-path=/etc \ --with-config-file-scan-dir=/etc

PHP 多线程扩展(正儿八经的线程)pthreads安装

环境CentOS 6.3 64bit,php 5.4.5   pthreads需要线程安全环境,   下载php的安装包,解压:     tar zxvf php-5.4.5.tar.gz//名字是不是这个我不确定,自己去下载   安装:   ./configure --enable-zts --prefix=/usr/local/php-zts   make   make install   结果就把线程安装版的php安装到了/usr/local/php-zts,目前我不了解开启线程安全到底会