精华内容
下载资源
问答
  • php多线程

    2011-12-28 17:15:39
    以下都是转载, 简单说下, php是不支持... 总结了一下网上关于PHP模拟多线程的方法, 总的来说, 都是利用了PHP的好伙伴们本身所具有的多线程能力. PHP的好伙伴指的就是LINUX和APACHE啦, LAMP嘛. 另外, 既然是

    http://zhidao.baidu.com/question/72879780.html


    以下都是转载, 简单说下, php是不支持多线程的。。。。
    
    
    PHP语言本身是不支持多线程的. 总结了一下网上关于PHP模拟多线程的方法, 总的来说, 都是利用了PHP的好伙伴们本身所具有的多线程能力. PHP的好伙伴指的就是LINUX和APACHE啦, LAMP嘛.
    
      另外, 既然是模拟的, 就不是真正的多线程. 其实只是多进程. 进程和线程是两个不同的概念. 好了, 以下方法都是从网上找来的.
    
      1. 利用LINUX操作系统
    
    <?php
    for ($i=0;$i<10;$i++) {
      echo $i;
      sleep(5);
    }
    ?>
    
      上面存成test.php, 然后写一段SHELL代码
    
    #!/bin/bash
    for i in 1 2 3 4 5 6 7 8 9 10
    do
      php -q test.php &
    done
    
      2. 利用fork子进程(其实同样是利用LINUX操作系统)
    
    <?php
    declare(ticks=1);
    $bWaitFlag = FALSE; /// 是否等待进程结束
    $intNum = 10;      /// 进程总数
    $pids = array();    /// 进程PID数组
    echo ("Startn");
    for($i = 0; $i < $intNum; $i++) {
     $pids[$i] = pcntl_fork();/// 产生子进程,而且从当前行之下开试运行代码,而且不继承父进程的数据信息
     if(!$pids[$i]) {
      // 子进程进程代码段_Start
      $str="";
      sleep(5+$i);
      for ($j=0;$j<$i;$j++) {$str.="*";}
      echo "$i -> " . time() . " $str n";
      exit();
      // 子进程进程代码段_End
     }
    }
    if ($bWaitFlag)
    {
     for($i = 0; $i < $intNum; $i++) {
      pcntl_waitpid($pids[$i], $status, WUNTRACED);
      echo "wait $i -> " . time() . "n";
     }
    }
    echo ("Endn");
    ?>
    
      3. 利用WEB SERVER, PHP不支持多线程, APACHE可是支持的, 呵呵.
    
      假设我们现在运行的是a.php这个文档. 但是我在程式中又请求WEB服务器运行另一个b.php
    
      那么这两个文档将是同时执行的.
    
    <?php
    function runThread()
    {
     $fp = fsockopen('localhost', 80, $errno, $errmsg);
     fputs($fp, "GET /a.php?act=brnrn");
     fclose($fp);
    }
    function a()
    {
     $fp = fopen('result_a.log', 'w');
     fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
     fclose($fp);
    }
    function b()
    {
     $fp = fopen('result_b.log', 'w');
     fputs($fp, 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "rn");
     fclose($fp);
    }
    if(!isset($_GET['act'])) $_GET['act'] = 'a';
    if($_GET['act'] == 'a')
    {
     runThread();
     a();
    }
    else if($_GET['act'] == 'b') b();
    ?>
    
      当然啦,也可以把需要多线程处理的部分交给JAVA去处理, 然后在PHP里调用, 哈哈.
    
    <?php
    system('java multiThread.java');
    ?>

    展开全文
  • PHP多线程的实现(PHP多线程类)

    千次阅读 2013-12-14 20:33:45
    PHP多线程的实现(PHP多线程类) 通过WEB服务器来实现PHP多线程功能。 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程。 但不管怎么...

    PHP多线程的实现(PHP多线程类)

    通过WEB服务器来实现PHP多线程功能。

    当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程。

    但不管怎么样,它还是能满足我们的一些需要的,在需要类似多线程的功能方面还是可以采用这个类。

    01./**
    02.* @title:      PHP多线程类(Thread)
    03.* @version:    1.0
    04.* @author:     phper.org.cn < web@phper.org.cn >
    05.* @published:  2010-11-2
    06.*
    07.* PHP多线程应用示例:
    08.*  require_once 'thread.class.php';
    09.*  $thread = new thread();
    10.*  $thread->addthread('action_log','a');
    11.*  $thread->addthread('action_log','b');
    12.*  $thread->addthread('action_log','c');
    13.*  $thread->runthread();
    14.
    15.*  function action_log($info) {
    16.*      $log = 'log/' . microtime() . '.log';
    17.*      $txt = $info . "\r\n\r\n" . 'Set in ' . Date('h:i:s', time()) . (double)microtime() . "\r\n";
    18.*      $fp = fopen($log, 'w');
    19.*      fwrite($fp, $txt);
    20.*      fclose($fp);
    21.*  }
    22.*/
    23.class thread {
    24. 
    25.var $hooks array();
    26.var $args array();
    27. 
    28.function thread() {
    29.}
    30. 
    31.function addthread($func)
    32.{
    33.$args array_slice(func_get_args(), 1);
    34.$this->hooks[] = $func;
    35.$this->args[] = $args;
    36.return true;
    37.}
    38. 
    39.function runthread()
    40.{
    41.if(isset($_GET['flag']))
    42.{
    43.$flag intval($_GET['flag']);
    44.}
    45.if($flag || $flag === 0)
    46.{
    47.call_user_func_array($this->hooks[$flag], $this->args[$flag]);
    48.}
    49.else
    50.{
    51.for($i = 0, $size count($this->hooks); $i $size$i++)
    52.{
    53.$fp=fsockopen($_SERVER['HTTP_HOST'],$_SERVER['SERVER_PORT']);
    54.if($fp)
    55.{
    56.$out "GET {$_SERVER['PHP_SELF']}?flag=$i HTTP/1.1\r\n";
    57.$out .= "Host: {$_SERVER['HTTP_HOST']}\r\n";
    58.$out .= "Connection: Close\r\n\r\n";
    59.fputs($fp,$out);
    60.fclose($fp);
    61.}
    62.}
    63.}
    64.}
    65.}

    使用方法:

    $thread = new thread();
    $thread->addthread('func1','info1');
    $thread->addthread('func2','info2');
    $thread->addthread('func3','info3');
    $thread->runthread();

    说明:

    addthread是添加线程函数,第一个参数是函数名,之后的参数(可选)为传递给指定函数的参数。

    runthread是执行线程的函数。

     

    相关文章:http://www.phper.org.cn/?post=113

    展开全文
  • php多线程-传入数据到线程中

    千次阅读 2019-05-21 13:32:43
    提到php多线程,网上的例子基本都是并发发起http请求,难道php多线程就只能干这个吗,搞笑。 于是,我写了一个使用多线程对100万个数的排序,在测试的过程中发现了几个问题,记录一下。 php多线程只有在实例化的时候...

    提到php多线程,网上的例子基本都是并发发起http请求,难道php多线程就只能干这个吗,搞笑。
    于是,我写了一个使用多线程对100万个数的排序,在测试的过程中发现了几个问题,记录一下。

    php多线程只有在实例化的时候有机会传入参数,于是,当我传入数组的时候,发现有点不对劲。

    class Test extends Thread{
    	public $data;
    	public $response;
    
    	public function __construct($fruit){
            var_dump($fruit);
    		$this->data = $fruit;
            var_dump($this->data);
    	}
    
    	public function run(){
            
    	}
    }
    
    
    $fruit = ['apple', 'balana', 'orange'];
    
    $p = new Test($fruit);
    $p->start();
    

    var_dump($p); // 为了查看线程是否还在,如果线程内有错误的话,线程就会被 destroy

    结果:

    array(3) {
      [0]=>
      string(5) "apple"
      [1]=>
      string(6) "balana"
      [2]=>
      string(6) "orange"
    }
    object(Volatile)#2 (3) {
      [0]=>
      string(5) "apple"
      [1]=>
      string(6) "balana"
      [2]=>
      string(6) "orange"
    }
    object(Test)#1 (2) {
      ["data"]=>
      object(Volatile)#2 (3) {
        [0]=>
        string(5) "apple"
        [1]=>
        string(6) "balana"
        [2]=>
        string(6) "orange"
      }
      ["response"]=>
      NULL
    }
    

    也就是说,在构造函数中,我传入数组,给属性赋值的时候,就变成了 Volatile 对象。
    关于 Volatile 对象,查看官方文档:https://php.net/manual/en/class.volatile.php

    2、修改run()方法

    public function run(){
    
        $this->response = $this->data;
    
    }
    

    结果:报错
    也就说,只有构造函数中初始化的属性才配用上 Volatile 对象 。。。。。。

    3、修改run()方法

    public function run(){
    
        $this->data= null;
    
    }
    

    结果:报错
    PHP Fatal error: Uncaught RuntimeException: Threaded members previously set
    to Threaded objects are immutable, cannot overwrite data

    也就说,构造函数中初始化的属性还不能改动它。。。。。。。。。

    4、修改run()方法

    public function run(){
    
        $this->response = (array)$this->data;
        var_dump($this->response);
    
    }
    

    结果:可行

    array(3) {
      [0]=>
      string(5) "apple"
      [1]=>
      string(6) "balana"
      [2]=>
      string(6) "orange"
    }
    object(Test)#1 (2) {
      ["data"]=>
      object(Volatile)#2 (3) {
        [0]=>
        string(5) "apple"
        [1]=>
        string(6) "balana"
        [2]=>
        string(6) "orange"
      }
      ["response"]=>
      array(3) {
        [0]=>
        string(5) "apple"
        [1]=>
        string(6) "balana"
        [2]=>
        string(6) "orange"
      }
    }
    

    对于 Volatile 对象 ,懒得去研究,直接转数组就可以操作了啊。

    5、修改run()方法

    public function run(){
        $data = (array)$this->data;
    
        $data[5] = 55;
    
        $this->response = $data;
    }
    

    结果:报错,线程已终止
    这就很无语了,莫名其妙嘛,于是尝试这 this&gt;response=(array)this-&gt;response = (array)data;
    尼玛,这样可以,呵呵,没搞懂。

    注意点:
    1.线程类的属性不能直接进行哈希表(数组)操作,如:

    //这样是无效的
    $this->var1["hello"] = "world"; 
    //改为
    $this->var1 = ["hello"=>"world"];
    

    因为线程类属性的赋值是通过序列化实现的,其本质是存储了序列化数据,因此不支持PHP常用直接操作哈希表(数组)的操作

    2.线程类的属性不能是“闭包函数”
    原因:闭包函数不能序列化;因此,如果想在线程里用“回调函数”的话,那就放弃线程吧;

    3.线程对象开辟了php的第二空间
    线程在创建之后,无法访问到父线程的变量,诸如$GLOBALS或global等用法都无法操作父线程的全局变量,这应该是考虑到了线程安全的问题;
    但是父线程却能够访问子线程对象的内容;

    4、传递数据库实例到线程里是无效的
    传递进来的对象是好的,就是却无法执行数据库操作。建议还是在线程里去实例化数据库连接吧。

    展开全文
  • 什么是php多线程

    千次阅读 2020-02-06 11:25:44
    PHP在默认的情况下是不支持多线程的,通过安装pthreads扩展,让其参数来指定编译PHP的线程安全方式来使其支持多线程,但是使用的过程中要考虑到线程安全的问题 线程是操作系统中进行运算调度的最小单位。它被包含在...

    PHP在默认的情况下是不支持多线程的,通过安装pthreads扩展,让其参数来指定编译PHP的线程安全方式来使其支持多线程,但是使用的过程中要考虑到线程安全的问题

    线程是操作系统中进行运算调度的最小单位。它被包含在进程中,是进程中的实际运作单位。今天将要分享的是线程知识是有关于PHP的,具有一定的参考价值,希望对大家有所帮助

     

    多线程的理解

    所谓多线程就是在在一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程大大提高了程序的执行效率,一个多线程比单线程被操作系统调度的概率更大。而且更高效。多个线程可以在多核CPU的多个核心同时运行,加快了运行效率。而且线程间的通信更加简单。

    PHP多线程

    在默认情况下PHP是不支持多线程的,要使用多线程需要安装 扩展,目前常用的扩展有pcnlt,POSIX ,pthreads,但是用的最多的还是pthreads扩展,它通过使用参数来指定来编译PHP时的线程安全方式,使其支持多线程

    在使用线程之前首先要考虑到线程的安全问题,线程安全指的是某个函数或函数库在多线程环境中被调用时,能够正确的处理多线程之间的共享变量,使得程序的功能能够正确完成

    例:

    在多线程中由于存在共享变量,很有可能会导致出现以下问题:

    存在一个全局数组:$arr = array('a');

    A 线程获取数组长度为1;

    B 线程获取数组长度为1;

    A 线程pop出数组元素 $a = array_pop($arr); $a = 'a';

    B 线程也pop数组元素 $b = array_pop($arr); $a = null;

    但是此时B线程内就出现了错误事件,虽设置了数组长度大于0,但是没有 pop值来

    PHP实现线程安全

    PHP实现线程安全主要通过 TSRM 机制,通过此机制可以对全局变量和静态变量进行隔离,并且给每个线程都复制了一份全局变量和静态变量。各个线程使用的都是主线程的一个备份。这样就避免了变量冲突,也不会发生线程安全的问题。

    PHP 对多线程的封装保证了线程安全,所以开发人员就不需要在考虑读写冲突的问题了,也使得代码更加安全。不过这样做也有不好的地方,例如当子线程开始运行时,主线程便再也无法对子线程运行细节进行调整了,失去了消息传递能力

     

    最后

    谢谢大家的阅读,原创不易,喜欢就点个赞,这将是我最强的写作动力。如果你觉得文章对你有所帮助,也蛮有趣的,就关注一下我的博客,谢谢。

    展开全文
  • PHP多线程模拟秒杀抢单

    千次阅读 2016-09-20 17:06:02
    应集团要求给服务号做了个抢单秒杀的功能,需要对秒杀做个测试,想试试 PHP 多线程,就模拟了下抢单功能。先说秒杀模块的思路:正常情况下的用户秒杀操作 1、发起秒杀请求 2、进入秒杀队列 3、随机滞后 1 - 2 秒进行...
  • PHP多线程读写文件操作

    千次阅读 2015-09-25 11:36:32
    PHP多线程读写文件处理
  • PHP多线程批量采集下载图片

    千次阅读 2012-08-08 09:54:40
    PHP多线程批量采集下载图片 博客分类: PHP     使用curl的多线程,另外curl可以设置请求时间,遇到很慢的url资源,可以果断的放弃,这样没有阻塞,另外有多线程请求,效率应该比较高,参考:...
  • PHP多线程编程

    万次阅读 2012-11-14 10:16:38
    PHP多线程编程(一)  虽然PHP 中,多线程用的比较的少。但是毕竟可能是会用到了。我最近就遇到这样一个问题,用户提交几百个url以后,要读出这个url 中的标题。 当然,你不希望用户等待的太久,10s 钟应该给出个...
  • 大家知道php是单线程脚本语言,但使用一些另类方法可以弥补这个缺陷,但是很多项目不是说php多线程就能解决问题,问题的起源还有其他的存在!sqlite的书写是这样的,线程是高并发的出去了,当我们悬崖勒马的时候再...
  • PHP 多线程的使用

    千次阅读 2018-01-28 10:46:02
    PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程多线程在处理重复性的循环任务,能够大大缩短程序执行时间。 PHP扩展下载:https://github.com/krakjoe/pthreads PHP手册文档:...
  • 为了代码的执行效率,开发中不免用到多线程编程。需要程序并行运行, php多线程也非常简单实用,以下是借助popen实现多线程
  • 这篇文章主要介绍了PHP使用Pthread实现的多线程操作的方法,以完整实例形式分析了php多线程的创建及使用相关技巧,需要的朋友可以参考下
  • 实现一个简单的 php 多线程

    千次阅读 2019-02-18 13:07:36
    PHP是不支持多线程的,可以使用php的flock加锁函数实现。 &lt;?php $fp = fopen("/tmp/lock.txt", "w+"); if (flock($fp, LOCK_EX)) { // 进行排它型锁定 fwrite($fp, "Write ...
  • php 多线程 pthreads扩展

    千次阅读 2015-12-15 09:48:48
    PHP 5.3 以上版本,使用pthreads PHP扩展,可以使PHP真正地支持多线程多线程在处理重复性的循环任务,能够大大缩短程序执行时间。 pthreads扩展需要php是以线程安全模式安装,而一般的linux下php是以非线程安全...
  • php 多线程pthreads官网翻译

    千次阅读 2017-04-18 17:38:34
    现在几乎所有的网站(含手机站)服务器都是多核的,如果不是CPU跟多核,PHP是无法提供更好的服务的。虽然PHP正在非常迅速的展示及表达你的想法,但是当我们想要通过成熟的语言或者框架,建设更加完善的网页应用...
  • 继续php多线程

    千次阅读 2011-04-12 17:01:00
      昨天找到了进程后台运行的方法,今天测试了一下,发现popen的速度很慢,要40-50毫秒,... 我写了段脚本test.php,用fsockopen循环连接本地另外一个脚本test1.php,不做任何操作立即关闭连接,test1
  • wamp安装pthreads扩展(PHP多线程

    千次阅读 2014-08-15 15:17:44
    最近项目需要采集大量信息,所以打算看下PHP多线程方面的文章,发现PHP已经有了多线程的扩展了,估计是新出来的东西,百度都没有这方面的资料,谷歌找到的资料也比较少,其中http://blog.s135.com/pthreads/这篇很...
  • PHP实现异步多线程的swoole扩展
  • 当然,对多线程有深入理解的人都知道通过WEB服务器实现的多线程只能模仿多线程的一些效果,并不是真正意义上的多线程。 但不管怎么样,它还是能满足我们的一些需要的,在需要类似多线程的功能方面还是可以采用这...
  • PHP多线程异步请求HTTP

    千次阅读 2018-03-06 15:58:22
    /** * 多线程请求链接 * 来自官方参考例程修改 * * @param array $urlArr * @author Xinwen Mao */ public static function curl_multi($urlArr) { // 创建批处理cURL句柄 $mh = curl...
  • php 多线程并发处理

    千次阅读 2017-08-29 14:57:31
    答案是都支持,也就是说PHP支持多线程的模型, 在多线程情况下通常要解决资源共享和隔离的问题。PHP本身是线程安全的。 具体来说是那种模型需要看使用的是哪个SAPI,比如说在Apache中,那么就可能使用多线程...
  • php 多线程 worker 类中的 collect方法

    千次阅读 2017-04-18 09:31:55
    <?php /** * Created by PhpStorm. * User: 27394 ...// Worker 线程:非指定,不自动结束 class Test extends Threaded{ // TODO } $worker = new Worker(); echo "当前任务栈中包含 {$worker->
  • Redis队列php多线程请求

    千次阅读 2015-01-10 15:41:39
    在数据采集的过程中,会有很次请求.每个请求要发送的信息无外乎都有一个关键的KEY,多数是ID. 把这个ID写入到一个栈里面 $redis->lpush("idlist",$id); 然后在PHP代码里面写一个死循环 public ...
  • PHP多线程扩展pthreads示例

    万次阅读 2016-11-29 19:27:25
    <?php class Request extends Thread { public $url; public $data; public function __construct($url) { $this->url = $url; } public function run() { // 线程处理一个耗时5秒的任务

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 112,419
精华内容 44,967
关键字:

php多线程