1.php多线程教程?
用PHP+shell实现多线程的方法
先写一个简单的php代码。在这里,为了让脚本执行的时间更长,方便看到效果,睡觉,呵呵!我们来看看test.php的代码:ls。
PHP代码:
for($ I = 0;$ i & lt10;$i++) {
echo $ I;
睡眠(10);
}
?
看看shell脚本的代码,非常简单。
#!/bin/bash
因为我在1 2 3 4 5 6 7 8 9 10年
做
/usr/bin/PHP-q/var/www/html/test . PHP & amp;
完成的
注意这里有一个&;符号?这是关键。没有它,多线程是不可能的。&;意味着服务被推到后台执行。因此,在shell的每一个周期中,不需要等待php代码完全执行后再请求下一个文件,而是同时进行,从而实现多线程。让我们运行shell来看看效果。在这里,您将看到10个test.php进程再次运行,然后使用linux计时器定期请求shell。在处理一些需要多线程的任务时非常有用,比如批量下载!
在php中用WEB服务器实现多线程
假设我们正在运行文件a.php。但是我请求WEB服务器在程序中运行另一个b.php,那么这两个文件将同时执行。(PS:链接请求发出后,不管客户端是否退出,WEB服务器都会执行)。
有时候,我们要运行的不是另一个文件,而是这个文件中的部分代码。我们做什么呢
事实上,参数可以用来控制a.php运行哪个程序。
让我们看一个例子:
//a.php,b.php
PHP代码:-。
函数runThread()
{
$fp = fsockopen('localhost ',80,$errno,$ errmsg);
fputs($fp," GET /b.php?act = b \ \ \ \ ";//这里的第二个参数是HTTP协议中指定的请求头。
//不明白的请看RFC里的定义。
fclose($ FP);
}
函数a()
{
$fp = fopen('result_a.log ',' w ');
fputs($fp,'设置在'。日期(' h:i:s ',时间())。(双)微时间()。"\");
fclose($ FP);
}
功能b()
{
$fp = fopen('result_b.log ',' w ');
fputs($fp,'设置在'。日期(' h:i:s ',时间())。(双)微时间()。"\");
fclose($ FP);
}
如果(!isset($ _ GET[' act '])$ _ GET[' act ']= ' a ';
if($ _ GET[' act ']= ' a ')
蓝狮注册{
runThread();
a();
}
else if($ _ GET[' act ']= ' b ')b();
?
-
打开result_a.log和result_b.log,比较两个文件的访问时间。你会发现这两个文件确实是在不同的线程中运行的。有些时候完全一样。
以上只是一个简单的例子,你可以改进成其他形式。
既然PHP也可以多线程,那么问题来了,就是同步。我们知道PHP本身不支持多线程,所以不会有Java那样的同步方法。那么我们该怎么办呢?
1.尽量不要访问同一个资源,以避免冲突。但是你可以同时像数据库一样操作。因为数据库支持并发操作,所以不要在多线程PHP中把数据写到同一个文件。如果你必须写,使用其他方法来同步...比如调用flock锁定文件,或者创建一个临时文件等待这个文件在另一个线程中消失while(file_exits('xxx '))。这意味着当这个临时文件存在时,就意味着线程实际上正在运行。
如果这个文件丢失了,就意味着其他线程已经释放了它。
2.尽量不要从runThread在执行fputs后获取的这个套接字中读取数据。因为要实现多线程,就需要使用非阻塞模式,也就是在执行fgets这样的函数时立即返回。所以读写数据会有问题。如果使用阻塞模式,程序就不是多线程的。他将在执行下面的程序之前等待上面的返回。因此,如果需要交换数据,将在外部文件或数据中完成。如果真的需要,就用socket_set_nonblock($fp)来实现。
说了这么多,这里面有什么实际意义吗?什么时候需要这种方法?
答案是肯定的。众所周知,在一个不断读取网络资源的应用中,网速是瓶颈。如果采用这种形式,不同的页面可以被多个线程同时读取。
我做了一个程序,可以从8848和soaso搜索信息。另一个从阿里巴巴网站读取商业信息和公司目录的程序也使用了这项技术。因为这两个程序都在不断链接自己的服务器读取信息并保存到数据库中。使用这项技术正好消除了等待响应时的瓶颈。
php模拟实现多线程的三种方法
PHP语言本身不支持多线程。总结了在互联网上模拟PHP多线程的方法。总的来说,都是利用了PHP的好伙伴的多线程能力。PHP的好伙伴指LINUX和APACHE,LAMP。
另外,既然是模拟的,就不是真正的多线程。其实只是多流程。进程和线程是两个不同的概念。嗯,下面这些方法都是网上找的。
1.使用LINUX操作系统
for($ I = 0;$ i & lt10;$i++) {
echo $ I;
睡眠(5);
}
?
将其保存为test.php,并编写一段SHELL代码。
#!/bin/bash
因为我在1 2 3 4 5 6 7 8 9 10年
做
test.php & amp;
完成的
2.使用fork子流程(实际上,它也使用LINUX操作系统)
declare(ticks = 1);
$ bWaitFlag = FALSE///等待进程结束?
$ intNum = 10///进程总数
$ pids = array();///进程PID数组
echo(" Startn ");
for($ I = 0;$ i & lt$ intNum$i++) {
$ pids[$ I]= pcntl _ fork();///生成子进程,从当前行开始运行代码,不继承父进程的数据信息。
如果(!$pids[$i]) {
//子流程代码段_Start
$ str =
睡眠(5+$ I);
for($ j = 0;$ j & lt$ I;$j++) {$str。="*";}
回显“$i -”。时间()。”$ strn”;
exit();
//子流程代码段_End
}
}
if ($bWaitFlag)
{
for($ I = 0;$ i & lt$ intNum$i++) {
pcntl_waitpid($pids[$i],$status,wun traced);
echo“等等$i -”。时间()。”n”;
}
}
echo(" Endn ");
?
3.使用WEB服务器,PHP不支持多线程,APACHE支持,呵呵。
假设我们正在运行文档a.php。但是我要求网络服务器在程序中运行另一个b.php。
那么这两个文件将同时执行。(代码同上)
当然也可以把需要多线程的部分交给JAVA然后在PHP中调用,哈哈。
system('java多线程. java
?
扩展资料:PHP,即“超文本预处理器”,是一种通用的开源脚本语言。PHP是一种在服务器端执行的脚本语言,类似于C语言,是一种常用的网站编程语言。PHP的独特语法是C、Java、Perl和PHP自身语法的混合。有利于学习,应用广泛,主要适用于Web开发领域。
2.php后端开发主要要学什么?
后端开发需要学习。
1、数据库相关知识,如MySQL、Oracle、SQL Server等。;
2.编程语言,如Java、C#、Python、PHP等。
3.Web服务器技术,如Apache、IIS、Tomcat等。
4.Linux系统;
5、网络安全相关知识,如防火墙、DDOS攻击等。;
6.版本控制系统SVN、Git等。
发表评论