首页 > 后端开发 > 正文

PHP支持多线程吗?

2024-08-03 05:12:56 | 我爱编程网

今天我爱编程网小编整理了PHP支持多线程吗?相关内容,希望能帮助到大家,一起来看下吧。

本文目录一览:

PHP支持多线程吗?

php怎样多线程操作

其实就PHP而言,可以用2种方式来做:
(1)在PHP里使用shell_exec的函数,以shell的方式,启动一个独立的PHP脚本执行。这种方式,其实相当于在Web服务器处理过程中,独立起了一个shell进程处理你的任务。这里,需要特别注意的是shell_exec的服务器安全,注意校验参数,小心避免被带入shell命令中。这个是比较容易实现的方式。
(2)使用PHP实现一个Server,监听一个端口,为Web端提供服务。这里的实现方式有很多,通常要配合扩展,例如原生的pthread(多线程),开源扩展swoole等等。

PHP支持多线程吗?

PHP支持多线程吗?

PHP语言本身是不支持多线程的。网上关于PHP模拟多线程的方法,都是利用了LINUX和APACHE等本身所具有的多线程能力。既然是模拟的,就不是真正的多线程,其实只是多进程。
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多线程教程?

我爱编程网(https://www.52biancheng.com)小编还为大家带来php多线程教程?的相关内容。

PHP+shell实现多线程的方法

先写个简单的php代码,这里为了让脚本执行时间更长,方便看效果,sleep一下,呵呵!先看下test.php的代码:ls

PHP代码:

for($i=0;$i<10;$i++){

echo$i;

sleep(10);

}

?>

在看下shell脚本的代码,非常简单

#!/bin/bash

foriin12345678910

do

/usr/bin/php-q/var/www/html/test.php&

done

注意到在请求php代码的那行有一个&符号吗,这个是关键,不加的话是不能进行多线程的,&表示讲服务推送到后台执行,因此,在shell的每次的循环中不必等php的代码全部执行完在请求下一个文件,而是同时进行的,这样就实现了多线程,下面运行下shell看下效果,这里你将看到10个test.php进程再跑,再利用linux的定时器,定时请求这个shell,在处理一些需要多线程的任务,例如,批量下载时,非常好用!

php中用WEB服务器实现多线程

假设我们现在运行的是a.php这个文件.但是我在程序中又请求WEB服务器运行另一个b.php,那么这两个文件将是同时执行的.(PS:一个链接请求发送之后,WEB服务器就会执行它,而不管客户端是否已经退出)

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

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

下面看一个例子: 我爱编程网

//a.php,b.php

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

functionrunThread()

{

$fp=fsockopen('localhost',80,$errno,$errmsg);

fputs($fp,\"GET/b.php?act=b\");//这里的第二个参数是p>

fclose($fp);

}

functiona()

{

$fp=fopen('result_a.log','w');

fputs($fp,'Setin'.Date('h:i:s',time()).(double)microtime().\"\");

fclose($fp);

}

functionb()

{

$fp=fopen('result_b.log','w');

fputs($fp,'Setin'.Date('h:i:s',time()).(double)microtime().\"\");

fclose($fp);

}

if(!isset($_GET['act']))$_GET['act']='a';

if($_GET['act']=='a')

{

runThread();

a();

}

elseif($_GET['act']=='b')b();

?>

--------------------------------------------------------------------------------

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

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

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

1.尽量不访问同一个资源.以避免冲突.但是可以同时像数据库操作.因为数据库是支持并发操作的.所以在多线程的PHP中不要向同一个文件中写入数据.如果必须要写的话,用别的方法进行同步..如调用flock对文件进行加锁等.或建立临时文件并在另外的线程中等待这个文件的消失while(file_exits('xxx'));这样就等于这个临时文件存在时,表示其实线程正在操作

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

2.尽量不要从runThread在执行fputs后取这个socket中读取数据.因为要实现多线程,需要的用非阻塞模式.即在像fgets这样的函数时立即返回..所以读写数据就会出问题.如果使用阻塞模式的话,程序就不算是多线程了.他要等上面的返回才执行下面的程序.所以如果需要交换数据最后利用外面文件或数据中完成.实在想要的话就用socket_set_nonblock($fp)来实现.

说了这么多,倒底这个有没有实际的意义呢?在什么时候需要这种用这种方法呢?

答案是肯定的.大家知道.在一个不断读取网络资源的应用中,网络的速度是瓶颈.如果采多这种形式就可以同时以多个线程对不同的页面进行读取.

本人做的一个能从8848、soaso这些商城网站搜索信息的程序。还有一个从阿里巴巴网站上读取商业信息和公司目录的程序也用到了此技术。因为这两个程序都是要不断的链接它们的服务器读取信息并保存到数据库。利用此技术正好消除了在等待响应时的瓶颈。

php模拟实现多线程的三种方法

PHP语言本身是不支持多线程的.总结了一下网上关于PHP模拟多线程的方法,总的来说,都是利用了PHP的好伙伴们本身所具有的多线程能力.PHP的好伙伴指的就是LINUX和APACHE啦,LAMP嘛.

另外,既然是模拟的,就不是真正的多线程.其实只是多进程.进程和线程是两个不同的概念.好了,以下方法都是从网上找来的.

1.利用LINUX操作系统

for($i=0;$i<10;$i++){

echo$i;

sleep(5);

}

?>

上面存成test.php,然后写一段SHELL代码

#!/bin/bash

foriin12345678910

do

php-qtest.php&

done

2.利用fork子进程(其实同样是利用LINUX操作系统)

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().\"$strn\";

exit();

//子进程进程代码段_End

}

}

if($bWaitFlag)

{

for($i=0;$i<$intNum;$i++){

pcntl_waitpid($pids[$i],$status,WUNTRACED);

echo\"wait$i->\".time().\"n\";

}

}

echo(\"Endn\");

?>

3.利用WEBSERVER,PHP不支持多线程,APACHE可是支持的,呵呵.

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

那么这两个文档将是同时执行的.(代码同上)

当然啦,也可以把需要多线程处理的部分交给JAVA去处理,然后在PHP里调用,哈哈.

system('javamultiThread.java');

?>

扩展资料:PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及PHP自创的语法。利于学习,使用广泛,主要适用于Web开发领域。

以上就是PHP支持多线程吗?全部内容,更多相关信息,敬请关注我爱编程网。更多相关文章关注我爱编程网:www.52biancheng.com

免责声明:文章内容来自网络,如有侵权请及时联系删除。
与“PHP支持多线程吗?”相关推荐
请问ios支持java吗
请问ios支持java吗

ios系统能不能装java能我是做java的我朋友做ios的他电脑装过,我帮他一起弄得jdk和tomcat建议使用独立环境的,也就是不配环境变量,而采用相对路径的方式配在tomcat/bin中,service.bat、shutdown.bat、startup.bat加入代码:setCATALINA_HOME=%~dp0\..\..\tomcat6tomcat的相对路径s

2024-04-03 02:03:43
php 如何支持zip
php 如何支持zip

php如何支持zip你查PHP手册里面的函数参考,PHP有一系列的函数实现ZIP操作,可以压缩和释放,例如:&lt;?php$zip=zip_open("/tmp/test2.zip");if($zip){while($zip_entry=zip_read($zip)){echo"Name:".zip_entry_name($zip_entry)."\n";ec

2024-07-21 19:23:34
华为鸿蒙系统支持的机型(华为1920x1200是多大屏?)
华为鸿蒙系统支持的机型(华为1920x1200是多大屏?)

华为鸿蒙系统支持的机型华为鸿蒙系统是华为公司自主研发的操作系统,经过多年的研发和测试,终于于2020年正式发布。鸿蒙系统不仅具备良好的性能和稳定性,还具有完全自主可控的特点。目前,该系统已支持了不少于2000个机型,为用户提供了更加多元化和个性化的操作体验。鸿蒙系统支持的机型包括华为旗下的多款智能手机、平板电脑、智能穿戴等,还包括一些外部品牌的设备,例如荣耀、惠普、海尔、长虹等。其中,

2024-03-26 19:26:47
如何php开启CURL支持
如何php开启CURL支持

如何php开启CURL支持在安装PHP网站时,可能会遇到需要开启curl_getinfo()函数支持的情况,否则网站安装会失败。经过多次尝试,我成功开启了curl_getinfo()功能,并整理了具体的开启步骤。首先,需要打开php.ini文件,该文件通常位于C盘的Windows目录下。打开php.ini文件后,在文件中查找extension=php_curl.dll,找到后,将

2025-01-19 07:35:30
哪些系统支持Python
哪些系统支持Python

学python用mac还是windows并没有说哪个系统比较好。python可以在windows、MacOS以及Linux系统都可以使用。windows端首先是习惯,无论是快捷键还是系统使用习惯都有先天性的优势。起码在一些日常的操作都可以很顺手方便的操作。但是要安装Python环境,也不难。直接百度搜索python下载就可以使用。MacOS、Linux端可

2024-02-22 01:43:23
如何让YouCompleteMe支持php补全
如何让YouCompleteMe支持php补全

如何让YouCompleteMe支持php补全ycm这里查不到php的completer,有这么几种措施:1.给YCM指定一个外部completer,也就是一个vim插件,比如phpcomplete:autocmdFileTypephpsetlocalomnifunc=phpcomplete#Complete类似地,你可以用javacomplete2等插件来补全java,jedi-v

2024-09-21 00:36:38
Python多线程是什么意思?
Python多线程是什么意思?

Python多线程是什么意思?简单地说就是作为可能是仅有的支持多线程的解释型语言(perl的多线程是残疾,PHP没有多线程),Python的多线程是有compromise的,在任意时间只有一个Python解释器在解释Pythonbytecode。UPDATE:如评论指出,Ruby也是有thread支持的,而且至少RubyMRI是有GIL的。如果你的代码是CPU密集型,多个线程的代码很

2024-09-05 22:44:18
php如何支持mb_strlen如何使用php
php如何支持mb_strlen如何使用php

php如何支持mb_strlen如何使用phpPHP字符串长度计算strlen()函数使用介绍strlen()函数和mb_strlen()函数在PHP中,函数strlen()返回字符串的长度。功能原型如下:复制代码代码如下:(同Internationalorganizations)国际组织strlen(字符串string_input);参数str

2024-08-09 02:27:18