浅析php中实现多线程

2016-01-29 13:38 22 1 收藏

浅析php中实现多线程,浅析php中实现多线程

【 tulaoshi.com - PHP 】

PHP中实现多线程? 看到这个标题, 你一定以为我疯了..但是事实上我真的这么做了.

下面是我的一些做法, 已经实验过. 确实可以的.

我们知道PHP本身是不支持多线程的, 但是我们的WEB服务器是支持多线程的.

也就是说可以同时让多人一起访问. 这也是我在PHP中实现多线程的基础.

假设我们现在运行的是a.php这个文件. 但是我在程序中又请求WEB服务器运行另一个b.php

那么这两个文件将是同时执行的.

(PS: 一个链接请求发送之后, WEB服务器就会执行它, 而不管客户端是否已经退出)

有些时候, 我们想运行的不是另一个文件, 而是本文件中的一部分代码.该怎么办呢?

其实可是通过参数来控制a.php来运行哪一段程序.

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/php/)

下面看一个例子:

//a.php

PHP代码:--------------------------------------------------------------------------------

<?php
    function runThread()
    {
        $fp = fsockopen('localhost', 80, $errno, $errmsg);
        
        fputs($fp, "GET /a.php?act=brnrn");        //这里的第二个参数是HTTP协议中规定的请求头
                                //不明白的请看RFC中的定义
        
        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();
?
--------------------------------------------------------------------------------

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/php/)


打开result_a.log 和 result_b.log 比较一下两个文件的中访问的时间. 大家会发现, 这两个的确是在不同线程中运行的.
有些时间完全一样.

上面只是一个简单的例子, 大家可以改进成其它形式.


既然PHP中也能多线程了, 那么问题也来了, 那就是同步的问题. 我们知道 PHP本身是不支持多线程的. 所以更不会有什么像

Java 中synchronize的方法了. 那我们该如何做呢.

1. 尽量不访问同一个资源. 以避免冲突. 但是可以同时像数据库操作. 因为数据库是支持并发操作的. 所以在多线程的PHP中

不要向同一个文件中写入数据. 如果必须要写的话, 用别的方法进行同步.. 如调用 flock对文件进行加锁等. 或建立临时文件

并在另外的线程中等待这个文件的消失 while(file_exits('xxx')); 这样就等于这个临时文件存在时, 表示其实线程正在操作

如果没有了这个文件, 说明其它线程已经释放了这个.

2. 尽量不要从runThread在执行fputs后取这个socket中读取数据. 因为要实现多线程, 需要的用非阻塞模式. 即在像fgets这

样的函数时立即返回.. 所以读写数据就会出问题. 如果使用阻塞模式的话, 程序就不算是多线程了. 他要等上面的返回才执行

下面的程序. 所以如果需要交换数据最后利用外面文件或数据中完成

来源:http://www.tulaoshi.com/n/20160129/1490899.html

延伸阅读
多线程是Java语言的一大特性,多线程就是同时存在N个执行体,按几条不同的执行线索共同工作的情况。程序,进程,线程,可以从不同的角度去理解。 !-- frame contents -- !-- /frame contents -- 程序就是一段静态的代码,可以理解成一组计算机命令的集合.进行就是这个程序一次动态的执行过程,从代码的加载到执行完毕的一个过...
标签: Java JAVA基础
使用 Java 编程语言实现线程 Java编程语言使多线程如此简单有效,以致于某些程序员说它实际上是自然的。尽管在 Java 中使用线程比在其他语言中要容易得多,仍然有恍└拍钚枰莆铡R亲〉囊患匾氖虑槭?main() 函数也是一个线程,并可用来做有用的工作。程序员只有在需要多个线程时才需要创建新的线程。 Thre...
标签: Web开发
注:以下内容基于IE中GIF的onload事件的基础上,故所有测试IE only 需要用到的几个图片 先看一个简单的事实: 代码如下: SCRIPT LANGUAGE="JavaScript" var img=new Image(); img.src="attachment/1178365293_0.gif"; img.onload=function() { alert("如要关闭请按住ESC键不放,并点击关闭按钮"); } /SCRIPT 如果不出所料...
多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径。 在系统级别内,程序并排执行,程序分配到每个程序的执行时间是基于该程序的所需时间和其他程序的所需时间来决定的。 然而,在每个程序内部,存在一个或者多个执行线程,它同时或在一个几乎同时发生的方式里执行不同的任务。 概要提示: iPhone中的线程应用并不是无...
ftp下载的好处我在这里就不多说了,许多工程会把ftp下载作为一个重要的功能来实现。微软提供的WinInet类可以利用下面这些函数: InternetOpen; InternetConnect; GetCurrentDirectory; SetCurrentDirectory; FtpGetFile; 很容易实现ftp的下载,网上关于这方面的文章也很多。但是要实现ftp的多线程下载,利...

经验教程

297

收藏

58
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部