叨教,PHP 能不能利用多线程?如果能,怎么实现的?
本文就带你打开这个疑问。
这个问题的答案是肯定的,PHP 可以利用多线程。我们借助于 pthreads 实现:

该项目供应了与基于Posix Threads的PHP兼容的多线程。
有啥亮点没?下面这些全是:
一个易于利用,快速学习的面向工具的PHP 7.2线程API实行所有预定义和用户声明的方法和函数,包括闭包。包括现成的同步无限的可能性...须要一些扩展的根本的支持,PHP 7.2 及以上版本,ZTS Enabled ( Thread Safety ),Posix Threads Implementation。
还有一些把稳事变:
pthreads是一个面向工具的API,它供应了PHP中多线程所需的所有工具。 PHP运用程序可以创建,读取,写入,实行并与线程,赞助工具和线程工具同步。
警告:pthreads扩展名不能在Web做事器环境中利用。 因此,PHP中的线程应仅保留给基于CLI的运用程序利用。
命令行运用脚本完备适用,这也与我们编写 Bash,Python等等类似。下面举一个例子:
然后实行一次:
再实行一次:
实际利用
上面的代码是个示例性子的运用,仅仅是为了展示多线程运行。下面来一段业务代码。
该类仿照一个url要求。由于网络问题,有可能失落败,或者不愿定返回韶光,以是适宜并行。接着我们利用该类进行多网络要求并发。为了减轻系统负荷,利用微秒延时。
$t = microtime(true);$g = new AsyncWebRequest(sprintf("http://www.google.com/?q=%s", rand() 10));
实例化之后,我们发起要求:
if ($g->start()) { printf("Request took %f seconds to start ", microtime(true) - $t); while ( $g->isRunning() ) { echo "."; usleep(100); } if ($g->join()) { printf(" and %f seconds to finish receiving %d bytes\n", microtime(true) - $t, strlen($g->data)); } else printf(" and %f seconds to finish, request failed\n", microtime(true) - $t);}
其他方案如果不用 pthreads 库供应的能力,该怎么写并行的多任务呢?实在 PHP 供应了一个 popen 函数,用于打开进程文件指针。
popen 返回一个和 fopen 所返回的相同的文件指针,只不过它是单向的(只能用于读或写)并且必须用 pclose 来关闭。此指针可以用于 fgets,fgetss 和 fwrite。 当模式为 'r',返回的文件指针即是命令的 STDOUT,当模式为 'w',返回的文件指针即是命令的 STDIN。
直接上代码:
for ($i=0; $i<10; $i++) { // 打开10个进程 for ($j=0; $j<10; $j++) { $pipe[$j] = popen('script2.php', 'w'); } // 等待完成 for ($j=0; $j<10; ++$j) { pclose($pipe[$j]); }}
大家看到了实现的方法与 pthreads 完备不同,这段代码仍旧是壅塞运行,只不过同时打开10个进程,并走运行。
并行与多线程完备不同。不过,可视作一个大略的办理方案吧。
写在末了经由上述两种实现方法,大家该当对付多线程,多进程,并行这些观点有一些认识了。
Happy coding :_)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。