本文目录一览:
用php怎样做多线程的方法
php(做为现在的主流开发语言)中实现多线程? 看到这个标题, 你一定以为我疯了..但是事实上我真的这么做了.
下面是我的一些做法, 已经实验过. 确实可以的.
我们知道php(做为现在的主流开发语言)本身是不支持多线程的, 但是我们的WEB服务器是支持多线程的.
也就是说可以同时让多人一起访问. 这也是我在php(做为现在的主流开发语言)中实现多线程的基础.
假设我们现在运行的是a.php(做为现在的主流开发语言)这个文件. 但是我在程序中又请求WEB服务器运行另一个b.php(做为现在的主流开发语言)
那么这两个文件将是同时执行的.
(PS: 一个链接请求发送之后, WEB服务器就会执行它, 而不管客户端是否已经退出)
有些时候, 我们想运行的不是另一个文件, 而是本文件中的一部分代码.该怎么办呢?
其实可是通过参数来控制a.php(做为现在的主流开发语言)来运行哪一段程序.
下面看一个例子:
//a.php(做为现在的主流开发语言)
php(做为现在的主流开发语言)代码:--------------------------------------------------------------------------------
?php(做为现在的主流开发语言)
function runThread()
{
$fp = fsockopen(localhost, 80, $errno, $errmsg);
fputs($fp, "GET /a.php(做为现在的主流开发语言)?act=b "); //这里的第二个参数是HTTP协议中规定的请求头
//不明白的请看RFC中的定义
fclose($fp);
}
function a()
{
$fp = fopen(result_a.log, w);
fputs($fp, Set in . Date(h:i:s, time()) . (double)microtime() . " ");
fclose($fp);
}
function b()
{
$fp = fopen(result_b.log, w);
fputs($fp, Set in . Date(h:i:s, time()) . (double)microtime() . " ");
php中怎么实现多线程
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中的(伪)多线程与多进程?
利用WEB服务器本身的多线程来处理,从WEB服务器多次调用我们需要实现多线程的程序。
PHP中也能多线程了,那么问题也来了,那就是同步的问题。曲靖电脑培训知道PHP本身是不支持多线程的,所以更不会有什么像Java中synchronize的方法了。那我们该如何做呢?
1.尽量不访问同一个资源。以避免冲突。但是可以同时像数据库操作。因为数据库是支持并发操作的。所以在多线程的PHP中不要向同一个文件中写入数据。如果必须要写的话,用别的方法进行同步。如调用flock对文件进行加锁等。或建立临时文件,并在另外的线程中等待这个文件的消失while(file_exits('xxx'));这样就等于这个临时文件存在时,表示其实线程正在操作。如果没有了这个文件,说明其它线程已经释放了这个。
2.尽量不要从runThread在执行fputs后取这个socket中读取数据。因为要实现多线程,需要的用非阻塞模式。即在像fgets这样的函数时立即返回。。所以读写数据就会出问题。如果使用阻塞模式的话,程序就不算是多线程了。他要等上面的返回才执行下面的程序。所以如果需要交换数据最后利用外面文件或数据中完成。实在想要的话就用socket_set_nonblock($fp)来实现。
说了这么多,倒底这个有没有实际的意义呢?在什么时候需要这种用这种方法呢?
答案是肯定的。大家知道。在一个不断读取网络资源的应用中,网络的速度是瓶颈。如果采多这种形式就可以同时以多个线程对不同的页面进行读取。
PHP使用Pthread实现的多线程操作实例
本文实例讲述了PHP使用Pthread实现的多线程操作。分享给大家供大家参考,具体如下:
?php
class
vote
extends
Thread
{
public
$res
=
'';
public
$url
=
array();
public
$name
=
'';
public
$runing
=
false;
public
$lc
=
false;
public
function
__construct($name)
{
$this-res
=
'暂无,第一次运行.';
$this-param
=
0;
$this-lurl
=
0;
$this-name
=
$name;
$this-runing
=
true;
$this-lc
=
false;
}
public
function
run()
{
while
($this-runing)
{
if
($this-param
!=
0)
{
$nt
=
rand(1,
10);
echo
"线程[{$this-name}]收到任务参数::{$this-param},需要{$nt}秒处理数据.\n";
$this-res
=
rand(100,
999);
sleep($nt);
$this-lurl
=
$this-param;
$this-param
=
'';
}
else
{
echo
"线程[{$this-name}]等待任务..\n";
}
sleep(1);
}
}
}
//这里创建线程池.
$pool[]
=
new
vote('a');
$pool[]
=
new
vote('b');
$pool[]
=
new
vote('c');
//启动所有线程,使其处于工作状态
foreach
($pool
as
$w)
{
$w-start();
}
//派发任务给线程
for
($i
=
1;
$i
10;
$i++)
{
$worker_content
=
rand(10,
99);
while
(true)
{
foreach
($pool
as
$worker)
{
//参数为空则说明线程空闲
if
($worker-param=='')
{
$worker-param
=
$worker_content;
echo
"[{$worker-name}]线程空闲,放入参数{$worker_content},上次参数[{$worker-lurl}]结果[{$worker-res}].\n";
break
2;
}
}
sleep(1);
}
}
echo
"所有线程派发完毕,等待执行完成.\n";
//等待所有线程运行结束
while
(count($pool))
{
//遍历检查线程组运行结束
foreach
($pool
as
$key
=
$threads)
{
if
($worker-param=='')
{
echo
"[{$threads-name}]线程空闲,上次参数[{$threads-lurl}]结果[{$threads-res}].\n";
echo
"[{$threads-name}]线程运行完成,退出.\n";
//设置结束标志
$threads-runing
=
false;
unset($pool[$key]);
}
}
echo
"等待中...\n";
sleep(1);
}
echo
"所有线程执行完毕.\n";
希望本文所述对大家php程序设计有所帮助。