是否有一种现实的方法可以在PHP中实现多线程模型,无论是真实的还是模拟的。很久以前,有人建议您可以强制操作系统加载PHP可执行文件的另一个实例,并处理其他同步进程
问题是,当PHP代码完成执行时,PHP实例仍保留在内存中,因为无法从PHP内部杀死它。所以,如果你在模拟几个线程,你可以想象会发生什么。因此,我仍然在寻找一种可以在PHP中有效地完成或模拟多线程的方法。有什么想法吗
多线程在php中是可能的
是的,您可以使用pthreads在PHP中执行多线程
从PHP文档中:
pthreads是一个面向对象的API,它提供了PHP中多线程所需的所有工具。PHP应用程序可以创建、读取、写入、执行和同步线程、工作线程和线程对象
警告:
不能在web服务器环境中使用pthreads扩展。因此,PHP中的线程应该仅限于基于CLI的应用程序
简单测试
#/usr/bin/php
<;?php
类异步操作扩展线程{
公共函数构造($arg){
$this->;arg=$arg;
}
公共功能运行(){
如果($this->;arg){
$sleep=mt_rand(1,10);
printf(“%s:%s-start-sleeps%d”。“\n”、日期(“g:i:sa”)、$this->;arg、$sleep);
睡眠($睡眠);
printf(“%s:%s-finish.”“\n”、日期(“g:i:sa”)、$this->;arg);
}
}
}
//创建一个数组
$stack=array();
//启动多线程
foreach(范围(“A”、“D”)为$i){
$stack[]=新的异步操作($i);
}
//启动线程
foreach($t){
$t->;开始();
}
?>;
首轮
12:00:06pm:A-启动-睡眠5
下午12:00:06:B-启动-睡眠3
下午12:00:06:C-启动-睡眠10
12:00:06pm:D-启动-睡眠2
下午12:00:08:D-结束
12:00:09pm:B-结束
下午12:00:11:A-结束
下午12:00:16:C-结束
第二轮
12:01:36pm:A-启动-睡眠6
下午12:01:36:B-启动-睡眠1
下午12:01:36:C-启动-睡眠2
下午12:01:36:D-启动-睡眠1
下午12:01:37:B-结束
下午12:01:37:D-结束
下午12:01:38:C-结束
下午12:01:42:A-结束
真实世界示例
错误报告(E\u ALL);
类AsyncWebRequest扩展线程{
公共$url;
公共数据;
公共函数构造($url){
$this->;url=$url;
}
公共功能运行(){
如果($url=$this->;url)){
/*
*如果请求了大量数据,您可能希望
*fsock在读取之间使用usleep打开并读取
*/
$this->;data=file\u get\u contents($url);
}否则
printf(“Thread#%lu未提供URL\n”,$this->;getThreadId());
}
}
$t=微时间(真);
$g=新的AsyncWebRequest(sprintf(“http://www.google.com/?q=%s“,rand()*10”);
/*开始同步*/
如果($g->;start()){
printf(“启动请求花费了%f秒”,微时间(真)-$t);
而($g->;isRunning()){
“回声”;
usleep(100);
}
如果($g->;join()){
printf(“和%f秒以完成接收%d字节\n”,微时间(真)-$t,strlen($g->;数据));
}否则
printf(“还有%f秒完成,请求失败,\n”,微时间(真)-$t);
}