php多线程(php多线程教程)
一、python会取代php吗
先给个人意见,Python不会取代PHP,至少我认为Go作为后端语言更可能取代PHP。
PHP最重要是作为后端优秀框架的编程语言而存在,那我们到底要学习哪个后端框架?有这么多新的编程语言提供了如此多的功能、库和框架,如何真正决定要学习哪种Web框架?我们将尝试比较两种最受欢迎的后端编程语言——Python和PHP。
在进行比较之前,让我们首先列出比较点,这将大大影响我们对Web框架的选择:
易于学习:这可以说是决定使用哪种Web框架的最重要参数之一。如果编程语言很难学习,那么花时间在上面就没有意义了。今天,出于所有实际目的,开发人员时间比执行时间更重要。社区支持:让我们面对现实吧-我们所有人都在bug方面挣扎,我们在编写程序时都遇到问题,我们都在StackOverflow和其他论坛上在线寻求支持。如果特定的编程语言不为人所知,并且几乎没有社区支持,那么最好不要使用它。文档:就像社区支持一样,至关重要的是,编程语言/框架必须有足够的文档供开发人员学习和理解细微差别。库支持:如果广泛使用编程语言,将会有更多的开发人员为特定语言开发库。结果,开发变得更加容易。速度:服务器端应用程序可能需要高容错能力和低延迟。因此,重要的是要查看哪种语言在执行时间上更快。调试:编程语言的选择还应取决于该语言可用的可用调试工具。缺少良好的调试工具意味着开发人员将花费更多的时间进行调试,这实际上并不是最有效地利用时间。PHP与Python各项比较毫无疑问,Python更容易学习。Python是一种通用的编程语言,可以很快被使用。实际上,Python非常容易上手,以至于大多数初学者的编程课程现在都使用Python编程语言来教授编程的基础知识。与其他编程语言相比,Python程序更短,更易于编写,因此,它已成为许多应用程序的首选。与用其他编程语言编写的相同代码相比,语法简单得多,并且代码极易读。
另一方面,PHP并不是要成为通用语言。它是专门为Web应用程序设计的,该Web应用程序肯定比简单的独立程序复杂得多。结果,与学习Python相比,学习PHP花费了更多时间。
对于社区支持而言,Python和PHP都具有出色的社区支持。PHP进入市场已经有一段时间了,特别是对于开发Web应用程序。所以有一个庞大的PHP开发人员社区随时准备提供支持。
Python社区支持非常出色,这很明显可以看得出来,如机器学习框架Tensorflow,Web框架Django、flask等,从这个角度看Python和PHP没有一个是明显的赢家。
PHP5.x版本的运行速度很慢,需要花费大量时间。但是,新版本的PHP7.x极其快速,几乎比典型的Python程序快3倍。在性能关键型应用程序中,速度通常成为重要因素。例如,在每天获得一百万次点击的核心银行系统中,延迟3次可能会对整体系统性能产生重大影响。因此,谈论速度,PHP远远胜过Python。
但是,必须注意的是,对于大多数简单的应用程序,规模很小,因此没有太多明显的时间滞后。例如,出于所有实际目的,假设应用程序对延迟不是至关重要的,则10毫秒与30毫秒相差无几。
而Python提供了一个功能强大的调试器,称为PDB(Python调试器)。PDB有据可查,易于使用,即使对于初学者也是如此。另一方面,PHP提供XDebug包进行调试。PDB和XDebug都提供了最常用的调试功能-断点,堆栈,路径映射等。Python和PHP两者从这个角度看其实都很相似。
总体而言,如果你选择后端语言,可能Go是未来更好的选择,毕竟速度和生态摆在那里,如果想学得更多,可以兼顾学习Python,因为Python目前生态环境很好,无论是日常快速开发还是机器学习工程都很不错。
二、nodejs与php性能比较
在性能方面,Nodejs显然赢了这一局。由于Nodejs遵循事件驱动的非阻塞I/O模型,与传统的后端技术相比,Nodejs能够处理大量的服务器请求。
PHP遵循一个阻塞模型,其中在服务器端创建多个线程来处理多个客户端请求,如果代码没有被优化,它会导致高服务器负载和响应时间。
三、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\r\n\r\n");//这里的第二个参数是HTTP协议中规定的请求头
//不明白的请看RFC中的定义
fclose($fp);
}
functiona()
{
$fp=fopen('result_a.log','w');
fputs($fp,'Setin'.Date('h:i:s',time()).(double)microtime()."\r\n");
fclose($fp);
}
functionb()
{
$fp=fopen('result_b.log','w');
fputs($fp,'Setin'.Date('h:i:s',time()).(double)microtime()."\r\n");
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开发领域。